рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╕рд╛рдЗрдЯ рд╣реИ рдЬреЛ рдЕрдХреНрд╕рд░ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ (рдЬреИрд╕реЗ рдХрд┐ рдлреЛрди рдФрд░ рдЯреИрдмрд▓реЗрдЯ рдкреАрд╕реА) рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рддреНрд╡рд░рд┐рдд рд▓реЙрдЧрд┐рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП - рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдкрддреЗ рдпрд╛ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ ( рдИ-рдореЗрд▓ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб)ред
рдХреБрдЫ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░, рдЖрдкрдиреЗ рддреНрд╡рд░рд┐рдд рд▓реЙрдЧрд┐рди рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдЦреА рд╣реЛрдЧреА - рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИред рдЗрд╕ рдиреЛрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╡реИрд╕реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЬреЛ рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ, рд╕реНрдХреНрд░рд┐рдирдХрд╛рд╕реНрдЯ рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (
YouTube рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ , рдпрд╛
1080p рдореЗрдВ MPEG2 рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ)ред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ:
- рдПрдХ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рдереЛрдбрд╝рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ: рдПрдХ рддрд░рдл, рд╣рдо рддреАрд╕рд░реЗ рдкрдХреНрд╖ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрд╕рдПрдордПрд╕ рдЧреЗрдЯ, рдореЛрдмрд╛рдЗрд▓ рдСрдкрд░реЗрдЯрд░) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓рд┐рдВрдХ рдЬреЗрдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ (рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрджрд┐ рд╕рд╛рдЗрдЯ рдореЗрдВ XSS рд╣реИ, рддреЛ рд╣рдорд▓рд╛рд╡рд░ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рд╕реЗ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреНрдпреВрдЖрд░ рдХреЛрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд░ рддрдХ рднреМрддрд┐рдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХреГрдд рд╣реИред рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрдарднреВрдорд┐
- рдПрдХ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдпрд╣ рдЗрддрдирд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХреЛрдИ рд╕реЗрд▓реБрд▓рд░ рдХрдиреЗрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗрд▓реБрд▓рд░ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдХреИрдорд░рд╛ рднреА рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди, рдФрд░ рдЙрд╕ рдкрд░ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ)
- рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рдкреИрд╕реЗ рдЦрд░реНрдЪ рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреВрдЖрд░ рдХреЛрдб рдмрдирд╛рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдореБрдлреНрдд рд╣реИ
- рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рдЧрддрд┐ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЧрд┐рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, рдПрдХ рд╕рдВрджреЗрд╢ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЗрд░реА рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдХреНрдпреВрдЖрд░ рдХреЛрдб рд╕реНрдХреИрди рдХрд░рдирд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдпрджрд┐ рдХреИрдорд░рд╛ рдареАрдХ рд╣реИ)
- рдПрдХ рд╕рд╛рдЗрдЯ рдХреЛ рдПрд╕рдПрдордПрд╕ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдлреЛрди рдирдВрдмрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдкрдирд╛ рдлреЛрди рдирдВрдмрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХреНрдпреВрдЖрд░ рдХреЛрдб рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЙрдЪреНрдЪ рд╕реБрд░рдХреНрд╖рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рднреА рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХреНрдпреВрдЖрд░ рдХреЛрдб рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рд╣реИ (рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдбрд╝реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреАрдмреЛрд░реНрдб рдкрд░ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдореБрдЭреЗ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрддрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред + рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдИрдореЗрд▓ рдкрддрд╛ + рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдХреАрдмреЛрд░реНрдб рдкрд░ рдкрд╛рд╕рд╡рд░реНрдб)ред рдлрд┐рд░ рднреА, рдЕрдм рдореИрдВ QR рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддреНрд╡рд░рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓, рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдХрд▓реНрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рда, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдХреНрд░реАрдирдХрд╛рд╕реНрдЯ, рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
pip install django-qrauth
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдореБрдЦреНрдп urls.py рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА urls рдпреЛрдЬрдирд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк
Github рдкрд░ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд┐рд░реНрджреЗрд╢ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рддреБрд░рдВрдд рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рддреЛ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Django рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рдордХрд╛рдЬреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдирдпрд╛ рдЖрд╡реЗрджрди рдмрдирд╛рдПрдВред рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, qrauth:
python manage.py startapp qrauth
рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, qr.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ:
try: from PIL import Image, ImageDraw except ImportError: import Image, ImageDraw import qrcode.image.base import qrcode.image.pil class PilImage(qrcode.image.pil.PilImage): def __init__(self, border, width, box_size): if Image is None and ImageDraw is None: raise NotImplementedError("PIL not available") qrcode.image.base.BaseImage.__init__(self, border, width, box_size) self.kind = "PNG" pixelsize = (self.width + self.border * 2) * self.box_size self._img = Image.new("RGBA", (pixelsize, pixelsize)) self._idr = ImageDraw.Draw(self._img) def make_qr_code(string): return qrcode.make(string, box_size=10, border=1, image_factory=PilImage)
рдпрд╣рд╛рдВ
рдЕрдЬрдЧрд░-рдХреНрд░реЛрдб рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ ред рдЖрдк рдЗрд╕реЗ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
pip install qrcode
рдкрд╛рд░рджрд░реНрд╢реА (рд╕рдлреЗрдж рдХреЗ рдмрдЬрд╛рдп) рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ qrcode.image.pil.PilImage рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рд╕рдлреЗрдж рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░реЛрдВ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:
import qrcode def make_qr_code(string): return qrcode.make(string, box_size=10, border=1)
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, qrcode.make рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдЖрдП рдЪрд┐рддреНрд░ (рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдореЗрдХ_рд░рдХреНрд░реЛрдб рдлрд╝рдВрдХреНрд╢рди) рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдСрдкреНрдЯрд┐рдкрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
, рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд▓рдЧрднрдЧ 70% (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рд╣рд╛рдирд┐ рдХреЗ рдмрд┐рдирд╛) рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ - рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рд╣реИ (рдХреБрдЫ рдХрд┐рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рднреАрддрд░)ред
рдЕрдЧрд▓рд╛, utils.py рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
import os import string import hashlib from django.conf import settings def generate_random_string(length, stringset="".join( [string.ascii_letters+string.digits] )): """ Returns a string with `length` characters chosen from `stringset` >>> len(generate_random_string(20) == 20 """ return "".join([stringset[i%len(stringset)] \ for i in [ord(x) for x in os.urandom(length)]]) def salted_hash(string): return hashlib.sha1(":)".join([ string, settings.SECRET_KEY, ])).hexdigest()
рдЬрдирд░реЗрдЯ_рд░реИрдВрдбрдо_рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд▓рдВрдмрд╛рдИ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рддрд╛рд░ рд▓реИрдЯрд┐рди рд╡рд░реНрдгрдорд╛рд▓рд╛ (рдирд┐рдЪрд▓реЗ рдФрд░ рдКрдкрд░реА рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ) рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдХреНрд╖рд░реЛрдВ рд╕реЗ рдмрдирд╛ рд╣реЛрддрд╛ рд╣реИред
рдирдордХреАрди_рд╣рд╢ рдлрд▓ рдирдордХ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ
рд╣реИрд╢ ред
рдЕрдм view.py рдХреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд▓рд┐рдЦреЗрдВ:
import redis from django.contrib.auth.decorators import login_required from django.contrib.auth import login, get_backends from django.contrib.sites.models import get_current_site from django.template import RequestContext from django.shortcuts import render_to_response from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.core.urlresolvers import reverse from django.contrib.auth.models import User from privatemessages.context_processors import \ number_of_new_messages_processor from utils import generate_random_string, salted_hash from qr import make_qr_code @login_required def qr_code_page(request): r = redis.StrictRedis() auth_code = generate_random_string(50) auth_code_hash = salted_hash(auth_code) r.setex(auth_code_hash, 300, request.user.id) return render_to_response("qrauth/page.html", {"auth_code": auth_code}, context_instance=RequestContext(request)) @login_required def qr_code_picture(request, auth_code): r = redis.StrictRedis() auth_code_hash = salted_hash(auth_code) user_id = r.get(auth_code_hash) if (user_id == None) or (int(user_id) != request.user.id): raise Http404("No such auth code") current_site = get_current_site(request) scheme = request.is_secure() and "https" or "http" login_link = "".join([ scheme, "://", current_site.domain, reverse("qr_code_login", args=(auth_code_hash,)), ]) img = make_qr_code(login_link) response = HttpResponse(mimetype="image/png") img.save(response, "PNG") return response def login_view(request, auth_code_hash): r = redis.StrictRedis() user_id = r.get(auth_code_hash) if user_id == None: return HttpResponseRedirect(reverse("invalid_auth_code")) r.delete(auth_code_hash) try: user = User.objects.get(id=user_id) except User.DoesNotExist: return HttpResponseRedirect(reverse("invalid_auth_code"))
рдХреНрдпреВрдЖрд░ рдХреЛрдб (qr_code_page) рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░, 50 рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛,
pip install redis
рдореЗрдВ (рдЖрдк
pip install redis
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдПрдХ рдирдпрд╛ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрддреНрдкрдиреНрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдирдордХреАрди рд╣реИрд╢ рдХреЛ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рддрд╕реНрд╡реАрд░ рд╣реЛред , рдЬреЛ рдкреГрд╖реНрда рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдерд╛)ред рдпрд╣ рдХреБрдВрдЬреА рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 300 рд╕реЗрдХрдВрдб (5 рдорд┐рдирдЯ) рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЙрддреНрдкрдиреНрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИ: рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рдкрддреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ QR рдХреЛрдб рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣реИрд╢ рд╡рд╛рд▓реЗ рдкрддреЗ рдХреЛ QR рдХреЛрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЗрд╕ рддрд░рд╣ рд╕реЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЫрд╡рд┐ рдХрд╛ рдкрддрд╛ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЫрд╡рд┐ рдХреЗ рдкрддреЗ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирдордХреАрди рд╣реИрд╢ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдЫрд╡рд┐ (qr_code_picture) рдХреЛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЫрд╡рд┐ рдХреЗ рдкрддреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╣реИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ Redis рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдВрдЬреА рд╣реИред рдпрджрд┐ рдРрд╕реА рдХреЛрдИ рдХреБрдВрдЬреА рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдЗрдЯ рдкрд░ рддрддреНрдХрд╛рд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд▓рд┐рдВрдХ рд╕реЗ рдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рддреНрд░реБрдЯрд┐ 404 рджреА рдЧрдИ рд╣реИред
рд╡реИрд╕реЗ, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?int(user_id) != request.user.id
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░
int(user_id) != request.user.id
ValueError рд╣реЛ рд╕рдХрддреА рд╣реИ - рдпрджрд┐ Redis рдореЗрдВ рдРрд╕реА рдХреБрдВрдЬреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорд╛рди рджрд╢рдорд▓рд╡ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ
рдЯреНрд░рд╛рдИ ... рдХреЛ рдЫреЛрдбрд╝рдХрд░ , рдпрд╛
isdigit рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк request.user.id рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХреБрдВрдЬреА рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рди рдХреЗрд╡рд▓ рдПрдХ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрд╢ - рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ рдЕрдЧрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдХрд╣реАрдВ рдФрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред
рдпрд╣рд╛рдБ рдбреЛрдореЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
django.contrib.sites рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдбреЛрдореЗрди рдХреЛ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (/ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рд╕рд╛рдЗрдЯ / рд╕рд╛рдЗрдЯ /) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдХрд╛ рд╕рд░реНрд╡рд░ рдПрдХ рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, nginx) рдХреЗ рдкреАрдЫреЗ рд╣реИ рдФрд░ рдЖрдк SSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ - рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ request.is_secure () рд╕рд╣реА рдорд╛рди рд▓реМрдЯрд╛рдП (рдЗрд╕рдХреЗ рд▓рд┐рдП)
SECURE_PROXY_SSL_HEADER рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЗрд╕ рд╣реЗрдбрд░ рдХреЛ рд╕реЗрдЯ / рд░рд┐рдореВрд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдЕрдиреНрдпрдерд╛, рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреА рд╕рд╛рдЗрдЯ HTTP рдФрд░ HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИ, рддреЛ HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЗрд╕ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ request.is_secure () рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдпрд╣ рд╕рдЪ рд╣реИ, рдФрд░ рдХрд╣рд╛ рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмреБрд░рд╛ рд╣реИ) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдФрд░ рд╣рд╛рдБ,
request.is_secure() and "https" or "http"
рдмрдЬрд╛рдп Python 2.6 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ
request.is_secure() and "https" or "http"
рдЖрдк
"https" if request.is_secure() else "http"
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рддрддреНрдХрд╛рд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ Redis рдХреЗ рдкрд╛рд╕ рд▓рд┐рдВрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрд╢ рдХреЗ рдЕрдиреБрд░реВрдк рдХреЛрдИ рдХреБрдВрдЬреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкреГрд╖реНрда рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдЕрдорд╛рдиреНрдп рд╣реИ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдпрджрд┐ рд╡рд╣рд╛рдБ рд╣реИ, рддреЛ Redis рдореЗрдВ рдХреБрдВрдЬреА рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрд╕ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдлрд┐рд░ рд╕реЗ, рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреВрдЖрд░ рдХреЛрдб рдЕрдорд╛рдиреНрдп рд╣реИред рдпрджрд┐ рд╡рд╣рд╛рдБ рд╣реИ, рддреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рдХреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм urls.py рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА URL рдпреЛрдЬрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
from django.conf.urls import patterns, url from django.views.generic.simple import direct_to_template urlpatterns = patterns('qrauth.views', url( r'^pic/(?P<auth_code>[a-zA-Z\d]{50})/$', 'qr_code_picture', name='auth_qr_code' ), url( r'^(?P<auth_code_hash>[af\d]{40})/$', 'login_view', name='qr_code_login' ), url( r'invalid_code/$', direct_to_template, {'template': 'qrauth/invalid_code.html'}, name='invalid_auth_code' ), url( r'^$', 'qr_code_page', name='qr_code_page' ), )
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрдиреЗ рдореБрдЦреНрдп urls.py рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ (рдЬреЛ рдХрд┐ ROOT_URLCONF рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдФрд░ рд╡рд╣рд╛рдВ рдмрдирд╛рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ urls.py рд╕реЗ urlpatterns рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ:
urlpatterns = patterns('',
рдЕрдм рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдХреНрд░рд╛рдЙрде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЬреЛрдбрд╝реЗрдВред
рдЕрдорд╛рдиреНрдп_ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг:
{% extends "base.html" %} {% block title %}QR- {% endblock %} {% block content %} <div class="error"> <h1>QR- </h1> <p>QR-, , . , QR- .</p> </div> {% endblock %}
рдкреЗрдЬ.html рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг:
{% extends "base.html" %} {% block title %}QR- {% endblock %} {% block content %} <div class="qr_code"> <h1>QR- </h1> <p> (, ) QR-:</p> <div><img src="{% url auth_qr_code auth_code %}" alt="QR"></div> <p> QR- 5 . QR-, <a href="{% url qr_code_page %}"> </a> .</p> </div> {% endblock %}
рджрд░рдЕрд╕рд▓, рдЕрдм рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд░ рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ QR рдХреЛрдб рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрддреНрдкрдиреНрди рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рдлрд╝реЛрди рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рд╕реЗ рдХреИрдорд░реЗ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рд╢реНрди рдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рддреНрд╡рд░рд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
рд╕рднреА рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдБ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ!
рдЖрдкрдХреЛ рдЧрд░реНрдорд┐рдпреЛрдВ рдХреА рд╢реБрднрдХрд╛рдордирд╛рдПрдБ! :)