Доступна ли переменная Global Request в Python / Django? - PullRequest
10 голосов
/ 01 сентября 2011

Я написал плагин, который посылает сигнал для активации моего кода.Тем не менее, он не отправляет объект запроса пользователя в мой код.Я ищу способ получить текущий запрос без изменения основного приложения.Я не могу найти какую-либо документацию, относящуюся к глобальному запросу (например, $_SERVER['REMOTE_ADDR'] в PHP).

Я хотел бы знать, есть ли какая-либо переменная для этого в Python / Django.

Ответы [ 5 ]

18 голосов
/ 01 сентября 2011

Django не предоставляет объект глобального запроса (фактически это будет локальный поток, а не глобальный). Но есть несколько методов, которые вы можете использовать, чтобы получить тот же эффект самостоятельно: http://nedbatchelder.com/blog/201008/global_django_requests.html

1 голос
/ 28 октября 2016

вы можете прикрепить его к текущему запросу через промежуточное ПО и получить его обратно https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py

1 голос
/ 03 февраля 2016

AFAIK он недоступен, за исключением того, что вы делаете его доступным.

Вы можете скопировать + вставить фрагменты, предоставленные в других ответах, или использовать эту библиотеку: https://pypi.python.org/pypi/django-crequest

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

0 голосов
/ 06 февраля 2019

Основываясь на ответе Неда Батчелдера, я составил решение. Хотя я не рекомендовал бы это ни для чего кроме отладки / устранения проблем. На связанной странице есть лучшее решение.

Поместить модуль m1 в корень проекта:

import inspect
def get_request():
    for f in inspect.stack():
        f_code = inspect.getmembers(f.frame, inspect.iscode)[0][1]
        f_locals = [v for (n, v) in inspect.getmembers(f.frame) if n == 'f_locals'][0]
        co_varnames = [v for (n, v) in inspect.getmembers(f_code) if n == 'co_varnames'][0]
        if 'request' in co_varnames:
            return f_locals['request']

Тогда в любом другом файле:

import m1
print(m1.get_response().path)

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

0 голосов
/ 01 сентября 2011

Насколько я знаю, вы определяете представление Django с помощью ряда методов, таких как:

def detail(request, some_param):
  # [...]

Параметр request содержит информацию о HTTP-запросе.request.META['HTTP_X_FORWARDED_FOR'] например, возвращает IP-адрес клиента.

Если ваш плагин имеет какое-то отношение к запросам, его классы и функции, вероятно, будут созданы / вызваны с вашей точки зрения.Это означает, что вам нужно передать ему текущий request объект, так как нет смысла иметь вокруг него global объект запроса.В PHP это возможно, так как каждый запрос приводит к тому, что весь код выполняется с нуля, но в Django запросы отправляются сервером и передаются в инфраструктуре с использованием HttpRequest объектов.Также обратитесь к этой части документации Django для получения дополнительной информации.

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