redirect和url_for联用
from flask import redirect
return redirect(url_for(login)) #直接调用login函数
在HTML中也可以使用url_for来实现跳转
使用cookie和session来实现。cookie只能存储少量数据,一般用来存储登录授权。
from flask import session
flask中的session是进过加密后存储在cookie中的。
session['user_id'] = user.id #存储一个id
在使用过时需要在config.py中设置加密字符串
SECRET_KEY = 'ASDJWEURIHsdfwerqrwqr' #随便写几个字符就行了
用于拦截session中设置得用户信息,以保持用户的登录状态
@app.before_request
def my_before_requset():
user_id = session.get('user_id')
获取user_id后在数据库中检查id是否存在,随后将其绑定在全局对象中
from flask import g
setattr(g,"user",user)
如果user不存在,为了后续运行不出错,我们需要给user设置一个none,在app.py中添加如下代码
#----钩子函数,用来从session中获取user_id
@app.before_request
def get_user_id():
user_id = session.get('user_id')
if user_id:
user = UserModel.query.get(user_id)
setattr(g,"user_id",user_id)
else:
setattr(g,"user_id",None) #为保证程序不出错,将帐号先设置为空
可以将一些共用的数据放在这里,如用户名。系统在渲染网页的时候会将这个信息传给网页
@app.context_processor
def my_processor():
return {"user":g.user}
bp.router("/logout")
def logout():
session.clear() #清除cookie
return render_templates('/')
且退出状态下不允许访问部分页面,需要进行重定向,需要使用装饰器
最后新建一个独立的decorators.py文件以方便其他模块调用
from functools import warps,redirect,url_for
from flask import g
def login_required(func):
@wraps(func) #保留函数func的信息
def inner(*args,**kwargs): #万能参数
# 已登录,正常执行
if hasattr(g,'user'):
return func(*args,**kwargs)
# 没登录,重定向初始页面
else:
return redirect(url_for('/'))
return inner()
装饰器的应用
from decorators import login_required
@bp.route('/')
@login_required
def welcome():
pass
在渲染网页的时候需要将整个列表返回给网页
return render_template("index.html",listques = questions)
传递给html后可以使用循环进行构建
{% for question in questions %}
-
表格内容
{% endfor %}
<\ul>