会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132358个问题
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask视图高级 181楼


这个是一个简单的捕获网页渲染完毕的耗时统计
 并且写入到了加入了日志  用于测试
'''


#引入我们的template_rendered这变量 待会儿用于监听信号
from flask import Flask,template_rendered,render_template,before_render_template,g
import time

app=Flask(__name__)

@app.route('/')   #定义一个首页路由
def index():
    return render_template('index.html')  #在这个路由里面 我放入了一些视频和图片 地址都是网络地址

@app.route('/home/')
def home():
    return render_template('home.html')  ##在这个路由里面 我放入了很多图片 地址也都是网络地址


#在页面渲染之前的钩子函数  记录开始的时间
def start_msg(sender,template,context):
    start_time = time.time()
    print(start_time,111111)
    #保存到我们的g变量中
    g.stime=start_time
before_render_template.connect(start_msg)    

#在页面渲染完毕的钩子函数  记录页面渲染完毕的时间  
# 拿到不同高度时间 然后写入日志 
def page_loading_log(sender,template,context):
    end_time = time.time()
    print(end_time,222222)
    print(f'{end_time-g.stime}',template,':这是页面渲染的时间')
    #当我们进入home的时候 这里打印的:
     #0.0010037422180175781<Template 'home.html'> :这是页面渲染的时间
     #当我们进入/这里打印的:
    #0.001003742218017578 <Template 'index.html'> :这是页面渲染的时间
    #由此可以拿到了进入不同页面 返回的不同的渲染时间 
    # 然后我们就可以写入log日志了 
template_rendered.connect(page_loading_log)
 
if __name__=='__main__':
    app.run(debug=True)

总结

#template_rendered 这个是视图渲染之后 发送的信号 
#我的理解是相当于 vue中的 mounted生命周期函数  DOM视图渲染完毕之后
#这个在vue中最常用。可以说是最核心的生命周期函数 在学习vue项目的时候
 这玩意天天用 几乎达到了离不开它的地步
 
'''
因为 DOM树 也就是元素标签 必须在视图渲染之后我们才能拿到
所以我们这个函数里面使用的逻辑 通常都是对DOM树的操作 
而flask并不能直接操作DOM树  相对比用vue操作dom树 或者js直接操作
 更加的便捷


我想了半天 这玩意在flask中可以干嘛?
终于让我想到了:
可以帮我们检测性能?比如网页渲染完毕的耗时?

之后的学习 应该还能找到这个钩子函数更多的用途把

Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask高级 183楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask之Jinja2模版 185楼

钩子函数好绕脑啊  还都是回调函数的用法

然后这些好抽象,好抽象啊   我盘了一天的逻辑 


老师您看我的理解 偏差大么?



flask 里面内置的信号

(相当于是对befor_request 和errorhandler等钩子函数 功能的补充)


1,before_render_template  模板渲染之前的信号  

    概念的理解:

相当于成vue 的DOM视图渲染之前  也就是 beforeMount(()=>{}) 的生命周期函数

    然后我们可以在这个信号的回调函数里面去实现相应的逻辑业务

    所以我在这个钩子函数中在写了一个简单的屏蔽非法字符的示例  


   



2,template_rendered     模板渲染之后的信号    

相当于vue的   DOM视图渲染完成之后  mounted 的生命周期函数

这玩意在vue中可以说太常用了 甚至达到了离不开他的地步,

但是由于我们flask不能直接操作DOM树 相比较用它去操作dom,干脆直接在js里去操作

但是我想到了 可以用它写了一个简单的监听 页面渲染完毕之后的性能示例  

之后的学习应该还能找到更多的用途把。



3,request_started     路由发送请求开始  在到达视图函数之前的信号  

# 约莫相当于vue中的前置路由守卫 ?  router.beforeEach((to, from, next)

这个里面我们应该可以填入一些 登录权限验证  但是感觉这个并不是常用的

因为它可以实现的业务  貌似我们用普通装饰器 或者在视图函数中都可以实现 




4,request_finished   请求结束时 在响应发送客户端之前的的时候

  那么我们在这个这个节点 获取用户的ip 然后统计到日志中 应该挺恰当的

毕竟请求已经结束了 我们写入日志 并不会影响请求的处理时间 




5,request_tearing_down  请求对象销毁的时候 发送的信号  相当于Vue的beforeDestroy 。都是在组件销毁之前发送的信号 

6,got_request_exception  请求过程中抛出异常时候 发送的信号  相当于vue中的errorCaptured  捕获错误

以上2个我们二选一  就是我们课堂说的可以捕获错误日志   这个是理解了



7,关于上下文对象还是朦朦胧胧的 感觉就挺神奇的 但是摸不着 所以它的信号触发节点 可以用来干嘛 还是不太清楚  我说理解的上下文对象 就是感觉是一个桥梁 可以传递数据  然后这个它里面的这个before_request 

每次发送请求的时候都会触发 这个感觉实用性好大!


滤的头昏脑胀的 越来越迷糊了





Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask高级 186楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask视图高级 187楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask高级 188楼
Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask高级 191楼

老师 你好 。我这边 关闭debug 后 ,在蓝图 和APP 中都 无法捕捉到异常了 ,麻烦老师帮我看下

# coding=utf-8
# @Time   : 2020/3/11 10:03
# @Software  PyCharm
from flask import request, g, jsonify, Flask
from flask import current_app
from logging import getLogger
import traceback

from werkzeug.exceptions import HTTPException

logger = getLogger("mylog")


def load_middleware(app: Flask):
    @app.before_request
    def before():
        res = request.json
        g.data = request.json.get('data')
        g.params = request.json.get('params')

        # logger.info("请求参数{}".format(request.json))

    @app.errorhandler(Exception)
    def do(e):
        # current_app.config["DEBUG"]=False

        print(e)
        data = dict(code=2000, message="系统异常", partnerId=3, result=None)
        return jsonify(data)

    @app.after_request
    def after(response):
        # logger.info(f"返回{response}")
        return response
from flask import Blueprint, jsonify
from flask_restful import Api

order = Blueprint("order", __name__)
mock = Blueprint("mock", __name__)


def init_view(app):
    # 注册蓝图
    app.register_blueprint(order)
    app.register_blueprint(mock)


@mock.app_errorhandler(Exception)
def do():
    return jsonify({"code": 10900})


@mock.errorhandler(Exception)
def do_1():
    return jsonify({"code": 1000})


orderApi = Api(order)
mockApi = Api(mock)

from hotel_mock.views.orders import OrderCheck, OrderBooking, OrderCancel, OrderQuery, OrderReminder
from hotel_mock.views.mocks import AddCheckHotelList, AddBookingHotelList, AddCancelType, AddRefundInfo

orderApi.add_resource(OrderCheck, "/OrderCheck/")
orderApi.add_resource(OrderBooking, "/OrderBooking/")
orderApi.add_resource(OrderCancel, "/OrderCancel/")
orderApi.add_resource(OrderQuery, "/OrderQuery/")
orderApi.add_resource(OrderReminder, "/OrderReminder/")

# 注册mock 模块的url
mockApi.add_resource(AddCheckHotelList, "/addHotel/")
mockApi.add_resource(AddBookingHotelList, "/addBookingList/")
mockApi.add_resource(AddCancelType, "/addCancelType/")
mockApi.add_resource(AddRefundInfo, "/addRefundInfo/")


Python 全系列/第八阶段:轻量级Web开发利器-Flask框架/Flask高级 192楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637