flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html

flask 框架基本使用(2):https://www.cnblogs.com/chichung/p/9761610.html

flask 框架基本使用(3):https://www.cnblogs.com/chichung/p/9762897.html

1. flask 框架的请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;
  • 在请求开始时,根据需求进行权限校验;
  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request

    • 在处理第一个请求前执行
  • before_request
    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request:
    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
  1. from flask import Flask
  2.  
  3. app = Flask(__name__)
  4.  
  5. @app.before_first_request
  6. def func1():
  7. """一般用于连接数据库"""
  8. print("项目运行最开始的代码")
  9.  
  10. @app.before_request
  11. def func2():
  12. """一般用于判断用户的权限,记录用户访问来源"""
  13. print("每一次用户访问时,在执行视图函数之前,调用这里的代码")
  14.  
  15. @app.after_request
  16. def func3(response): #这里要接收一个参数,表示响应报文
  17. """一般用于记录用户访问或者操作行为"""
  18. print("每一次用户访问时,在执行视图函数之后,调用这里的代码")
  19. return response #必须返回响应报文
  20.  
  21. @app.teardown_request
  22. def func4(error):
  23. """这里钩子,用于捕获程序中服务器发生的错误"""
  24. print("发生错误信息%s"%error)
  25.  
  26. @app.route("/")
  27. @app.route("/index")
  28. def index():
  29. return "主页"
  30.  
  31. if __name__ == '__main__':
  32. app.run()

2.主动抛出异常

abort 函数可以主动抛出异常,想要返回不存在的页面,只需要 abort(404) 即可。

示例:

  1. from flask import Flask,abort
  2.  
  3. app=Flask(__name__)
  4.  
  5. @app.route("/")
  6. def index():
  7. abort(404) #一旦执行了abort,后续的程序都会被终止
  8.  
  9. if __name__ == '__main__':
  10. app.run(debug=True)

3.捕获异常

在某些时候,你希望自己建的站出现404错误时,返回的不是一个简单的页面,而是一个很精致的404错误页面时,应该怎么做呢?这时候就需要捕获异常。

  1. from flask import Flask
  2.  
  3. app=Flask(__name__)
  4.  
  5. @app.errorhandler(404)
  6. def error_404(e):
  7. return "一个漂亮的404页面"
  8.  
  9. @app.route("/")
  10. def index():
  11. return "主页"
  12.  
  13. if __name__ == '__main__':
  14. app.run()

当用户访问你的网站时,如果访问到不存在的页面,就会返回一个很精致的404错误页面。

拓展:

@app.errorhandler( )也可以接受python的错误类型,例如,ZeroDivisionError等。

4. flask-script

通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。

python3 py文件 runserver -p [port] -h [host] ...

这时候的 web.py 要做一点修改。

  1. from flask import Flask
  2. from flask_script import Manager
  3.  
  4. app=Flask(__name__)
  5. manager=Manager(app)
  6.  
  7. @app.route("/")
  8. def index():
  9. return "主页"
  10.  
  11. if __name__ == '__main__':
  12. manager.run()

flask框架基本使用(4)(钩子函数,异常,命令行运行)的更多相关文章

  1. 第33课 main函数与命令行参数

    main函数的概念: 测试程序: 以上四种定义main函数的方法都是正确的. main函数的本质: 操作系统是希望main函数的有返回值的,这样可以知道main函数的退出状态. 如果程序时异常退出的, ...

  2. 解析main函数的命令行参数

    原创文章,转载请正确注明本文原始URL及作者. 介绍 写C/C++程序,我们常常需要把main函数的参数作为选项来传递.在linux中,解析选项有专门的函数可以用. int getopt(int ar ...

  3. UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串

    lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串.其声明如下, #include <stdlib.h> int system( ...

  4. getopt_long函数解析命令行参数

    转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...

  5. C++main函数与命令行参数,退出程序

    本文翻译自:https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019 (除动态链接库d ...

  6. Flask框架中特有的变量/函数及上下文

    模板中特有的变量和函数 你可以在自己的模板中访问一些 Flask 默认内置的函数和对象 config 你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_ ...

  7. mysql常用基础操作语法(十一)~~字符串函数【命令行模式】

    注:sql的移植性比较强,函数的移植性不强,一般为数据库软件特有,例如mysql有mysql的函数,oracle有oracle的函数. 1.concat连接字符串: 从上图中可以看出,直接使用sele ...

  8. main函数与命令行参数

    main函数的概念 C语言中main函数称之为主函数 一个c程序从main函数开始执行的 下面的main函数定义正确吗? main函数的本质 main函数是操作系统调用的函数 操作系统总是将main函 ...

  9. C++-main函数与命令行参数

    1.main函数的概念 C语言中main函数称之为主函数 —个C程序是从main函数开始执行的 下面的main函数定义正确吗? //1 main(){ } //2 void main(){ } //3 ...

随机推荐

  1. 十五、mac 中登陆mysql忘记密码解决办法

    mac 中登陆mysql忘记密码解决办法 1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter pa ...

  2. 《Cracking the Coding Interview》——第17章:普通题——题目11

    2014-04-29 00:00 题目:给定一个rand5()函数,能够返回0~4间的随机整数.要求实现rand7(),返回0~6之间的随机整数.该函数产生随机数必须概率相等. 解法:自己想了半天没想 ...

  3. postman与charles的结合使用

    1.准备charles环境 Charles端口一般配置的为8888,不知道怎么配置详见charles文档 打开charles,发现访问浏览器任意页面都是失败. 在浏览器的高级设置中设置代理服务器,以火 ...

  4. Pytest+allure+jenkins生成测试报告

    allure集成jenkins下载地址.下载相关版本的allure包 http://updates.jenkins-ci.org/download/plugins/allure-jenkins-plu ...

  5. SPOJ - DQUERY(区间不同数+树状数组)

    链接:SPOJ - DQUERY 题意:求给定区间不同数的个数(不更新). 题解:离线+树状数组. 对所求的所有区间(l, r)根据r从小到大排序.从1-n依次遍历序列数组,在树状数组中不断更新a[i ...

  6. django的F和Q对象

    F表达式和Q表达式: # 示例模型如下 class Book(models.Model): """图书模型""" name = models ...

  7. aes加密码

    js地址 https://github.com/yves8888/crypto-js 下面src<!DOCTYPE html> <html lang="en"&g ...

  8. 基于MAC OS 操作系统安装、配置hadoop

    在Mac上安装Hadoop 对我这个之前从未接触过*nix的用户来说,使用命令行来做一系列的事情还是废了一番功夫.特写这个记录,以做备份. 获取Java 我的Mac运行的操作系统是OS X 10.7 ...

  9. 使用pl/sql在oracle中新建表和对应序列

    1.登录后再Table节点右键新建表: 开始编辑表结构 列 键约束 检查约束 查看sql,没问题的话点击应用,创建表 2.创建序列sequence,在Sequence节点右键新建 填写内容 查看sql ...

  10. hdu 1195 Open the Lock (BFS)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...