对于Web应用程序,响应客户端发送到服务器的数据至关重要。在Flask中,此信息由全局 request对象提供。如果您有使用Python的经验,您可能想知道该对象如何成为全局对象,以及Flask如何仍然保持线程安全,答案是通过本地环境
本地环境
内幕消息
如果您想了解它的工作原理以及如何使用上下文本实现测试,请阅读本节,否则就跳过它
Flask中的某些对象是全局对象,但不是通常的对象。这些对象实际上是特定上下文本对象的代理。
想象一下上下文是处理线程。一个请求进入,Web服务器将产生一个新线程(或其他原因,底层对象能够处理线程以外的并发系统)。当Flask启动其内部请求处理时,它将确定当前线程是活动上下文,并将当前应用程序和WSGI环境绑定到该上下文(线程)。它以一种智能的方式执行此操作,以便一个应用程序可以调用另一个应用程序而不会中断。
那么,这对您意味着什么呢?基本上,除非您正在执行单元测试之类的操作,否则您完全可以忽略这种情况。您会注意到(单元测试时),依赖于请求对象的代码会突然中断,因为没有请求对象。解决方案是自己创建一个请求对象,并将其绑定到上下文。单元测试最简单的解决方案是使用test_request_context() 上下文管理器。与该with语句结合使用,它将绑定一个测试请求,以便您可以与之交互。这是一个例子:
from flask import request
.......
with app.test_request_context('/hello', method='POST'):
# now you can do something with the request until the
# end of the with block, such as basic assertions:
assert request.path == '/hello'
assert request.method == 'POST'
另一种可能性是将整个WSGI环境传递给该 request_context()方法:
from flask import request
with app.request_context(environ):
assert request.method == 'POST'
请求对象request
该请求对象已记录在API部分中,在此我们将不对其进行详细介绍(请参阅参考资料Request)。这里是一些最常见操作的概述。首先,您必须从flask模块中导入它:
from flask import request
通过使用该method属性,可以使用当前的请求方法 。要访问表单数据(在POST或PUT请求中传输的数据),可以使用 form属性。这是上述两个属性的完整示例
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# the code below is executed if the request method
# was GET or the credentials were invalid
return render_template('login.html', error=error)
如果键不存在于form属性中会怎样?在这种情况下,将抛出特定的KeyError错误,您可以像标准KeyError错误一样捕获它,如果不这样做,则会显示HTTP 400 Bad Request错误页面。因此,在许多情况下,您不必处理该问题。
访问URL中的 (?key=value) 可以使用 args 属性
示例:
searchword = request.args.get('key', '')
我们建议使用get或catch来访问URL参数,这样当用户因为修改了url发生错误时,可以提供更好的体验
讨论区