Во время обработки запроса в 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. Как этого достичь?