Flask 학습 여정을 계속하세요. 오늘은 플라스크의 로그인 관리 모듈을 소개하겠습니다. 이전 글의 작은 블로그 프로젝트를 기억하시나요? 로그인은 아마도 다음과 같은 단계로 구성되어 있을 것입니다.
1. 로그인 상자에 사용자 이름과 비밀번호를 입력하세요2. 플라스크 보기 기능은 사용자 비밀번호를 얻은 후 데이터베이스에서 사용자 정보를 조회하여 일치합니다
3. 성공하면 세션에 작성하고 홈페이지로 리디렉션합니다
4. 특정 보기에 접근하기 위해 로그인해야 하는 경우, 각 보기 기능에서 해당 세션에 사용자가 존재하는지 확인해야 합니다.
오늘 우리는 블로그 프로젝트를 계속해서 변화시키고 있습니다. 이는 비즈니스와 덜 관련된 공개 기능을 처리하는 데 도움이 됩니다.
현재 활성 사용자 ID를 세션에 저장하여 자유롭게 로그인 및 로그아웃할 수 있습니다.
로그인(또는 로그아웃)한 사용자가 액세스할 수 있는 보기를 제한할 수 있습니다.
까다로운 "기억하기" 기능을 다루고 있습니다.
쿠키 도난으로부터 사용자 세션을 보호하는 데 도움이 됩니다.
나중에 사용할 수 있는 Flask-Principal 또는 기타 인증 확장과 통합될 수 있습니다.
1. 플라스크 로그인 모듈은 어떻게 사용하나요?
1. 플라스크 로그인 설치
E:workdirdct-server-5055187src>pip install flask-login
2.1) /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()
사용자 클래스를 쉽게 구현하려면 이러한 모든 메서드의 기본 구현을 제공하는 UserMixin에서 상속하면 됩니다. 여기서는 이를 구현하기 위해 UserMixin을 사용합니다.
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: 이 데코레이터는 제한된 보기에 액세스하기 위한 로그인이 없는 경우 __init__의 login_manager.login_view = "login"에 의해 제어되는 로그인 페이지로 이동합니다. 삐
login_user(user): 로그인 확인을 위해 사용자 개체를 전달하고, 맞으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
logout_user(): 로그아웃 기능, 세션 내 사용자 정보 삭제
{% if current_user.is_authenticated() %} Hi {{ current_user.name }}! {% endif %}
{% if not current_user.is_authenticated() %}
사용자가 로그인한 후 값은
입니다.
【참고자료】
Flask-로그인 영어 버전: http://flask-login.readthedocs.io/en/latest/