Программно выполнить вложенный запрос GET в Django - PullRequest
2 голосов
/ 29 октября 2010

Во время обработки запроса в Django мне нужно выполнить вложенный запрос к тому же приложению. Рассмотрим этот пример, где при обработке запроса sendmail я пытаюсь сделать еще один запрос к тому же серверу, чтобы получить содержимое вложения (тело письма и список URL-адресов, чье содержимое для вложения предоставляется функции просмотра sendmail через параметры POST):

def sendmail(request):
    mail = #... create a mail object
    for url in urls: # iterate over desired attachments urls
        data = urllib.urlopen('http://127.0.0.1:8000' + url).read()
        mail.attach(data)

Есть несколько проблем с этим подходом. Во-первых, он не работает с сервером разработки, потому что он может обрабатывать только один запрос за раз: поскольку он уже обрабатывает запрос sendmail, попытка чтения с данного URL заблокирует навсегда. Во-вторых, я должен указать ip и порт сервера, что не очень приятно.

Я бы хотел сделать что-то подобное:

data = django_get(url).read()

где гипотетический метод django_get на самом деле не будет выполнять http-запрос, а вместо этого напрямую вызовет компонент django, который получает URL и возвращает HttpResponse Это решило бы обе проблемы, поскольку не было бы никакого фактического соединения с сокетом, и не было бы необходимости включать сервер / порт в URL. Как этого достичь?

Ответы [ 3 ]

3 голосов
/ 29 октября 2010

Противоположность reverse() равна resolve().

Также это .

1 голос
/ 01 февраля 2012

Это ответ Игнасио Васкеса-Абрамса для ленивых:

from django.core.urlresolvers import resolve

def sendmail(request):
    mail = #... create a mail object
    for url in urls: # iterate over desired attachments urls
        resolved = resolve(url)
        request.path = url
        mail.attach(resolved.func(request, *resolved.args, **resolved.kwargs))
0 голосов
/ 29 октября 2010

Поместите нужные функции в отдельную функцию, которую могут вызывать как функция sendmail, так и функция исходной страницы.

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