以编程方式在Django中执行嵌套的GET请求

时间:2010-10-28 20:50:39

标签: django

在处理Django中的请求期间,我需要对同一个应用程序执行嵌套请求。考虑这个例子,在处理sendmail请求时,我尝试向同一服务器发出另一个请求以获取附件的内容(邮件正文和要附加的内容提供给sendmail视图函数的URL列表)通过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请求,而是直接调用带有url并返回HttpResponse的django组件。这将解决这两个问题,因为没有任何实际的套接字连接,并且没有必要在URL中包含服务器/端口。怎么可能实现呢?

3 个答案:

答案 0 :(得分:3)

reverse()的反面是resolve()

另外,this

答案 1 :(得分:1)

这是Ignacio Vazquez-Abrams对懒惰的回答:

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

答案 2 :(得分:0)

将所需的功能放在一个单独的功能中,即sendmail功能和原始页面的功能都可以调用。