开发者

Programmatically perform a nested GET request in Django

During the processing of a request in Django, I need to perform a nested request to the same application. Consider this example, where while processing the sendmail request, I attempt to make another request to the same server to obtain the content of an attachment (the body of the mail and a list of urls whose content to attach are provided to the sendmail view function through POST parameters):

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)

There are several issues with this approach. First, it doesn't work with the development server because it can only process one request at a time: as it is already processing the sendmail request, attempting to read from the given url will block forever. Second, I have to specify the server's ip and port, which is not very nice.

I would like to do something like that instead:

data = django_get(url).read()

where the hypothetical django_get method would not really make an http request, but instead directly call the django component that takes an url and returns an HttpResponse. That would solve both problems, as there would not be any actual socket connection, and it would not be necessary to include the server/port in the url. How could that be achieve开发者_运维技巧d?


The opposite of reverse() is resolve().

Also, this.


This is Ignacio Vazquez-Abrams' answer for the lazy:

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))


Put the desired functionality in a separate function that both your sendmail function and the original page's function can call.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜