flask框架的教程--程序的基本结构[二]

Posted gaidy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask框架的教程--程序的基本结构[二]相关的知识,希望对你有一定的参考价值。

一个简单的程序

from flask import Flask

# 实例化app 对象
app = Flask(__name__)


@app.route(/)
def index():
    return "<h1>hello Gaidy</h1>"


if __name__ == __main__:
    app.run()

运行结

技术分享图片

程序和请求上下文

为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象 变为全局可访问。Falsk 使用上下文让特定的变量在一个线程中全局 可访问,与此同时却不会干扰其他线程。

from flask import Flask

# 实例化app 对象
from flask import request

app = Flask(__name__)


@app.route(/)
def index():
    user_agent = request.headers.get("User-Agent")
    return %s % user_agent


if __name__ == __main__:
    app.run()

运行结果

技术分享图片

Flask上下文全局变量

Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程 序上下文被推送后,就可以在线程中使用 current_app 和 g 变量

变量名           上下文                说明
current_app    程序上下文      当前激活程序的程序实例
g              程序上下文      处理请求时用作临时存储的对象。每次请求都会重设这个变量
request        请求上下文      请求对象,封装了客户端发出的 HTTP 请求中的内容
session        请求上下文       用户会话,用于存储请求之间需要“记住”的值的词典

请求调度

 

程序收到客户端发来的请求时,要找到处理该请求的视图函数。为了完成这个任务,Flask 会在程序的 URL 映射中查找请求的 URL。URL 映射是 URL 和视图函数之间的对应关系。 Flask 使用 app.route 修饰器或者非修饰器形式的 app.add_url_rule() 生成映射。Flask 为每个路由都指 定了请求方法,这样不同的请求方法发送到相同的 URL 上时,会使用不同的视图函数进 行处理。

查看Flask程序中的URL映射

app.url_map

请求钩子

请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g

1) before_first_request : 注册一个函数,在处理第一个请求之前运行

2) before_request : 注册一个函数,在每次请求之前运行

3) after_request : 注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行

4) teardown_request : 注册一个函数,即使有未处理的异常抛出,在每次请求之后

配置初始化相关参数

  • import_name
    • Flask程序所在的包(模块),传 __name__ 就可以
    • 其可以决定 Flask 在访问静态文件时查找的路径
  • static_path
    • 静态文件访问路径(不推荐使用,使用 static_url_path 代替)
  • static_url_path
    • 静态文件访问路径,可以不传,默认为:/ + static_folder
  • static_folder
    • 静态文件存储的文件夹,可以不传,默认为 static
  • template_folder
    • 模板文件存储的文件夹,可以不传,默认为 templates

配置DEBUG方法1

from flask import Flask

# 实例化app 对象
from flask import request

app = Flask(__name__)


# DEBUG 调试模式可以报出错误的具体信息
class Config(object):
    DEBUG = True


# 从对象中加载配置   
app.config.from_object(Config)


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


if __name__ == __main__:
    app.run()

配置方法2

app.run(host="0.0.0.0", port=5000, debug = True)

配置方法3

# 创建 Flask 类的对象,指向程序所在的包的名称
app = Flask(__name__)

# 从配置文件中加载配置
app.config.from_pyfile(config.ini)

路由

传参

# 路由传递参数
@app.route(/user/<user_id>)
def user_info(user_id):
    return hello %s % user_id

指定请求方式

@app.route(/demo2, methods=[GET, POST])
def demo2():
    # 直接从请求中取到请求方式并返回
    return request.method

重定向

# 重定向
@app.route(/user)
def user():
    return redirect(http://www.baidu.com)

自定义状态码

@app.route(/user)
def user():
    return 状态码为 666, 666

正则路由匹配

  • 导入转换器基类
from werkzeug.routing import BaseConverter

 

  • 自定义转换器
# 自定义正则转换器
class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        # 将接受的第1个参数当作匹配规则进行保存
        self.regex = args[0]

 

  • 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
app = Flask(__name__)

# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters[re] = RegexConverter
  • 使用转换器去实现自定义匹配规则
    • 当前此处定义的规则是:3位数字
@app.route(/user/<re("[0-9]{3}"):user_id>)
def user_info(user_id):
    return "user_id 为 %s" % user_id

捕获错误

  • errorhandler 装饰器
    • 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
  • 参数:
    • code_or_exception – HTTP的错误状态码或指定异常
  • 例如统一处理状态码为500的错误给用户友好的提示:
@app.errorhandler(500)
def internal_server_error(e):
    return 文件不存在
  • 捕获指定异常
@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
    return 除数不能为0

request

request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)

属性说明类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

 

 

 

 

示例

 

以上是关于flask框架的教程--程序的基本结构[二]的主要内容,如果未能解决你的问题,请参考以下文章

巡风代码架构简介以及Flask的项目文件结构简介

Django和Flask这两个框架在设计上各方面有啥优缺点

Flask教程1-简介

Flask即插视图与tornado比较

Django和Flask这两个框架在设计上各方面有啥优缺点

Flask从入门到精通之大型程序的结构一