• 2.5.1、程序和请求上下文


        Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的 HTTP 请求。

        要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数。

        除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。

        为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象变为全局可访问。有了上下文,就可以写出下面的视图函数:

    from flask import request

    @app.route('/')

    def index():

        user_agent = request.headers.get('User-Agent')

        return '<p>Your browser is %s</p>' % user_agent

    Your b rowser is use r_agent app. rou e user def use r(name): 0/0 name http://127.0.0.l:sooo/ -"hi-1-: GET • '00 0K HTTP/I O Date: 'Wed, 29 Mar 2017 GMT' Server: "We.-kzeug/O.12.1 Python/2.7. 5' - 10.332 KB) User—Agent: "Mozilla/5.O (XII; Linux x86 _ 64; if retu rn name 52.0) Gecko/20100101 Firefox/S2.O' maln app. run(debug-T rue) ccept: 9, Accept—Encoding: "gzip, deflate' Connection: "keep-alive Cache—Control: "max-age—O " height="450" width="1097">

    注意在这个视图函数中我们如何把 request 当作全局变量使用。事实上,request 不可能是

    全局变量。试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,

    每个线程看到的 request 对象必然不同。Falsk 使用上下文让特定的变量在一个线程中全局

    可访问,与此同时却不会干扰其他线程。

    注:线程是可单独管理的最小指令集。进程经常使用多个活动线程,有时还会共

    享内存或文件句柄等资源。多线程 Web 服务器会创建一个线程池,再从线

    程池中选择一个线程用于处理接收到的请求。

    在 Flask 中有两种上下文:程序上下文和请求上下文。表 2-1 列出了这两种上下文提供的

    变量。

    表2-1 Flask上下文全局变量

     

    Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程

    序上下文被推送后,就可以在线程中使用 current_app 和 g 变量。类似地,请求上下文被

    推送后,就可以使用 request 和 session 变量。如果使用这些变量时我们没有激活程序上

    下文或请求上下文,就会导致错误。如果你不知道为什么这 4 个上下文变量如此有用,先

    别担心,后面的章节会详细说明。

    下面这个 Python shell 会话演示了程序上下文的使用方法:

    [user@localhost test]$ source venv/bin/activate

    (venv)[user@localhost test]$ python

    Python 2.7.5 (default, Nov  6 2016, 00:28:07)

    [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2

    Type "help", "copyright", "credits" or "license" for more information.

    >>> 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

    <Flask 'hello'>

    >>> app_ctx.pop()

    >>>

    在这个例子中,没激活程序上下文之前就调用 current_app.name 会导致错误,但推送完上下文之后就可以调用了。注意,在程序实例上调用 app.app_context() 可获得一个程序上

    下文。

  • 相关阅读:
    Recommended Books for Algo Trading in 2020
    Market Making is simpler than you think!
    Top Crypto Market Makers of 2020
    Top Crypto Market Makers, Rated and Reviewed
    爬取伯乐在线文章(五)itemloader
    爬取伯乐在线文章(四)将爬取结果保存到MySQL
    爬取伯乐在线文章(三)爬取所有页面的文章
    爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
    爬取伯乐在线文章(一)
    爬虫去重策略
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/6641091.html
Copyright © 2020-2023  润新知