> 백엔드 개발 > 파이썬 튜토리얼 > Flask 프레임워크 학습 가이드 사용자 로그인 관리

Flask 프레임워크 학습 가이드 사용자 로그인 관리

WBOY
풀어 주다: 2016-12-05 13:27:22
원래의
1655명이 탐색했습니다.

Flask 학습 여정을 계속하세요. 오늘은 플라스크의 로그인 관리 모듈을 소개하겠습니다. 이전 글의 작은 블로그 프로젝트를 기억하시나요? 로그인은 아마도 다음과 같은 단계로 구성되어 있을 것입니다.

1. 로그인 상자에 사용자 이름과 비밀번호를 입력하세요

2. 플라스크 보기 기능은 사용자 비밀번호를 얻은 후 데이터베이스에서 사용자 정보를 조회하여 일치합니다

3. 성공하면 세션에 작성하고 홈페이지로 리디렉션합니다

4. 특정 보기에 접근하기 위해 로그인해야 하는 경우, 각 보기 기능에서 해당 세션에 사용자가 존재하는지 확인해야 합니다.

오늘 우리는 블로그 프로젝트를 계속해서 변화시키고 있습니다. 이는 비즈니스와 덜 관련된 공개 기능을 처리하는 데 도움이 됩니다.

현재 활성 사용자 ID를 세션에 저장하여 자유롭게 로그인 및 로그아웃할 수 있습니다.

로그인(또는 로그아웃)한 사용자가 액세스할 수 있는 보기를 제한할 수 있습니다.
까다로운 "기억하기" 기능을 다루고 있습니다.
쿠키 도난으로부터 사용자 세션을 보호하는 데 도움이 됩니다.
나중에 사용할 수 있는 Flask-Principal 또는 기타 인증 확장과 통합될 수 있습니다.

1. 플라스크 로그인 모듈은 어떻게 사용하나요?

1. 플라스크 로그인 설치

E:workdirdct-server-5055187src>pip install flask-login

2. 플라스크 로그인을 사용하세요

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))

로그인 후 복사

2.2) User 모델 수정(빨간색 부분이 새로운 코드)

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

사용자가 인증되면, 즉 유효한 증명이 제공되면 True를 반환합니다(인증된 사용자만 login_required 조건을 충족합니다.)


is_active

활성 사용자이고 확인되었으며, 계정이 활성화되고, 비활성화되지 않았으며, 계정 거부를 위한 애플리케이션 조건을 충족하지 않으면 True를 반환합니다. 비활성 계정은 로그인할 수 없습니다(물론 강제로 로그인하지 않는 한).


is_anonymous

익명 사용자인 경우 True 를 반환합니다. (실제 사용자는 False 를 반환해야 합니다.)


get_id()

사용자를 고유하게 식별하고 user_loader 콜백에서 사용자를 로드하는 데 사용할 수 있는 유니코드를 반환합니다. 유니코드여야 합니다. ID가 원래 int 또는 다른 유형인 경우 유니코드로 변환해야 합니다.

사용자 클래스를 쉽게 구현하려면 이러한 모든 메서드의 기본 구현을 제공하는 UserMixin에서 상속하면 됩니다. 여기서는 이를 구현하기 위해 UserMixin을 사용합니다.

2.3) 보기 기능 수정(빨간색 부분이 새로운 부분입니다)

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'))

로그인 후 복사

Flask-login을 통해 로그인을 관리합니다. 코드는 매우 간단하고 간단합니다.

@login_required: 이 데코레이터는 제한된 보기에 액세스하기 위한 로그인이 없는 경우 __init__의 login_manager.login_view = "login"에 의해 제어되는 로그인 페이지로 이동합니다. 삐

login_user(user): 로그인 확인을 위해 사용자 개체를 전달하고, 맞으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
logout_user(): 로그아웃 기능, 세션 내 사용자 정보 삭제

2.4) 템플릿에서 사용자 참조


{% if current_user.is_authenticated() %}
 Hi {{ current_user.name }}!
{% endif %}
로그인 후 복사
이전 레이아웃.html 및 show_entries.html 템플릿에서 사용자가 로그인했는지 확인하는 방법을 플라스크 로그인의 방법으로 변경합니다.

{% if not current_user.is_authenticated() %}

current_user 값: 사용자가 로그인하지 않은 경우 값은 , 이는 익명 사용자입니다

사용자가 로그인한 후 값은
입니다.

물론, 사용자 로그인도 실제 상황에 따라 맞춤화할 수 있으며, 자세한 내용은 일일이 설명하지 않습니다.

【참고자료】


Flask-로그인 중국어 버전: http://www.pythondoc.com/flask-login/#id1

Flask-로그인 영어 버전: http://flask-login.readthedocs.io/en/latest/

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿