2010-10-28 59 views
2

在處理Django中的請求期間,我需要對同一個應用程序執行嵌套的請求。考慮這個例子,在處理sendmail請求的同時,我嘗試向同一個服務器發出另一個請求以獲取附件的內容(郵件的主體和要附加其內容的url列表提供給sendmail視圖函數通過POST參數):以編程方式在Django中執行嵌套的GET請求

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

reverse()的反義詞是resolve()。另外,this

+0

正是我需要的,非常感謝。 – gpothier 2010-10-28 20:59:16

0

將所需的功能放在一個單獨的函數中,您的sendmail函數和原始頁面的函數都可以調用。

+0

這將意味着我必須解析我的sendmail函數中的url來確定調用哪個函數,這是django在解析url時已經完成的工作......我認爲Ignacio的答案就是我正在尋找的。 – gpothier 2010-10-28 20:58:47

+0

@gpothier URL的動態部分不是函數的參數? – user470379 2010-10-28 21:01:56

1

這是伊格納西奧巴斯克斯 - 艾布拉姆斯懶惰的答案:

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