Понимание объекта запроса Flask - PullRequest
0 голосов
/ 04 июля 2018

Я хотел бы понять, как работает объект request из Flask. В частности, взглянув на код ниже, взятый из здесь . enter image description here

Мой вопрос: где находится связь между объектом request и фактическим запросом?

Другими словами, как request.is_json знает, на какие данные он должен указывать (данные, отправленные через запрос).

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 04 июля 2018

Чтобы ответить на ваш вопрос со спецификой, приведенной в комментариях, если я правильно понял;

Объект request создается при первом запуске сервера Flask, однако, колба отслеживает стек контекста запроса, где все запросы заканчиваются.

Запрос доступа к стеку, источник

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 фактически использует объект BaseRequest из werkzeug, он наследует метод get_data, который десериализует данные запроса для последующего анализа.

Реализация werkzeug get_data (), источник

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

Конкретный объект запроса снова использует унаследованные миксины, чтобы иметь возможность отличить 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.

Не стесняйтесь продолжать читать источник, если вы хотите знать больше, чем после моего быстрого исследования времени, или если у вас есть какие-либо вопросы, просто оставьте комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...