【问题标题】:Understanding Flask request object理解 Flask 请求对象
【发布时间】:2018-07-04 11:34:26
【问题描述】:

我想了解来自Flaskrequest 对象是如何工作的。具体来说,通过查看下面的代码,取自here

我的问题是:requestobject 与发出的实际请求之间的链接在哪里?

换句话说,request.is_json 如何知道它应该指向哪个数据(通过请求发送的数据)。

感谢您的帮助!

【问题讨论】:

  • 如果您对request 对象的创建方式感兴趣,请随时阅读源代码。是否有任何与您的问题相关的具体问题需要我们为您提供帮助?
  • 感谢@PaxVobiscum 的评论。我是 Flask 的新手,我只是想了解请求对象如何知道在哪里查找数据。或者,也许这种方式更清楚,在代码的哪一行,包含来自客户端请求的信息的请求对象出现/变得可用?可能唯一的解释在源代码里,我不知道。
  • 我不确定我是否理解您的问题或您为什么想知道这一点。你想要一个行号吗?
  • 第8行有一个请求对象,这个对象指向的是实际请求的数据,对吧?何时/何地建立这种联系,这是我的问题。它是请求对象在创建时固有的东西吗?那么当这个对象从 Flask 导入时它已经知道如果有请求,这个对象应该指向请求中提供的数据(POST 请求)?我希望你现在更了解我。这可能有点不必要的担心,我同意这一点。

标签: python flask


【解决方案1】:

如果我理解正确,请用 cmets 中给出的细节回答您的问题;

request 对象是在您首次启动 Flask 服务器时创建的,但是,flask 会跟踪请求上下文堆栈,所有请求都会结束。

Request stack accessing, source

def _lookup_req_object(name):
    top = _request_ctx_stack.top
    if top is None:
        raise RuntimeError(_request_ctx_err_msg)
    return getattr(top, name)

然后烧瓶为您的 url 调用特定端点,您可以从该端点访问请求对象。由于flask 实际上使用了来自werkzeug 的BaseRequest 对象,因此它继承了get_data 方法,该方法将请求数据反序列化以供以后解析。

werkzeug get_data() impllementation, source

def get_data(self, as_text=False):
    """The string representation of the request body.  Whenever you call
    this property the request iterable is encoded and flattened.  This
    can lead to unwanted behavior if you stream big data.
    This behavior can be disabled by setting
    :attr:`implicit_sequence_conversion` to `False`.
    If `as_text` is set to `True` the return value will be a decoded
    unicode string.
    .. versionadded:: 0.9
    """
    self._ensure_sequence()
    rv = b''.join(self.iter_encoded())
    if as_text:
        rv = rv.decode(self.charset)
    return rv

特定的请求对象再次使用继承的 mixins 能够将 json 与其他内容区分开来。

class Request(RequestBase, JSONMixin):
    """The request object used by default in Flask.  Remembers the
    matched endpoint and view arguments.
    It is what ends up as :class:`~flask.request`.  If you want to replace
    the request object used you can subclass this and set
    :attr:`~flask.Flask.request_class` to your subclass.
    The request object is a :class:`~werkzeug.wrappers.Request` subclass and
    provides all of the attributes Werkzeug defines plus a few Flask
    specific ones.

如果您想了解比我的快速研究更多的信息,请随时继续阅读源代码,或者如果您有任何问题,请发表评论。

【讨论】:

    猜你喜欢
    • 2022-07-11
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多