Flask 身份验证的三种方法

1.在视图中添加判断

"""
在路由中添加身份验证
"""

from flask import Flask,render_template,request,redirect,session
app = Flask(__name__)
app.debug = True

@app.route('/login',methods=['GET','POST'],endpoint='l1') # endpoint用于url_for
def login():
    if request.method == "GET": # 当get方法访问登录页面,返回登录页面
        return render_template('login.html')
    else: # 当post方法访问时,则进行判断登录验证
        user = request.form.get('user')  # 获得form中name="user"对应的值
        pwd = request.form.get('pwd')  # 获得form中name="pwd"对应的值
        if user == 'wang' and pwd == '123':  # 判断用户,用户信息可以放在数据库内
            session['user_info'] = user  # 在session中添加登录的用户,在访问其他页面时可以使用
            return redirect('./index')
        return render_template('login.html',error='用户名或密码错误')  # 如果登录验证错误,则跳回本页面,并提示

@app.route('/index',methods=['GET'])
def index():
    user = session.get('user_info')
    if not user:
        return redirect('/login')# return redirect('/login')
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

2.使用装饰符


"""
通过装饰符做身份验证
"""

import functools
from flask import Flask,render_template,request,redirect,session
app = Flask(__name__)
app.debug = True
app.secret_key = "123"

@app.route('/login',methods=['GET','POST'],endpoint='l1') # endpoint用于url_for
def login():
    if request.method == "GET": # 当get方法访问登录页面,返回登录页面
        return render_template('login.html')
    else: # 当post方法访问时,则进行判断登录验证
        user = request.form.get('user')  # 获得form中name="user"对应的值
        pwd = request.form.get('pwd')  # 获得form中name="pwd"对应的值
        if user == 'wang' and pwd == '123':  # 判断用户,用户信息可以放在数据库内
            session['user_info'] = user  # 在session中添加登录的用户,在访问其他页面时可以使用
            return redirect('./index')
        return render_template('login.html',error='用户名或密码错误')  # 如果登录验证错误,则跳回本页面,并提示


def login(func): # 验证用户身份的装饰器
    @functools.wraps(func) # 作用是保持被装饰函数的函数名,因为url_for是根据函数名来的,如果不保持会报错,或者使用endpoint取别名
    def inner(*args,**kwargs):
        user = session.get('user_info')
        if not user:
            return redirect("/login")
        return func(*args,**kwargs)
    return inner

@app.route('/index',methods=['GET'])
@login
def index():
    return 'index'

if __name__ == '__main__':
    app.run()

3.使用before_request

"""
通过before_request来做身份验证

"""

from flask import Flask,render_template,request,redirect,session

app = Flask(__name__)
app.debug = True
app.secret_key = 'adsfasdf'

@app.before_request
def process_request(*args,**kwargs):
    if request.path == '/login':  # 如果是请求登录页面,则放行,否则会死循环,在这里可以配置白名单
        return None
    user = session.get('user_info')
    if user:  # 如果user存在则放行,否则重定向到登录页面
        return None
    return redirect('/login')

@app.route('/login',methods=['GET','POST'],endpoint='l1') # endpoint用于url_for
def login():
    if request.method == "GET": # 当get方法访问登录页面,返回登录页面
        return render_template('login.html')
    else: # 当post方法访问时,则进行判断登录验证
        user = request.form.get('user')  # 获得form中name="user"对应的值
        pwd = request.form.get('pwd')  # 获得form中name="pwd"对应的值
        if user == 'wang' and pwd == '123':  # 判断用户,用户信息可以放在数据库内
            session['user_info'] = user  # 在session中添加登录的用户,在访问其他页面时可以使用
            return redirect('/index')
        return render_template('login.html',error='用户名或密码错误')  # 如果登录验证错误,则跳回本页面,并提示

@app.route('/index',methods=['GET'])
def index():
    return 'index'

if __name__ == '__main__':
    app.run()

你可能感兴趣的:(flask)