Как создать объект запроса в Django? - PullRequest
6 голосов
/ 20 января 2010

Итак, я использую Django с Google App Engine, и у меня есть файл urls.py, который перенаправляет каждый URL-адрес в соответствующий метод. Каждому из этих методов автоматически передается «запрос» в качестве одного из аргументов, который я считаю объектом HttpRequest.

Как мне создать этот заполненный объект запроса из моего кода? Например, если я нахожусь в каком-то методе глубоко внутри моего кода, я хотел бы иметь доступ к этому объекту запроса без необходимости передавать его каждой функции, чтобы убедиться, что он доступен. Предполагая, что urls.py вызывает метод foo, в настоящее время я делаю это так:

foo(request):
    # stuff here
    bar(request)
     # more stuff here

bar(request):
     # stuff here<stuff>
    baz(request)
     # more stuff here

baz(request):
    do something with request here

Это кажется неправильным, потому что мне приходится передавать запрос через функции, которые ему не нужны, просто чтобы он был доступен в baz.

Я бы хотел сделать что-то вроде:

foo(request):
     # stuff here
    bar()
    # more stuff here

bar():
     # stuff here
    baz()
     # more stuff here

baz():
    request = HttpRequest()
    do something with request here

т.е.. Не передавайте запрос, если мне не нужно. Однако, делая запрос = HttpRequest () возвращает пустой объект запроса ... то, что я хочу, это полностью заполненная версия, как то, что передается в каждый метод, вызываемый из urls.py.

Я просмотрел документацию по HttpRequest здесь: http://docs.djangoproject.com/en/dev/ref/request-response/ но не видел, как это сделать.

Любые мысли будут с благодарностью.

Спасибо, Райан

Ответы [ 2 ]

1 голос
/ 04 августа 2017

request = HttpRequest() даст вам пустой, но вы можете написать что-нибудь для него.

Вот пример, который я использовал в своем проекте:

def new(request):
    ...
    newrequest = HttpRequest()
    newrequest.method = 'GET'
    newrequest.user = request.user
    resp = result_email(newrequest , obj-id , token )
    send_email( resp , ... )
    return HttpResponseRedirect( ... )
    ...
def result_email(request , ...):
    ...
    return render(request , ...)
0 голосов
/ 20 января 2010

Просто создайте переменную запроса перед определениями представления и установите ее значение, когда вы получаете ее из представления (используя пример кода):

current_request = None

foo(request):
    current_request = request
    # stuff here
    bar()
    # more stuff here

bar():
     # stuff here
    baz()
     # more stuff here

baz():
    # do something with currest_request here

См .: Замечания по области видимости переменных Python

Обновление: Этот вопрос очень похож на ваш, и принятое решение в основном создает глобальную переменную запроса и присоединяет ее к настройкам.

...