【flask web】补充内容,session、全局对象g、装饰器、钩子函数。
一、服务器中的session以及浏览器中的cookie
1、flask中要使用session的话需要在配置文件中的SECRET_KEY,这个secret_key是用来加密字符串的。
服务器中的session就是浏览器中的cookie
app.secret_key = “加密字符串"
2、session在flask中的使用
#设置session
session[“username”] = “”
#读取session
result = session[“res”]
Session.get(‘res')
#删除session
session.pop(‘username’)
#清除session中的所有内容
session.clear()
2、session还可以设置session过期时间,一般不设置的话就是浏览器关闭就是结束了。
#设置session.permanent的属性为True,就可以设置过期时间为31天(默认)
session.permanent = True
#也可以手动调
#导入包
from datetime import timedelta
#配置有效时间
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
#设置过期时间
session.permanent = True
二、钩子函数
钩子函数函数的作用:在正常执行的代码中,插入一段自己想要执行的代码。
例如:
#在处理项目的第一个请求前执行,项目启动后会执行
@app.before_first_request
#before_request 在每次请求前会执行
@app.before_request
#在每次请求完成后执行
@app.after_request
#不管是否有异常,注册的函数都会在每次请求之后执行
@app.teardown_request
#不管是否有异常,注册的函数都会在每次请求之后执行
@app.teardown_appcontent
#自定义过滤器
@app.template_filter
#上下文处理器,如果一些在很多模版中都要用到的变量,那么就可以用这个钩子函数来返回
@app.context_processor
def my_context_process():
return {'user':g.user}
三、装饰器
作用:定义一个函数,用来为其他函数添加额外的功能
#导入包
from functors import wraps
#定义,func是在被注释的函数,这个装饰器是判断是否已经登陆,如果没有则跳转到登录页面
def before_open_verify(func):
#保留func的信息
@wraps(func)
#这里的参数是 输入到func里面的参数
def inner(*args,**kwargs):
if g.user is None:
return redirect(url_for("auth.login_page"))
else:
res = func(*args,**kwargs)
return res
return inner
#使用
@bp.route("/qa/detail/<qa_id>",methods=["GET","POST"])
@before_open_verify
def qa_detail(qa_id):
if request.method == "GET":
question = QuestionModel.query.get(qa_id)
return render_template("detail.html",question = question)
else:
answer = AnswerModel(question_id = qa_id, author_id = g.get("user").id,
answer_content = request.form["content"],answer_time = datetime.now())
db.session.add(answer);
# 3. 将db.session中的改变同步到数据库中
db.session.commit();
return redirect(url_for("qa.qa_detail",qa_id=qa_id))
四、全局变量g
生命周期:单个request请求处理期间生效
#导入包
from flask import g
#设置全局变量
setattr(g, “user", user)
g.user = user
#判断是否有某个属性
hasattr(g,”user”)
If g.user == None
#获取某个属性
getattr(g,”user”)
g.user