请稍候,加载中....

访问request对象

对于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属性,可以使用当前的请求方法 。要访问表单数据(在POSTPUT请求中传输的数据),可以使用 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发生错误时,可以提供更好的体验


Python学习手册-