当前位置: 首页 > article >正文

【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

http://www.kler.cn/a/388044.html

相关文章:

  • 客户案例 | 如何利用Ansys工具提供互联系统(以及系统的系统),从而使“软件定义汽车”成为可能
  • 卸载一直显示在运行的应用
  • 快速学习Serde包实现rust对象序列化
  • 软件设计师-信息安全
  • 国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?
  • 吾店云介绍 – 中国人的WordPress独立站和商城系统平台
  • RandomWords随机生成单词
  • 「QT」几何数据类 之 QLineF 浮点型直线类
  • 前端入门一之DOM、获取元素、DOM核心、事件高级、操作元素、事件基础、节点操作
  • Spring Security @PreAuthorize @PostAuthorize 权限控制
  • 牛客小白月赛104——D.小红开锁
  • 机器人零位、工作空间、坐标系及其变换,以UR5e机器人为例
  • 大数据程序猿不可不看的资料大全
  • [AI] 深度学习的局限性:人工智能为什么仍然无法实现自主学习
  • 营业执照OCR识别API接口如何用PHP调用
  • RabbitMQ设置TTL(消息过期)时间(重要)
  • Linux(CentOS)安装 Nginx
  • Redis9:商户查询缓存3
  • 探索 Python 图像处理的瑞士军刀:Pillow 库
  • AC+AP 基本配置
  • 括号组合。(DFS)
  • 【前端打包秘籍】一文掌握webpack入口与出口的最佳实践 (9)
  • 超详细:三大范式设计+反范式设计+树
  • Java使用aspose导出pdf、字体乱码问题(小方块,不能识别中文)
  • 关于在GitLab的CI/CD中用docker buildx本地化多架构打包dotnet应用的问题
  • 06:(寄存器开发)对上电/复位的SystemInit函数进行分析