zoukankan      html  css  js  c++  java
  • 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() 可获得一个程序上

    下文。

  • 相关阅读:
    MapReduce之Map Join
    MapReduce之Reduce Join
    MapReduce清洗日志数据统计PV量
    Hadoop MapReduce自定义数据类型
    ES6 对象拓展方法
    ES6箭头函数与this指向
    ES6参数默认值,剩余参数及展开数组
    ES6模板字符串及字符串的扩展方法
    浅谈ES6数组及对象的解构
    ECMAScript概述及浅谈const,let与块级作用域
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/6641091.html
Copyright © 2011-2022 走看看