zoukankan      html  css  js  c++  java
  • 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 记录请求上传的文件 *

     

     

     

     

    示例

    皮豆设计(logo设计神器):http://pidou.cn

  • 相关阅读:
    【转载】JavaScript变量: 变量命名原则
    【转载】mysql运行报【The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone...】的解决方法
    Java Web 环境搭建
    原生JS消息提示插件Message.js
    SQL Server 参数嗅探问题
    根据表名和列名获取关联index的创建脚本
    mongodb快速均衡导入数据
    index optimize
    PG Foreign key 外键
    无密码登陆
  • 原文地址:https://www.cnblogs.com/gaidy/p/9193094.html
Copyright © 2011-2022 走看看