一:flask的请求勾子

01:钩子概念说明:

  1. 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:
  2.  
  3. 在请求开始时,建立数据库连接;
  4.  
  5. 在请求开始时,根据需求进行权限校验;
  6.  
  7. 在请求结束时,指定数据的交互格式;
  8.  
  9. 为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。
  10.  
  11. 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
  12.  
  13. before_first_request
  14.  
  15. 在处理第一个请求前执行
  16.  
  17. before_request
  18.  
  19. 在每次请求前执行
  20.  
  21. 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  22.  
  23. after_request
  24.  
  25. 如果没有抛出错误,在每次请求后执行
  26.  
  27. 接受一个参数:视图函数作出的响应
  28.  
  29. 在此函数中可以对响应值在返回之前做最后一步修改处理
  30.  
  31. 需要将参数中的响应在此参数中进行返回
  32.  
  33. teardown_request
  34.  
  35. 在每次请求后执行
  36.  
  37. 接受一个参数:错误信息,如果有相关错误抛出

02:案例代码

  1. from flask import Flask
  2. from settings.dev import DevConfig
  3.  
  4. app = Flask(__name__)
  5.  
  6. # 项目配置
  7. app.config.from_object(DevConfig)
  8.  
  9. @app.before_first_request # 第一次请求之前
  10. def before_first_request():
  11. print("--before_first_request--")
  12. print("系统初始化就执行这个钩子方法")
  13. print("会在接收到第一个客户端请求时,执行这里的代码")
  14.  
  15. @app.before_request # 每一次请求之前
  16. def before_request():
  17. print("----before_request----")
  18. print("每一次接收到客户端请求时,执行这个钩子方法")
  19. print("一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据")
  20.  
  21. @app.after_request
  22. def after_request(response):
  23. print("----after_request----")
  24. print("在处理请求以后,执行这个钩子方法")
  25. print("一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作")
  26.  
  27. response.headers["Content-Type"] = "application/json" # 指定响应体的返回格式是json
  28.  
  29. # 必须返回response
  30. return response
  31.  
  32. @app.route("/test00")
  33. def index22():
  34. print("index 视图函数")
  35. print("index 被执行了")
  36.  
  37. return "视图函数index被执行"
  38.  
  39. if __name__ == '__main__':
  40. app.run()

案例打印结果:

第一次请求时打印的结果:

  1. --before_first_request--
  2. 系统初始化就执行这个钩子方法
  3. 会在接收到第一个客户端请求时,执行这里的代码
  4. ----before_request----
  5. 每一次接收到客户端请求时,执行这个钩子方法
  6. 一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据
  7. index 视图函数
  8. index 被执行了
  9. ----after_request----
  10. 在处理请求以后,执行这个钩子方法
  11. 一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作

第二次请求时的打印结果

  1. ----before_request----
  2. 每一次接收到客户端请求时,执行这个钩子方法
  3. 一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据
  4. index 视图函数
  5. index 被执行了
  6. ----after_request----
  7. 在处理请求以后,执行这个钩子方法
  8. 一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作

二:flask的异常捕获

01:主动主动抛出HTTP异常(需要引入abort )

案例代码:
  1. from flask import Flask,abort
  2. from settings.dev import DevConfig
  3.  
  4. app = Flask(__name__)
  5.  
  6. # 项目配置
  7. app.config.from_object(DevConfig)
  8.  
  9. @app.route("/testyy")
  10. def index44():
  11. abort(400)
  12.  
  13. return "abort() 状态码报错测试"
  14.  
  15. if __name__ == '__main__':
  16. app.run()

浏览器运行后的结果显示:(不同的转台吗显示不同的报错内容)

  1. 抛出状态码的话,只能抛出 HTTP 协议的错误状态码

400

500

02:捕获异常,错误

自定义异常信息案例代码:

  1. from flask import Flask,abort
  2. from settings.dev import DevConfig
  3.  
  4. app = Flask(__name__)
  5.  
  6. # 项目配置
  7. app.config.from_object(DevConfig)
  8.  
  9. #自定义异常信息
  10. @app.errorhandler(500)
  11. def internal_server_error(e):
  12. return "<h1>服务器搬家。。。</h1>"
  13.  
  14. @app.route("/testqq")
  15. def index55():
  16. print("自定义异常错误信息")
  17. abort(500)
  18.  
  19. return "自定义异常测试"
  20.  
  21. if __name__ == '__main__':
  22. app.run()

案例显示结果:

03:捕获指定异常(raise   Exception)

案例代码

  1. from flask import Flask,abort
  2. from settings.dev import DevConfig
  3.  
  4. app = Flask(__name__)
  5.  
  6. # 项目配置
  7. app.config.from_object(DevConfig)
  8.  
  9. @app.errorhandler(Exception)
  10. def zero_division_error(e):
  11.  
  12. return "除数不能为0"
  13.  
  14. @app.route("/testtt")
  15. def testtt():
  16.  
  17. print("testtt被执行")
  18. raise Exception(zero_division_error)
  19. return "testtt被执行了。。。"
  20.  
  21. if __name__ == '__main__':
  22. app.run()

案例显示结果:

三:flask的上下文

01:上下文的理解

  1. 作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。
  2.  
  3. Flask中有两种上下文,请求上下文(request context)和应用上下文(application context)。
  4.  
  5. Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。
  6.  
  7. 1. *application* 指的就是当你调用`app = Flask(__name__)`创建的这个对象`app`
  8. 2. *request* 指的是每次`http`请求发生时,`WSGI server`(比如gunicorn)调用`Flask.__call__()`之后,在`Flask`对象内部创建的`Request`对象;
  9. 3. *application* 表示用于响应WSGI请求的应用本身,*request* 表示每次http请求;
  10. 4. *application*的生命周期大于*request*,一个*application*存活期间,可能发生多次http请求,所以,也就会有多个*request*

02:请求上下文 (request context) 和应用上下文 (application context)

请求上下文 (request context):

  1. flask 中,可以直接在视图函数中使用 **request** 这个对象进行获取相关数据,而 **request** 就是请求上下文的对象,保存了当前本次请求的相关数据,
    请求上下文对象有:requestsession
  2.  
  3. - request
  4. - 封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
  5. - session
  6. - 用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。

应用上下文(application context):

  1. 它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy
    它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。
  2.  
  3. 应用上下文对象有:current_appg

两者区别:

  1. - 请求上下文:保存了客户端和服务器交互的数据
  2. - 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

四:Flask-Script 扩展

01:安装Flask-Script

  1. pip install flask-script

02:集成 Flask-Script到flask应用中

  1. from flask import Flask
  2. from flask_script import Manager
  3.  
  4. app = Flask(__name__)
  5.  
  6. # 把 Manager 类和应用程序实例进行关联
  7. manager = Manager(app)
  8.  
  9. @app.route('/')
  10. def index():
  11. return 'hello world'
  12.  
  13. if __name__ == "__main__":
  14. manager.run()

03: 增加一个命令行,当我们执行 python manage.py test的时候,也会启动服务端

代码:

  1. from flask import Flask
  2. from settings.dev import DevConfig
  3.  
  4. from flask_script import Manager, Command
  5.  
  6. app = Flask(__name__)
  7.  
  8. # 项目配置
  9. app.config.from_object(DevConfig)
  10.  
  11. manage = Manager(app)
  12.  
  13. # 自定义命令行
  14. class Hello(Command):
  15. """打印hello的自定义命令"""
  16.  
  17. def run(self):
  18. print("hello 命令执行了...")
  19.  
  20. manage.add_command("test", Hello())
  21.  
  22. @app.route("/mag")
  23. def magtest():
  24. return "Hello tom!"
  25.  
  26. if __name__ == '__main__':
  27. # app.run() # 原来的启动方式
  28. manage.run()

通过查询可以看到我么增加的一个命令行:

但是在terminal终端执行的时候,一直会报错显示:

  1. SyntaxError: Non-ASCII character '\xe9' in file manage.py on line 8, but no encoding declared; see http://python.org/dev/peps/p
  2. ep-0263/ for details

待解决。。。

flask总结03的更多相关文章

  1. Flask基础(03)-->创建第一个Flask程序

    # 导入Flask from flask import Flask # 创建Flask的应用程序 # 参数__name__指的是Flask所对应的模块,其决定静态文件从哪个地方开始寻找 app = F ...

  2. Python-S9-Day124-爬虫&微信

    01 今日内容概要 02 内容回顾:flask上下文 03 内容回顾:多app应用 04 内容回顾:面向对象和数据库 05 内容回顾:爬虫 06 Web微信:获取二维码(一) 07 Web微信:获取二 ...

  3. 学习python-20191208(1)-Python Flask高级编程开发鱼书_第03章_数据与flask路由

    视频01: 略...... ———————————————————————————————————————————————————————————— 视频02: 搜索需要外部数据源,也就是需要外部的A ...

  4. flask --- 03 .特殊装饰器, CBV , redis ,三方组件

    一.特殊装饰器(中间件) 1.before_request 在请求进入视图函数之前 @app.before_request def look(): 2. after_request 在结束视图函数之后 ...

  5. 03 flask数据库操作、flask-session、蓝图

    ORM ORM 全拼Object-Relation Mapping,中文意为 对象-关系映射.主要实现模型对象到关系数据库数据的映射. 1.优点 : 只需要面向对象编程, 不需要面向数据库编写代码. ...

  6. Flask学习笔记03之路由

    1. endpoint from flask import Flask, url_for # 实例化一个Flask对象 app = Flask(__name__) # 打印默认配置信息 # 引入开发环 ...

  7. 学习python-20191208(2)-Python Flask高级编程开发鱼书_第03章_数据与flask路由

    视频06: 定义静态方法的两种方式: 1.在方法上方加上装饰@staticmethod 2.在方法上方加上装饰@classmethod  方法中要加参数cls  如:def search_by_isb ...

  8. Flask接口开发过程中的心得2019.10.03

    完善了一下慕课网实战中的post接口开发,得到了一些进步: 代码如下: #coding=utf-8 from flask import Flask from flask import request ...

  9. 03 flask源码剖析之threading.local和高级

    03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...

随机推荐

  1. Mac设置Root密码

    [Mac设置Root密码] Mac系统重新设置root用户密码 如果不知道root用户密码,需要重设.   命令[sudo passwd root ]   然后提示你输入当前登录用户密码,通过以后, ...

  2. 125. Valid Palindrome判断有效的有符号的回文串

    [抄题]: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...

  3. SVN下载地址及注意事项

    SVN下载地址:VisualSVN:http://www.visualsvn.com/server/download     服务器端(添加仓库和用户)TortoiseSVN:http://torto ...

  4. BBS后台发送邮件&修改文章

    一:Django发送邮件 在setting中配置 # EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST ...

  5. 使用jQuery完成表单验证

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>注 ...

  6. Mac10.9下的libtiff编译

    libtiff介绍 libtiff下载 libtiff编译 libtiff介绍? 参考:http://en.wikipedia.org/wiki/Tiff libtiff下载 直接到官网下载:http ...

  7. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  8. [转]windows7远程桌面连接失败:发生身份验证错误。要求的函数不受支持

    转至:https://jingyan.baidu.com/article/d169e18604ca86436611d821.html 系统升级后出现远程连接报错,“发生身份验证错误.要求的函数不受支持 ...

  9. [.net 多线程]Task

    C# 异步编程Task整理(一) c# .Net并行和多线程编程之Task学习记录! .NET 实现并行的几种方式(一) Dispatcher介绍 [C#学习笔记]使用C#中的Dispatcher 用 ...

  10. [.net 多线程]Barrier

    当需要[一组任务]并行地运行一连串的阶段,但是每一个阶段都要等待所有他任务完成前一阶段之后才能开始,可以通过Barrier实例来同步这一类协同工作.Barrier初始化后,将等待特定数量的信号到来,这 ...