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()
也可以使用装饰符
"""
通过装饰符做身份验证
"""
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()
2.使用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()