рдПрдХ рд╕реБрдВрджрд░ рд╡рд╕рдВрдд рдЫреБрдЯреНрдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкрд░ рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рдмрдзрд╛рдИ рдХреИрд╕реЗ рджреЗрдВ? рдЗрд╕ рд╕рд╛рд▓ рдореИрдВ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХрд┐рд╕реА рддрд░рд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЙрдкрд╣рд╛рд░реЛрдВ рдФрд░ рдлреВрд▓реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдиреНрд╣реЗрдВ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рддрд╛ рдерд╛ред рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢ рдмрд╛рд░ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдпрд╛, рдЬрд┐рд╕реЗ рдПрдХ рджрд┐рди рдореЗрдВ
рдкрд╛рдпрдерди рдФрд░
рдкрд┐рд░рд╛рдорд┐рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдмрдзрд╛рдИ рдХреЗ рд▓рд┐рдП "рд╡рд┐рд╢ рдмрд╛рд░" рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдХреЛрдИ рдкрд┐рд░рд╛рдорд┐рдб рдХреА рдЦреЛрдЬ рдХрд░реЗрдЧрд╛, рдЬреЛ рдПрдХ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ рдЬреЛ рдЫреЛрдЯреА рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЖрдк рдмрд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП
GitHub рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдмрдпрд╛рди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддреИрдирд╛рддреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреА рдЧрдИ рд╣реИрдВ, рдЬреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдкрд┐рд░рд╛рдорд┐рдб рдореЗрдВ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдХреЗ рдХреБрдЫ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд▓реЗрдЦ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд┐рд░рд╛рдорд┐рдб рдЧрд╛рдЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рдорд╣рд┐рд▓рд╛ рджрд┐рд╡рд╕ рд╕реЗ рдПрдХ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдорд╛рд░реНрдЪ рдореЗрдВ, рд╣рдорд╛рд░реА рдЯреАрдо рдХрд╛ рдкреБрд░реБрд╖ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рдмреИрдардХ рдХрдХреНрд╖ рдореЗрдВ рдПрдХ рдХрдард┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрдЯреНрдард╛ рд╣реБрдЖ - рдХреИрд╕реЗ рд╣рдорд╛рд░реА рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕реБрдВрджрд░ рд╡рд╕рдВрдд рдЫреБрдЯреНрдЯреА рдкрд░ рдмрдзрд╛рдИ рджреА рдЬрд╛рдПред рдЪрд░реНрдЪрд╛ рдХреЗ рджреМрд░рд╛рди, рдПрдХ рд╕рд░рд▓ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рдкреИрджрд╛ рд╣реБрдЖ - рдЗрд╕ рдЫреБрдЯреНрдЯреА рдкрд░ рдЙрдирдХреА рд╕рднреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░ рдЕрдЧрд░ рд╕рднреА рдирд╣реАрдВ (рдФрд░ рд╣рдордиреЗ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдЕрдкрдиреА рддрд╛рдХрдд рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рд╣реИ), рддреЛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╕рдмрд╕реЗ рд╕рд░рд▓ред рддреЛ "рдЗрдЪреНрдЫрд╛рдУрдВ рдХреА рдкрдЯреНрдЯреА" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рджрд┐рдЦрд╛рдИ рджреАред
"рд╡рд┐рд╢ рдмрд╛рд░" - рдПрдХ рдЖрднрд╛рд╕реА рдмрд╛рд░ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓рдбрд╝рдХреА рд╡рд╣ рд╕рдм рдХреБрдЫ рдЪреБрди рд╕рдХрддреА рд╣реИ рдЬреЛ рдЙрд╕реЗ рдкрд╕рдВрдж рд╣реИ, рд╡рд┐рд╢реЗрд╖ рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЖрджреЗрд╢ рджреЗрдВред рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рдПрдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд░реНрдордЪрд╛рд░реА рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд▓рдбрд╝рдХреА рдХреЛ рдЪрдпрдирд┐рдд "рдЗрдЪреНрдЫрд╛рдУрдВ" рдХреЗ рд╡рд┐рддрд░рдг рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╛рд░ рдореЗрдиреНрдпреВ рдореЗрдВ "рдХреЗрдХ рдХрд╛ рдЯреБрдХрдбрд╝рд╛" рдпрд╛ "рдЖрдЗрд╕рдХреНрд░реАрдо рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░реЙрдмреЗрд░реА" рдЬреИрд╕реА рдорд┐рдард╛рдЗрдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдбреЗрд╕рд░реНрдЯ, рдлрд▓, рдкреЗрдпред рдореЗрдиреВ рдХреЛ рд╣рд╛рд╕реНрдп рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрджреЗрд╢ рддреБрд░рдВрдд рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдк рд▓рдбрд╝рдХреА рдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдкрд╣рд▓реА рдмрд╛рдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рд╣реИред рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
- рд▓рдбрд╝рдХреА: рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓реЗрдВ, "рдЗрдЪреНрдЫрд╛рдУрдВ" рдХреА рд╕реВрдЪреА рд╕реЗ рдЪреБрдиреЗрдВ, рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдЗрдЪреНрдЫрд╛рдПрдВ, рдПрдХ рдЖрджреЗрд╢ рджреЗрдВ, рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕реЗ рд▓реЛрдЧ рдорд╣рд╛рди рд╣реИрдВред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред
- рд╡реЗрдЯрд░ (рдкреБрд░реБрд╖ рдХрд░реНрдордЪрд╛рд░реА): рддреБрд░рдВрдд рд░рдЦреЗ рдЧрдП рдЖрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд▓рдбрд╝рдХреА рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд "рдЗрдЪреНрдЫрд╛рдУрдВ" рдХрд╛ рдПрдХ рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВ, рдХрд╛рд░реНрдпрд╕реНрдерд▓ рдкрд░ рд▓рдбрд╝рдХреА рдХреЛ "рдЗрдЪреНрдЫрд╛рдПрдВ" рд▓рд╛рдПрдВред
рд╡реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдЖрджреЗрд╢ рдХреЛ рдХрд┐рд╕рдХреЗ рдкрд╛рд╕ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рд▓рдбрд╝рдХреА рдХрд╛ рдирд╛рдо рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдСрд░реНрдбрд░ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реЗ рдПрдХ рдирд╛рдо рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред рд╣рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдХ) рд╣рдо рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣реИрдВ, рдХреЛрдИ рдЦрд▓рдирд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВ; рдЦ) рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓рдбрд╝рдХрд┐рдпрд╛рдВ рдРрд╕реЗ рджрд┐рди рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдлреЙрд░реНрдо рднрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИрдВред рдирд╛рдо рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдирд╛рдо рд╕реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рднрд╛рд╡рдирд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрд░реНрдбрд░ рджреЗрддреЗ рд╕рдордп, рдЖрдк рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдпрд╛рдж рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
Google рдЯреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдЯрд░реНрд╕ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЖрдкрдХреЗ рдЬреИрдмрд░ рд╕рд░реНрд╡рд░ рдиреЗ рд░реВрдЯ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдерд╛, рдХрдИ рдХреЗ рдкрд╛рд╕ Google рдЦрд╛рддреЗ рд╣реИрдВ, рдЖрдИрдПрдо рдИрдореЗрд▓ рд╕реЗ рддреЗрдЬ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ
xmpppy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ Google рдЯреЙрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ - рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рддреА рд╣реИ рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдлреВрд▓реЛрдВ рдХреЛ рдкрд╛рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреА рд╣реИред
рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдг рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╛рдпрдерди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВред
рдЪрд▓реЛ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдЪреНрдЫрд╛рдмрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рднреА рдлрд╝рд╛рдЗрд▓ рдкрде рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рджрд┐рдП рдЧрдП рд╣реИрдВ)ред рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ (
server.py
рдлрд╝рд╛рдЗрд▓):
from wsgiref.simple_server import make_server from pyramid.config import Configurator def create_app(): config = Configurator() app = config.make_wsgi_app() return app if __name__ == '__main__': app = create_app() server = make_server('0.0.0.0', 8080, app) server.serve_forever()
рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, WSGI рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдиреНрдпреВрдирддрд░ HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд╛рдпрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ wsgiref.simple_server рдореЙрдбреНрдпреВрд▓ред рдпрд╣ рд╣рдорд╛рд░реЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реИ, рджреЛрдиреЛрдВ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдПред рдХрдо рд╕реЗ рдХрдо рдЕрднреА рддрдХ рдирд╣реАрдВред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдкрд┐рд░рд╛рдорд┐рдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреИрд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП - рдпреБрджреНрдз рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
Http: // localhost: 8080 / рдкрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡реЗрджрди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рд╕рд░реНрд╡рд░ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ 404 рд░рд┐рдЯрд░реНрди рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдореЗрдВ рд╢реИрд▓рд┐рдпреЛрдВ, рд▓рд┐рдкрд┐рдпреЛрдВ рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред Js, css, img рдбрд╛рдпрд░реЗрдХреНрдЯрд░реАрдЬрд╝ рдмрдирд╛рдПрдБ рдФрд░ рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпреВ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рд╡рд┐рдЪрд╛рд░, рд╡рд┐рдЪрд╛рд░; рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рд╡рд┐рдЪрд╛рд░) рдЬреЛрдбрд╝реЗрдВред
def create_app(): config = Configurator() path = os.path.abspath(__file__) root = path[:path.rindex("/")] config.add_static_view("css", "{0}/css".format(root)) config.add_static_view("js", "{0}/js".format(root)) config.add_static_view("img", "{0}/img".format(root)) app = config.make_wsgi_app() return app
рдЕрдм рдлреЙрд░реНрдо
/css/*
,
/js/*
,
/img/*
URL рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдлрд╛рдЗрд▓ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред
рд╕рд░реНрд╡рд░ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рд░рд╛рдорд┐рдб рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╡реНрдпреВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рд░рд╛рдорд┐рдб рдореЗрдВ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рд╕реНрдереИрддрд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЬрдм add_static_view рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд░реНрдЧ pyramid.static.static_view рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдФрд░ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ URL рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред
рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рд╕реЗред рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВред
config = Configurator() config.add_route("index_route","/")
рдорд╛рд░реНрдЧ URL рдкреИрдЯрд░реНрди (рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рд░реНрдЧ рдХрд╛ рдирд╛рдо рд╣реИред рдпрджрд┐ рдЕрдиреБрд░реЛрдзрд┐рдд URL рдорд╛рд░реНрдЧ рдХреЗ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдорд╛рд░реНрдЧ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рджреГрд╢реНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд░реВрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╛рдБрдзрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рднреА рд╣реИ - рдПрдХ рдЦреЛрдЬ рдЗрдВрдЬрди рдЬреЛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреЗрдбрд╝ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдЗрдВрдЬрди рд╣реИред рдЗрд╕ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рд╡реНрдпреВ-рдлрд╝рдВрдХреНрд╢рдВрд╕
index_route
рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВ, рдЗрд╕рдореЗрдВ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░
index_route
рдХрд╛ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
@view_config(route_name="index_route") def index(request): return render_to_response('pt/index.pt', { 'name' : 'world' }, request)
рдФрд░
pt
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЖрджрд┐рдо
pt/index.html
рдЯреЗрдореНрдкрд▓реЗрдЯ:
<!doctype html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:tal="http://xml.zope.org/namespaces/tal" xmlns:metal="http://xml.zope.org/namespaces/metal"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>wishbar</title> </head> <body> Hello, ${name}! </body> </html>
render_to_response
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ pt/index.pt
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрд░реЛрдз request
рд▓рд┐рдП рдПрдХ HTML рдкреЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВред рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ
views.py
"рд╕реНрдХреИрди"
views.py
рдФрд░
views.py
рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
config = Configurator() config.add_route("index_route","/") config.scan("views")
рд╣рдореЗрдВ рддреАрди рдкреГрд╖реНрда рдЪрд╛рд╣рд┐рдП - рдПрдХ рдирд╛рдо рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреГрд╖реНрда, рдПрдХ рдореЗрдиреВ рдкреГрд╖реНрда рдФрд░ рдПрдХ рдЖрджреЗрд╢ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдкреГрд╖реНрдаред рддреАрдиреЛрдВ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдореВрд▓ HTML рдкреЗрдЬ рдЯреЗрдореНрдкрд▓реЗрдЯ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓реА рдЬрд╛рдПрдЧреАред рдкрд┐рд░рд╛рдорд┐рдб рдХреА рдЖрдкреВрд░реНрддрд┐ рдореЗрдВ
рдЧрд┐рд░рдЧрд┐рдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рд╣реИ,
рдЪрд▓реЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░реЛред рдЖрдЗрдП рдПрдХ рдореВрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдБ
pt/base.pt
рдФрд░ рддреАрди рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ -
pt/login.pt
,
pt/index.pt
("рд╣реЗрд▓реНрд▓реЛ рд╡рд░реНрд▓реНрдб" рдмрджрд▓реЗрдВ),
pt/confirm.pt
ред рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ
base.pt
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
base.pt
рджреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде
server.py
рдмрдЧрд▓ рдореЗрдВ рдПрдХ '
subscribers.py
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред
from pyramid.renderers import get_renderer from pyramid.events import BeforeRender, subscriber @subscriber(BeforeRender) def add_base_template(event): base = get_renderer('pt/base.pt').implementation() event.update({'base': base})
рдпрд╣
create_app
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ
subscribers.py
рд╕реЗ рд╕рднреА рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
config = Configurator() config.add_route("index_route","/") config.scan("subscribers")
@subscriber add_base_template
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдкрд┐рд░рд╛рдорд┐рдб рдЖрдВрддрд░рд┐рдХ рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░рд░ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рд░реЗрдВрдбрд░рд░ рдЧреНрд▓реЛрдмрд▓реНрд╕ рдХреЗ рд╕реЗрдЯ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдорд╛рди рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕ рдмреЗрд╕ рдмреЗрд╕ рдХреЗ рд░реЗрдВрдбрд░рд░ рдХреЛ рд╕реЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
pt/base.pt
рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реНрд▓реЙрдЯ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
<div id="content"> <tal:block metal:define-slot="content"> </tal:block> </div>
рдЕрдм рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ
login.pt
,
index.pt
рдФрд░
confirm.pt
рдЖрдк рдмреЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ "рдЗрдирд╣реЗрд░рд┐рдЯ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:tal="http://xml.zope.org/namespaces/tal" xmlns:metal="http://xml.zope.org/namespaces/metal" metal:use-macro="base"> <tal:block metal:fill-slot="content"> Hello, ${name}! </tal:block> </html>
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣ рдПрдХ рдирдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЬрдм рдХреЛрдИ рд▓рдбрд╝рдХреА рдХрд┐рд╕реА рдирд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ, рддреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрд╕реЗ рджрд░реНрдЬ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдХреБрдХреА рднреЗрдЬрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдореБрдЦреНрдп рдкреГрд╖реНрда рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдХреЛрдИ рдХреБрдХреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ, рд╣рдо рдирд╛рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд▓рдбрд╝рдХреА рдХреЗ рд▓рд┐рдП рдирд╛рдо рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
if 'username' in request.cookies: pass else: return render_to_response('pt/login.pt', {}, request)
рд╣рдо рд▓реЗрдЖрдЙрдЯ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдкрд░ рдереЛрдбрд╝рд╛ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рдорджрдж
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рднрдпрд╛рдирдХ рдмрдЯрди рд▓реЗрддреЗ рд╣реИрдВред

рдЪреВрдВрдХрд┐ рднрдпрд╛рдирдХ рдмрдЯрди рдмрдЯрди рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ, рд╣рдо рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдлрд╝реЙрд░реНрдо рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ
jQuery рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рд╣рдо рдкреНрд░рдкрддреНрд░ рдбреЗрдЯрд╛ рдХреЛ URL
/login/
POST рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬреЗрдВрдЧреЗред рдПрдХ рдорд╛рд░реНрдЧ рдФрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВред рд╣реИрдВрдбрд▓рд░ рдореЗрдВ,
username
рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХреБрдХреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдбрд╝рдХреА рдХрд╛ рдирд╛рдо рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдореВрд▓ рдореЗрдВ 302 рдлрд╛рдЙрдВрдб рднреЗрдЬреЗрдВред
config.add_route("index_route","/")
@view_config(route_name="login_route") def login(request): username = request.params['username'] response = Response() response.set_cookie('username', value=username, max_age=86400) return HTTPFound(location = "/", headers=response.headers)
рдХрд┐рд╕реА рднреА рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддрд░рд╣, рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдкреГрд╖реНрда рддрд╛рдЬрд╝рд╛ рд╣реЛ рдЬрд╛рдП, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде POST рдЕрдиреБрд░реЛрдз рдХреЛ рдлрд┐рд░ рд╕реЗ рднреЗрдЬрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк POST рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ HTML рдкреЗрдЬ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдбрд╝рдХреА рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдХреБрдХреА рд╣реИред рдЬрдм
index_route
рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рдЗрдЪреНрдЫрд╛рдУрдВ" рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рдо рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рдбрд╝рдХреА рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
if 'username' in request.cookies: username = request.cookies['username'] response = render_to_response("pt/index.pt", { "username" : username, "wishbar" : WISHBAR }, request) return response
рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рд╣рдо рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗред
<div class="table"> <tal:block repeat="wish wishbar"> <label for="${wish.name}"> <div><input id="${wish.name}" name="wish-${wish.name}" type="checkbox"></input><div class="checkbox"></div></div> <div> <div class="title">${wish.title}</div> <div class="description">${wish.description}</div> </div> </label> </tal:block> </div>
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред

рдЭрдВрдбреЗ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ div рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереАред рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╕рд╣реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд▓рдбрд╝рдХрд┐рдпреЛрдВ рдиреЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред
рдкреГрд╖реНрда рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ, "рд╡рд┐рд╢реЗрд╖ рдЗрдЪреНрдЫрд╛рдУрдВ" рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ POST рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рд░реВрдЯ URL рдкрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдлрд╝реЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрдиред рд╕рдВрдмрдВрдзрд┐рдд рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдПрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рдХрд╛рд░ рдЪреЗрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред POST рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд░рдкрддреНрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдСрд░реНрдбрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ
/confirm/id-
рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
if request.method == "POST": username = request.cookies['username'] wishlist = [] for key,value in request.POST.items(): if key.startswith("wish-"): wishlist.append(NAME2WISH[key[5:]]) special = request.params["special"] bequick = request.params["bequick"] order = Order(username,request.remote_addr,wishlist,special,bequick) ORDERS[order.id] = order return HTTPFound(location = "/confirm/{}".format(order.id))
рдЙрдкрдпреБрдХреНрдд рдорд╛рд░реНрдЧ рдФрд░
/confirm/*
рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВред
config.add_route("confirm_route","/confirm/{order}")
@view_config(route_name="confirm_route") def confirm(request): order_id = request.matchdict['order'] if order_id in ORDERS.iterkeys(): order = ORDERS.pop(order_id) notify(order) return render_to_response('pt/confirm.pt', { "order" : order }, request) else: return HTTPFound(location = "/")
рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдкреГрд╖реНрда рдкрд░, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрджреЗрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдФрд░ "рдЗрдЪреНрдЫрд╛" рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред

notify
рдлрд╝рдВрдХреНрд╢рди
notify
рдПрдХ рдСрд░реНрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реЗрдЯрд░реНрд╕ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рджред рдЗрд╕ рдмреАрдЪ, рдЪрд▓реЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдмрд╣реБрдд рдХрдо рдмрдЪрд╛ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХреЗ рддрд╣рдд "рд▓реЙрдЧ рдЖрдЙрдЯ" рдФрд░ "рд▓реЙрдЧ рдЗрди" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдЪреНрдЫрд╛ рдкреГрд╖реНрда рдкрд░ URL
/logout/
рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд
logout
рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдХреА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдореБрдЦреНрдп рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
config.add_route("logout_route","/logout/")
@view_config(route_name="logout_route") def logout(request): response = Response() response.set_cookie('username', value=None) return HTTPFound(location = "/", headers=response.headers)
рдЕрдм рдЖрдк рдСрд░реНрдбрд░ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдпрд╣ рдорд╛рдирд╛ рдЧрдпрд╛ рдХрд┐ рдХрдИ "рдкреНрд░рдмрдВрдзрдХ" рд╣реЛрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рдЖрджреЗрд╢ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░реЗрдЧрд╛ред рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП Google рдЯреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЬрдЧрд░ рд╕реЗ
рдПрдХреНрд╕рдПрдордкреАрдкреА xmpppy рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
notify.py
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ
notify.py
рдореЗрдВ
notify.py
ред
USERNAME = 'username'
рд╡рд╣ рд╕рдм рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХреЛрдИ рдЖрджреЗрд╢ рдЖрддрд╛ рд╣реИ,
notify
USERS
рд╕реВрдЪреА рд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрджреЗрд╢ рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЗрд╕реЗ рдХрдИ "рдкреНрд░рдмрдВрдзрдХреЛрдВ" рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рдкреНрд░рдмрдВрдзрдХ" "рдЗрдЪреНрдЫрд╛ рдмрд╛рд░" рдХреЗ рдкрддреЗ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реИ - рдлрд┐рд░ рдмрд╛рдХреА рд╕рднреА рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдкреБрд╖реНрдЯрд┐ рдорд┐рд▓реЗрдЧреА рдХрд┐ рдЙрд╕реЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд gtalk рдмреЙрдЯ рдХреЛ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб рдмрд╛рдж рдореЗрдВ
notify.py
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЙрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ
USERS
рд╕реВрдЪреА рдореЗрдВ рднреЗрдЬрд╛ред
рд▓реЗрдХрд┐рди рд░рди рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рдмрдВрдзрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ Google рдЯреЙрдХ рдиреЗ рд▓рдЧрднрдЧ 100 рд╕реЗрдХрдВрдб рдореЗрдВ 10 рд╕реЗ рдЕрдзрд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИ, Google рдЯреЙрдХ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдиреЗ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдЬреЛ рдорд┐рд▓рд╛ рд╡рд╣ рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд┐рдирд╛
рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрд▓реНрд▓реЗрдЦ рдерд╛ ред
рдЗрд╕рд▓рд┐рдП, рдмреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ
рд░рд╣рд╛ рдерд╛, рд╣рдордиреЗ
рдкрд╛рд░реНрдЯреАрдЪреИрдЯ рдкрд░ рдПрдХ рдХрдорд░рд╛ рдмрдирд╛рдпрд╛, рд╕рднреА рд╡реЗрдЯрд░ рдФрд░ рдЙрд╕рдореЗрдВ рдПрдХ рдмрд╛рд░ рдмрд╛рд░ рдЦрд╛рддрд╛ рдЬреЛрдбрд╝рд╛ред рдХреЗрд╡рд▓
USERS
рд╕реВрдЪреА рдореЗрдВ рдХрдорд░реЗ рдХрд╛ рдЦрд╛рддрд╛ рд░рд╣рддрд╛ рд╣реИред рдЕрдм, рдЬрдм рдХрд┐рд╕реА рдиреЗ рдЖрджреЗрд╢ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рддреЛ рд╕рдВрджреЗрд╢ рдЙрд╕ рдХрдорд░реЗ рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рд╣рд░ рдХреЛрдИ рдЙрд╕реЗ рджреЗрдЦрддрд╛ рдерд╛ рдФрд░ рддреБрд░рдВрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рдерд╛ред
рддреИрдирд╛рддреА
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдмрдВрдЯреВ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдЙрдареЗред рдореИрдВрдиреЗ рдЦреЛрдЬ рдХреНрд╡реЗрд░реА "рдкрд┐рд░рд╛рдорд┐рдб setup.py" рдХреЛ рд╣рд┐рдЯ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ
рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрд╛рдпрд╛ рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд┐рд░рд╛рдорд┐рдб рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рддрд░реАрдХреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реВрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд╛рд░реНрдп рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдкрд╛рдардХ рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВред рджреВрд╕рд░реЗ, рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдорд╛рдирдХ рдкрд░ рд▓рд╛рдПрдВред рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ред
pcreate
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ рдФрд░ рдПрдХ рдирдП рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ
pcreate
setup.py
рдмрдирд╛рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдКрдкрд░ рдПрдХ рд╕реНрддрд░ рдкрд░ рдЬрд╛рдиреЗ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ
pcreate -s starter wishbar
рдЪрд▓рд╛рдиреЗ рдХреА
pcreate -s starter wishbar
рд╣реИред
pcreate
рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдордЪрд╛рди (рд╡рд╛рдпрд░рдлреНрд░реЗрдо) pcreate
рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреАрдорд┐рдпрд╛ - sqlalchemy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИред
рдкрд┐рд░рд╛рдорд┐рдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ
wishbar
рдкреИрдХреЗрдЬ рдореЗрдВ
wishbar
рд╣реИред рдХреНрдпрд╛ рд╕рд╣реА рд╣реИ, рдореЙрдбреНрдпреВрд▓ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╛рдЗрд▓реЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рдереАрдВред рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛ - рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓рд╛рдкрддрд╛
import
рдирд┐рд░реНрджреЗрд╢ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ,
__init__.py
рдореЗрдВ
server.py
рд╕реЗ
create_app
рдХреЙрд▓ рдЬреЛрдбрд╝рд╛
__init__.py
ред
рдЧрд┐рдЯрд╣рдм рдкрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛:
cd ~ mkdir wishbar cd wishbar git init git remote add origin "https://github.com/rgmih/wishbar.git" git pull origin master sudo python ./setup.py develop pserve production.ini
рдЗрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде, рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ 7777 рдкреЛрд░реНрдЯ рдкрд░ рд╡реЗрдЯреНрд░реЗрд╕ WSGI рд╕рд░реНрд╡рд░ рдХреЗ рддрд╣рдд рдЪрд▓рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓рдбрд╝рдХрд┐рдпрд╛рдБ рдмрд╣реБрдд рдкреНрд░рд╕рдиреНрди рдереАрдВред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡рд╛рд╣ рдкреНрд░рднрд╛рд╡ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
"рд╡рд┐рд╢ рдкреВрд░реНрддрд┐ рдмрд╛рд░" рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ 7 рдорд╛рд░реНрдЪ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЫреБрдЯреНрдЯреА рдХреА рд╕реБрдмрд╣, рдкреНрд░рдмрдВрдзрдХ рдФрд░ рд╡реЗрдЯрд░ рдЕрдкрдиреЗ рд▓рдбрд╝рд╛рдХреВ рдкрджреЛрдВ рдкрд░ рдереЗ рдФрд░ рдЖрд░рд╛рдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХреАред рдкрд╣рд▓рд╛ рдЖрджреЗрд╢ "рд╡рд┐рд╢реЗрд╖ рдЗрдЪреНрдЫрд╛рдУрдВ" рдЦрдВрдб рдореЗрдВ "рдореИрдВ рд╕рджрдореЗ рдореЗрдВ рд╣реВрдВ" рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрдмрд╣ 9 рдмрдЬреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╣реБрдВрдЪрд╛ред рдЫреБрдЯреНрдЯреА рдХреЗ рдЕрдВрдд рддрдХ рдЖрд╡реЗрджрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдордиреЗ рдЕрдкрдиреА "рдЖрджрд░реНрд╢" рдпреЛрдЬрдирд╛ рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦреА рдереА, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рдЗрдорд╛рд░рдд рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рд╣реЛрдЧрд╛ рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпрд╛рд▓рдп рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рддрджрдиреБрд╕рд╛рд░, рдЖрджреЗрд╢ рдЕрд▓рд░реНрдЯ рдЪреИрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдП, рдФрд░ рдЪреИрдЯ рд╡реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рджреБрд░реНрдЧрдо рд╣реЛ рдЧрдпрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЙрддреНрд╕рд╡ рднреЛрдЬ рд╕реЗ рджрд╕ рдорд┐рдирдЯ рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХрд┐рд╕реА рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рдереАред
рдЖрд╡реЗрджрди рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкрд╛рдпрдерди 2.7 рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди 3 рдХреЗ рддрд╣рдд рд╕рдм рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рд╕рдордп рдХреА рд╕реАрдорд╛рдУрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдХреЛрдИ рд▓реЙрдЧрд┐рдВрдЧ, рд╕реНрдерд╛рдиреАрдпрдХрд░рдг, рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рдЖрджрд┐ рдирд╣реАрдВ рдерд╛ред рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
рдкрд╛рдпрдерди 2.7.2 ,
рдкрд┐рд░рд╛рдорд┐рдб 1.4 ,
xmpppy 0.5.0rc1 ,
LESS 1.3ред 0 ,
jQuery 1.9.1 ред рдореИрдВ рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХрд┐рд╕реА рднреА рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓реЗрдЦ рдФрд░ рдореЗрд░реЗ рдХреМрд╢рд▓ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред