欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-26 10:45:36
一个简单的程序 运行结 程序和请求上下文 为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象 变为全局可访问。Falsk 使用上下文让特定的变量在一个线程中全局 可访问,与此同时却不会干扰其他线程。 运行结果 Flask上下文全局变量 Flask 在分发请求之前激活 ......

一个简单的程序

from flask import Flask

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


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


if __name__ == '__main__':
    app.run()

运行结

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

程序和请求上下文

为了避免大量可有可无的参数把视图函数弄得一团糟,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上下文全局变量

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 记录请求上传的文件 *

 

 

 

 

示例