如果我理解正确,请用 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.
如果您想了解比我的快速研究更多的信息,请随时继续阅读源代码,或者如果您有任何问题,请发表评论。