Flask-1-06-script扩展

Posted hannibal-2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask-1-06-script扩展相关的知识,希望对你有一定的参考价值。

在学习扩展之前,先介绍几个概念,自己的思路还不是很清晰,所以暂时还没办法做过多的讲解

请求上下文与应用上下文

请求上下文 (request context)

  • request

  • session

应用上下文(application context)

  • current_app

  • g (处理请求时,用于临时存储的对象,每次请求都会重设这个变量)

请求钩子

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

 

  • before_first_request:在处理第一个请求前运行。 @app.before_first_request

 

  • before_request:在每次请求前运行。 @app.before_request

 

  • after_request(response):如果没有未处理的异常抛出,在每次请求后运行。 @app.after_request

 

  • teardown_request(response):在每次请求后运行,即使有未处理的异常抛出。 @app.teardown_request 注释:需要在生产模式下,也就是debug=False的时候

简单的示例:

 

# coding:utf-8

from flask import Flask

app = Flask(__name__)


@app.route("/index")
def index():
    print("index 执行了")
    return index page


@app.before_first_request
def before_first_request_function():
    """在第一次请求处理之前先被执行"""
    print("before first request function 执行了")


@app.before_request
def before_request_function():
    """在每次请求之前都被执行"""
    print("before request function 执行了")


@app.after_request
def after_request_function(response):
    """在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常"""
    print("after request function 执行了")
    return response


@app.teardown_request
def teardown_request_function(response):
    """在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False"""
    print("teardown request function 执行了")


if __name__ == __main__:
    app.run(host=0.0.0.0)

 

# 展示结果
(Flask_py) python@python-VirtualBox:~/code$ python hook_demo.py 
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
before first request function 执行了
before request function 执行了
index 执行了
after request function 执行了
teardown request function 执行了
127.0.0.1 - - [24/Jul/2019 19:39:20] "GET /index HTTP/1.1" 200 -

 

 

Flask-Script 扩展脚本


 

安装

pip install Flask-Script

添加启动脚本Manager

# coding:utf-8

from flask import Flask
from flask_script import Manager   # 启动命令的管理类


app = Flask(__name__)

# 创建Manager管理类的对象
manager = Manager(app)


@app.route("/index")
def index():
    return "index page"


if __name__ == __main__:
    # app.run(debug=True)
    # 通过管理对象来启动flask
    manager.run()

在终端启动之前我们可以通过help查看帮助信息

(Flask_py) python@python-VirtualBox:~/code$ python flask_scirpt_demo.py --help
usage: flask_scirpt_demo.py [-?] shell,runserver ...

positional arguments:
  shell,runserver
    shell            Runs a Python shell inside Flask application context.
    runserver        Runs the Flask development server i.e. app.run()

optional arguments:
  -?, --help         show this help message and exit

可以看出有两个命令可供我们选择,选定runserver再次通过help来查看帮助信息

(Flask_py) python@python-VirtualBox:~/code$ python flask_scirpt_demo.py runserver --help
usage: flask_scirpt_demo.py runserver [-?] [-h HOST] [-p PORT] [--threaded]
                                      [--processes PROCESSES]
                                      [--passthrough-errors] [-d] [-D] [-r]
                                      [-R]

Runs the Flask development server i.e. app.run()

optional arguments:
  -?, --help            show this help message and exit
  -h HOST, --host HOST
  -p PORT, --port PORT
  --threaded
  --processes PROCESSES
  --passthrough-errors
  -d, --debug           enable the Werkzeug debugger (DO NOT use in production
                        code)
  -D, --no-debug        disable the Werkzeug debugger
  -r, --reload          monitor Python files for changes (not 100const:
                        True, help: monitor Python files for changes (not
                        100% safe for production use), option_strings:
                        [-r, --reload], dest: use_reloader,
                        required: False, nargs: 0, choices: None,
                        default: None, prog: flask_scirpt_demo.py
                        runserver, container: <argparse._ArgumentGroup
                        object at 0x7f2a3e8db290>, type: None, metavar:
                        Noneafe for production use)
  -R, --no-reload       do not monitor Python files for changes

启动并且指定 host:0.0.0.0 port :12345  并且通过本地ip或者127.0.0.1访问 

(Flask_py) python@python-VirtualBox:~/code$ python flask_scirpt_demo.py runserver -h 0.0.0.0 -p 12345
 * Running on http://0.0.0.0:12345/ (Press CTRL+C to quit)
127.0.0.1 - - [24/Jul/2019 20:00:43] "GET /index HTTP/1.1" 200 -
127.0.0.1 - - [24/Jul/2019 20:00:43] "GET /favicon.ico HTTP/1.1" 404 -

 展示结果:

技术图片

除了runserver这个选项还有一个就是shell这个选项

技术图片

就是进入了ipython这个编译器在这里你不需要导入flask_script_demo这个模块就可以直接是用它

技术图片

 

以上是关于Flask-1-06-script扩展的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )

GroovyGroovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )

003-正则的扩展数值的扩展函数的扩展数组的扩展对象的扩展

GroovyGroovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )

GroovyGroovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )

Kotlin扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )