美文网首页
Flask学习笔记-程序的基本结构

Flask学习笔记-程序的基本结构

作者: ZZIXU | 来源:发表于2016-08-06 13:24 被阅读32次

    使用虚拟环境

    创建虚拟环境:
    $ virtualenv venv
    可以通过下面的命令激活这个虚拟环境:
    $ source venv/bin/activate
    如果使用微软 Windows 系统,激活命令是:$ venv\Scripts\activate
    如果你想回到全局 Python 解释器中,可以在命令行提示符下输入 deactivate。

    程序和请求上下文

    程序和请求上下文
    Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用 current_app 和 g 变量。类似地,请求上下文被推送后,就可以使用 request 和 session 变量。如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致错误。
    下面这个 Python shell 会话演示了程序上下文的使用方法:
    >>> from hello import app
    >>> from flask import current_app
    >>> current_app.name
    Traceback (most recent call last): ...
    RuntimeError:working outside of application context
    >>> app_ctx = app.app_context()
    >>> app_ctx.push()
    >>> current_app.name
    'hello'
    >>> app_ctx.pop()
    在这个例子中,没激活程序上下文之前就调用 current_app.name 会导致错误,但推送完上下文之后就可以调用了。注意,在程序实例上调用 app.app_context() 可获得一个程序上下文。

    请求钩子

    有时在处理请求之前或之后执行代码会很有用。例如,在请求开始时,我们可能需要创建数据库连接或者认证发起请求的用户。为了避免在每个视图函数中都使用重复的代码,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。

    请求钩子使用修饰器实现。Flask 支持以下 4 种钩子。

    • before_first_request:注册一个函数,在处理第一个请求之前运行。
    • before_request:注册一个函数,在每次请求之前运行。
    • after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
    • teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

    在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量 g。例如,before_request 处理程序可以从数据库中加载已登录用户,并将其保存到 g.user 中。随后调用视图函数时,视图函数再使用 g.user 获取用户。

    响应

    下述视图函数返回一个 400 状态码,表示请求效:

    @app.route('/') 
    def index():
        return '<h1>Bad Request</h1>', 400
    

    视图函数返回的响应还可接受第三个参数,这是一个由首部(header)组成的字典,可以添加到 HTTP 响应中。
    如果不想返回由 1 个、2 个或 3 个值组成的元组,Flask 视图函数还可以返回 Response 对象。make_response() 函数可接受 1 个、2 个或 3 个参数(和视图函数的返回值一样),并返回一个 Response 对象。有时我们需要在视图函数中进行这种转换,然后在响应对象上调用各种方法,进一步设置响应。下例创建了一个响应对象,然后设置了 cookie:

    from flask import make_response
    
    @app.route('/') 
    def index():
        response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') return response
    

    重定向响应

    from flask import redirect
    
    @app.route('/') 
    def index():
        return redirect('http://www.example.com')
    

    错误处理响应

    abort函数
    例如:

    from flask import abort
    
    @app.route('/user/<id>') 
    def get_user(id):
        user = load_user(id) 
        if not user:
            abort(404)
        return '<h1>Hello, %s</h1>' %   user.name
    

    注意,abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给 Web 服务器。

    相关文章

      网友评论

          本文标题:Flask学习笔记-程序的基本结构

          本文链接:https://www.haomeiwen.com/subject/gvpksttx.html