Setzen Sie die Reise zum Flask-Lernen fort. Heute werde ich das Login-Verwaltungsmodul von Flask vorstellen. Erinnern Sie sich noch an das kleine Blog-Projekt im vorherigen Artikel? Der Login ist der Bestätigungscode, den wir selbst geschrieben haben. Er besteht wahrscheinlich aus den folgenden Schritten:
1. Geben Sie Benutzernamen und Passwort in das Anmeldefeld ein2. Die Flaschenansichtsfunktion ruft das Benutzerkennwort ab und fragt dann die Benutzerinformationen in der Datenbank nach Übereinstimmung ab
3. Bei Erfolg in die Sitzung schreiben und zur Startseite weiterleiten
4. Wenn Sie sich anmelden müssen, um auf eine bestimmte Ansicht zuzugreifen, müssen Sie in jeder Ansichtsfunktion überprüfen, ob der Benutzer in der Sitzung vorhanden ist.
Heute transformieren wir das Blog-Projekt weiter. Das eingeführte Flask-Login-Modul soll uns dabei helfen, diese öffentlichen Funktionen zu verwalten, die weniger geschäftsbezogen sind. Es kann uns helfen:
Speichern Sie die aktuell aktive Benutzer-ID in der Sitzung, sodass Sie sich frei an- und abmelden können.
Ermöglicht Ihnen, die Ansichten einzuschränken, auf die angemeldete (oder abgemeldete) Benutzer zugreifen können.
Umgang mit der kniffligen Funktion „An mich erinnern“.
Hilft Ihnen, Benutzersitzungen vor Cookie-Diebstahl zu schützen.
Kann in Flask-Principal oder andere Authentifizierungserweiterungen integriert werden, die später verwendet werden können.
1. Wie verwende ich das Flask-Login-Modul?
1. Flask-Login installieren
E:workdirdct-server-5055187src>pip install flask-login
2.1) Hinzufügen:
in /blog2/__init__.py
#引用包 from flask.ext.login import LoginManager #登陆管理 #声明login对象 login_manager = LoginManager() #初始化绑定到应用 login_manager.init_app(app) #声明默认视图函数为login,当我们进行@require_login时,如果没登陆会自动跳到该视图函数处理 login_manager.login_view = "login" #当登陆成功后,该函数会自动从会话中存储的用户 ID 重新加载用户对象。它应该接受一个用户的 unicode ID 作为参数,并且返回相应的用户对象。 @login_manager.user_loader def load_user(userid): return User.query.get(int(userid))
from flask.ext.login import UserMixin from blog2 import db class User(db.Model, UserMixin): __tablename__ = 'b_user' id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(10),unique=True) password = db.Column(db.String(16)) def __init__(self,username,password): self.username = username self.password = password def __repr__(self): return '<User %r>' % self.username
is_authenticated
is_active
is_anonymous
get_id()
Um Benutzerklassen einfach zu implementieren, können Sie von UserMixin erben, das Standardimplementierungen aller dieser Methoden bereitstellt. Wir verwenden UserMixin, um es hier zu implementieren.
from flask.ext.login import login_required, login_user, logout_user from blog2.model.User import User from blog2.model.Category import Category import os from blog2 import app,db from flask import request,render_template,flash,abort,url_for,redirect,session,Flask,g @app.route('/') @login_required def show_entries(): categorys = Category.query.all() return render_template('show_entries.html',entries=categorys) @app.route('/add',methods=['POST']) @login_required def add_entry(): #—————————————————————————————————————————————— # 第一版登陆方式 # if not session.get('logged_in'): # abort(401) #—————————————————————————————————————————————— title = request.form['title'] content = request.form['text'] category = Category(title,content) db.session.add(category) db.session.commit() flash('New entry was successfully posted') return redirect(url_for('show_entries')) @app.route('/login',methods=['GET','POST']) def login(): error = None if request.method == 'POST': user = User.query.filter_by(username=request.form['username']).first() #—————————————————————————————————————————————————————————————————————————— #第一版登陆方式 # passwd = User.query.filter_by(password=request.form['password']).first() # # if user is None: # error = 'Invalid username' # elif passwd is None: # error = 'Invalid password' # else: # session['logged_in'] = True # flash('You were logged in') # return redirect(url_for('show_entries')) #—————————————————————————————————————————————————————————————————————————— login_user(user) flash('Logged in successfully.') return redirect(url_for('show_entries')) return render_template('login.html', error=error) @app.route('/logout') @login_required def logout(): #—————————————————————————————————————————————— # 第一版登出方式 # session.pop('logged_in', None) #—————————————————————————————————————————————— logout_user() flash('You were logged out') return redirect(url_for('show_entries'))
@login_required: Dieser Dekorator wird in der Ansicht platziert, für deren Zugriff eine Anmeldung erforderlich ist. Wenn für den Zugriff auf die eingeschränkte Ansicht keine Anmeldung vorhanden ist, springt er zur Anmeldeseite, gesteuert durch login_manager.login_view = „login“ in __init__. py
login_user(user): Übergeben Sie ein Benutzerobjekt zur Anmeldeüberprüfung, geben Sie „true“ zurück, wenn es korrekt ist, andernfalls geben Sie „false“ zurück
logout_user(): Abmeldefunktion, Benutzerinformationen in der Sitzung löschen
{% if current_user.is_authenticated() %} Hi {{ current_user.name }}! {% endif %}
{% if not current_user.is_authenticated() %}
Nachdem sich der Benutzer angemeldet hat, lautet der Wert
【Referenzdokument】
Englische Version von Flask-Login: http://flask-login.readthedocs.io/en/latest/