рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдЧрд╛-рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓, рднрд╛рдЧ 5: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ред

рдЗрд╕ рдореИрдиреБрдЕрд▓ рдХреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж wiygn рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдирдХреА рд╕рд╣рдорддрд┐ рд╕реЗ, рдореИрдВ рдпрд╣ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦ рд░рд╣рд╛ рд╣реВрдВред







рдпрд╣ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╛рдБрдЪрд╡рд╛рдБ рд▓реЗрдЦ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВ рдлреНрд▓рд╛рд╕реНрдХ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реНрд░рд╛рдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд╛рдпрдерди рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдБред









рдЗрд╕ рдЧрд╛рдЗрдб рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдорд╛рдЗрдХреНрд░реЛрдмреНрд▓реЙрдЧрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореМрд▓рд┐рдХрддрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдмреНрд▓реЙрдЧ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред









рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛
рднрд╛рдЧ 2: рдЯреЗрдореНрдкрд▓реЗрдЯ

рднрд╛рдЧ 3: рдкреНрд░рдкрддреНрд░

рднрд╛рдЧ 4: рдбреЗрдЯрд╛рдмреЗрд╕

рднрд╛рдЧ 5: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди (рдпрд╣ рд▓реЗрдЦ)

рднрд╛рдЧ 6: рдкреНрд░реЛрдлрд╛рдЗрд▓ рдкреЗрдЬ рдФрд░ рдЕрд╡рддрд╛рд░

рднрд╛рдЧ 7: рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг

рднрд╛рдЧ 8: рдЕрдиреБрдпрд╛рдпреА, рд╕рдВрдкрд░реНрдХ рдФрд░ рдорд┐рддреНрд░

рднрд╛рдЧ 9: рдЕрдВрдХреБрд░рдг

рднрд╛рдЧ 10: рдкреВрд░реНрдг рдкрд╛рда рдЦреЛрдЬ

рднрд╛рдЧ 11: рдИрдореЗрд▓ рд╕рдорд░реНрдерди

рднрд╛рдЧ 12: рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг

рднрд╛рдЧ 13: рддрд┐рдерд┐ рдФрд░ рд╕рдордп

рднрд╛рдЧ 14: I18n рдФрд░ L10n

рднрд╛рдЧ 15: рдЕрдЬрд╛рдХреНрд╕

рднрд╛рдЧ 16: рдбрд┐рдмрдЧрд┐рдВрдЧ, рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ

рднрд╛рдЧ 17: рд▓рд┐рдирдХреНрд╕ рдкрд░ рддреИрдирд╛рддреА (рдФрд░ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдкрд░ рднреА!)

рднрд╛рдЧ 18: рд╣рд░реЛрдХреВ рдХреНрд▓рд╛рдЙрдб рдкрд░ рддреИрдирд╛рддреА





рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐



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









рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╡реЗрдм рдлреЙрд░реНрдо рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦреЗрдВрдЧреЗред рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдЫреЛрдЯрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХреГрдд рдХрд░реЗрдЧрд╛ред









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











рд╡рд┐рдиреНрдпрд╛рд╕



рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреА рддрд░рд╣, рд╣рдо рдЙрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЪрд╛рд╣рд┐рдП- рдлреНрд▓рд╛рд╕реНрдХ-рд▓реЙрдЧрд┐рди рдФрд░ рдлреНрд▓рд╛рд╕реНрдХ-рдУрдкрдирдЖрдИрдбреАред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ ( app/__init__.py



)
:









 import os from flask.ext.login import LoginManager from flask.ext.openid import OpenID from config import basedir lm = LoginManager() lm.init_app(app) oid = OpenID(app, os.path.join(basedir, 'tmp'))
      
      





рдлреНрд▓рд╛рд╕реНрдХ-рдУрдкрдирдЖрдИрдбреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЕрдкрдиреА рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд╣реАрдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, tmp



рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдкрде рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред









рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп



рдЪрд▓рд┐рдП рд╣рдорд╛рд░реЗ рд╡реНрдпреВ рдлрдВрдХреНрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ ( app/views.py



):









 from flask import render_template, flash, redirect, session, url_for, request, g from flask.ext.login import login_user, logout_user, current_user, login_required from app import app, db, lm, oid from forms import LoginForm from models import User, ROLE_USER, ROLE_ADMIN @app.route('/login', methods = ['GET', 'POST']) @oid.loginhandler def login(): if g.user is not None and g.user.is_authenticated(): return redirect(url_for('index')) form = LoginForm() if form.validate_on_submit(): session['remember_me'] = form.remember_me.data return oid.try_login(form.openid.data, ask_for = ['nickname', 'email']) return render_template('login.html', title = 'Sign In', form = form, providers = app.config['OPENID_PROVIDERS'])
      
      







рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ рдХрдИ рдирдП рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд┐рдП рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред









рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВред рд╣рдордиреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдлрдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛрдбрд╝рд╛ рд╣реИред oid.loginhandler Flask-OpenID



рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж oid.loginhandler Flask-OpenID



рдЕрдм рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред









g



рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдлреНрд▓рд╛рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдЬреАрд╡рди рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдирд┐рдордп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдореЗрдВ рд╣реИ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рд╣рдо g.user



рдХреЗ рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд▓реЙрдЧ рдЗрди рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред









url_for



рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рд╣рдордиреЗ redirect



рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ URL



рдХреЛ рдЙрд╕ рддрдХ url_for



рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЖрдк redirect('/index')



рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП URL



рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реМрдВрдкрдиреЗ рдХреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВ ред









рд╣рдордиреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╝реЙрд░реНрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рджреЛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдлреНрд▓рд╛рд╕реНрдХ рд╕рддреНрд░ рдореЗрдВ remember_me



db.session



рдХрд░рддреЗ рд╣реИрдВ ( db.session



рд╕рд╛рде рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ, db.session



SQLAlchemy рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рддреНрд░)ред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, flask.g



рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬрдмрдХрд┐ flask.session



рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИред рд╕рддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рд╕реЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рджреМрд░рд╛рди рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рддрдХ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕рддреНрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред









oid.try_login



рдХреЙрд▓ рдХрд░рдирд╛, рдлреНрд▓рд╛рд╕реНрдХ- oid.try_login



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ: рд╡реЗрдм рдлреЙрд░реНрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд openid



рдФрд░ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЬреЛ рд╣рдо рдУрдкрдирдЖрдИрдбреА рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ User



рдореЙрдбрд▓ рдореЗрдВ nickname



рдФрд░ email



рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗред









OpenID рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред рдпрджрд┐ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдлреНрд▓рд╛рд╕реНрдХ- oid.after_login



. oid.after_login



рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред









OpenID рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛



рдпрд╣ рд╣реИ рдХрд┐ after_login



рдлрд╝рдВрдХреНрд╢рди (рдлрд╝рд╛рдЗрд▓ app/views.py



after_login



рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:









 @oid.after_login def after_login(resp): if resp.email is None or resp.email == "": flash('Invalid login. Please try again.') return redirect(url_for('login')) user = User.query.filter_by(email = resp.email).first() if user is None: nickname = resp.nickname if nickname is None or nickname == "": nickname = resp.email.split('@')[0] user = User(nickname = nickname, email = resp.email, role = ROLE_USER) db.session.add(user) db.session.commit() remember_me = False if 'remember_me' in session: remember_me = session['remember_me'] session.pop('remember_me', None) login_user(user, remember = remember_me) return redirect(request.args.get('next') or url_for('index'))
      
      







after_login



рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджрд┐рдП рдЧрдП after_login



рддрд░реНрдХ рдореЗрдВ OpenID рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред









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



рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рдореЗрд▓ рд╕реЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред









рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдлреНрд▓рд╛рд╕реНрдХ рд╕рддреНрд░ рд╕реЗ remember_me



рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╣реА рдорд╛рди рд╣реИ рдЬреЛ рд╣рдордиреЗ login



рд╡реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдерд╛ред









рддрдм рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╛рд╕реНрдХ-рд▓реЙрдЧрд┐рди рдореЙрдбреНрдпреВрд▓ рд╕реЗ login_user



рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред









рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ next



рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ, рдпрд╛ рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рджрд┐рдП рдЧрдП рдкрддреЗ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИред next



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреАрдЫреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдХреБрдЫ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлреНрд▓рд╛рд╕реНрдХ-рд▓реЙрдЧрд┐рди рдХреЗ рд╕рд╛рде, рдЗрди рдкреГрд╖реНрдареЛрдВ рдХреЛ login_required



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



рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдореВрд▓ рдкреГрд╖реНрда рдХреЗ URL



рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдкрддреЗ рдкрд░ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред









рдлреНрд▓рд╛рд╕реНрдХ-рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рднреЗрдЬрд╛ рдЬрд╛рдП, рд╣рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреА рд╕реВрдЪрдирд╛ рджреЗрдиреА рд╣реЛрдЧреА (рдлрд╝рд╛рдЗрд▓ app/__init__.py



)
:









 lm = LoginManager() lm.init_app(app) lm.login_view = 'login'
      
      







рдЬреАрд╕рд░ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ



login



рджреГрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдордиреЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП g.user



рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХреГрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо before_request



рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, before_request



рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, g.user



рдорд╛рди рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдпрд╣рд╛рдБ рд╕реЗрдЯ рдХрд░рдирд╛ рдХрд╛рдлреА рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ (рдлрд╝рд╛рдЗрд▓ app/views.py



)
:









 @app.before_request def before_request(): g.user = current_user
      
      







рд╡рд╣ рд╕рдм рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдлреНрд▓рд╛рд╕реНрдХ-рд▓реЙрдЧрд┐рди рд╣рдореЗрдВ current_user



рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рдЗрд╕ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдВрдХ рдХреЛ g



рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдПред рдЕрдм рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рд░ рдЬрдЧрд╣ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдЕрдВрджрд░ рднреАред









рдореБрдЦрдкреГрд╖реНрда рдкреНрд░рджрд░реНрд╢рди



рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдордиреЗ index



рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдЯрдм рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдереЗред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:









 @app.route('/') @app.route('/index') @login_required def index(): user = g.user posts = [ { 'author': { 'nickname': 'John' }, 'body': 'Beautiful day in Portland!' }, { 'author': { 'nickname': 'Susan' }, 'body': 'The Avengers movie was so cool!' } ] return render_template('index.html', title = 'Home', user = user, posts = posts)
      
      







рд╣рдордиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдмрджрд▓рд╛рд╡ рдХрд┐рдП рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, login_required



рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм рд╕реЗ, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдкрдВрдЬреАрдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реА рдЗрд╕ рдкреГрд╖реНрда рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред









рджреВрд╕рд░реЗ, рд╣рдо рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕реНрдЯрдм рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП g.user рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред









рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред









рдЬрдм рдЖрдк http://localhost:5000



, рддреЛ рдЖрдкрдХреЛ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред OpenID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП URL



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрддрд╛ рджрд░реНрдЬ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╛рда рдмреЙрдХреНрд╕ рдХреЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред









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









рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рд╣реЛрдВрдЧреЗ, рдЕрдм рдПрдХ рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВред









рдЖрдк remember_me



рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рднреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред









рд▓реЙрдЧрдЖрдЙрдЯ



рд╣рдордиреЗ рд▓реЙрдЧрд┐рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдпрд╣ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдлрд╝рд╛рдЗрд▓ app/views.py



)
:









 @app.route('/logout') def logout(): logout_user() return redirect(url_for('index'))
      
      







рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрдиреНрдп рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓рд┐рдВрдХ (рдлрд╝рд╛рдЗрд▓ app/templates/base.html



) рдХреЗ
рдмрдЧрд▓ рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░рдЦреЗрдВ:







 <html> <head> {% if title %} <title>{{title}} - microblog</title> {% else %} <title>microblog</title> {% endif %} </head> <body> <div>Microblog: <a href="{{ url_for('index') }}">Home</a> {% if g.user.is_authenticated() %} | <a href="{{ url_for('logout') }}">Logout</a> {% endif %} </div> <hr> {% with messages = get_flashed_messages() %} {% if messages %} <ul> {% for message in messages %} <li>{{ message }} </li> {% endfor %} </ul> {% endif %} {% endwith %} {% block content %}{% endblock %} </body> </html>
      
      







рджреЗрдЦреЛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ! рд╣рдореЗрдВ рдмрд╕ g.user



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



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ редред









рдЕрдВрддрд┐рдо рд╢рдмреНрдж



рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкреЗрдЬ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдЕрд╡рддрд╛рд░ рд▓реЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред









рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

рдорд╛рдЗрдХреНрд░реЛрдмреНрд▓реЙрдЧ-0.5.zip рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ











рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВ!









рдорд┐рдЧреБрдПрд▓








All Articles