实验简介
对于 Web 应用来说,对客户端发送给服务器的数据做出反应至关重要,本实验将介绍 Flask 是怎样提供这些信息的。
知识点
- 接收请求
- 请求对象
- 文件上传
- Cookies
接受请求数据
在 Flask 中由全局对象 request
来提供这些信息。如果你有一定的 Python 经验,你会好奇这个对象怎么可能是全局的,并且 Flask 是怎么还能保证线程安全。答案是上下文作用域。
局部上下文
注意:如果你想要了解上下文作用域是如何工作的以及如何使用它进行测试,就可以读这一部分,如果暂时不需要的话,可以直接跳过这部分。
Flask 中的某些对象是全局对象,但不是通常的类型。这些对象实际上是给定上下文的局部对象的代理。虽然很拗口,但实际上很容易理解。
想象下线程处理的上下文。一个请求传入,web 服务器决定产生一个新线程(或者其它东西,底层对象比线程更有能力处理并发系统)。当 Flask 开始它内部请求处理时,它认定当前线程是活动的上下文并绑定当前的应用和 WSGI 环境到那个上下文(线程)。它以一种智能的方法来实现,以致一个应用可以调用另一个应用而不会中断。
所以这对你意味着什么呢?除非你是在做一些类似单元测试的事情,否则基本上你可以完全忽略这种情况。你会发现依赖于请求对象的代码会突然中断,因为没有请求对象。解决方案就是自己创建一个请求并把它跟上下文绑定。
针对单元测试最早的解决方案是使用 test_request_context()
上下文管理器。结合 with
声明,它将绑定一个测试请求来进行交互。这里是一个例子:
from flask import request
with app.test_request_context('/hello', method='POST'):
# 现在你可以做出请求,比如基本的断言
assert request.path == '/hello'
assert request.method == 'POST'
另一个可能性就是传入整个 WSGI 环境到request_context()
方法:
from flask import request
with app.request_context(environ):
assert request.method == 'POST'
参考链接:
Comments | NOTHING