POST請求讓我們假設我有以下網址:/valid/django/app/path/?foo=bar&spam=eggs
模擬在Django
我可以模擬這個網址在Django正是如此的要求:
from django.shortcuts import render
from django.core.urlresolvers import resolve
def simulate(request, url=None, template_name="not_important.html"):
if url:
dv = resolve(url.split('?')[0])
return dv.func(request, *dv.args, **dv.kwargs)
else:
return render(request, template_name)
不過,我想包括參數添加到包含的視圖中,以便request.REQUEST和request.GET對象還包括foo
和spam
我不明白我該如何幹淨地完成此操作;據我瞭解和request.GET中詞典request.REQUEST是不可變的,所以我不能只是這樣做:
import urlparse
def simulate(request, url=None, template_name="not_important.html"):
if url:
dv = resolve(url.split('?')[0])
qs = "".join(url.split('?')[1:])
if qs:
request.REQUEST.update(urlparse.parse_qs(qs))
request.GET.update(urlparse.parse_qs(qs))
return dv.func(request, *dv.args, **dv.kwargs)
else:
return render(request, template_name)
或者我會得到錯誤信息
此的QueryDict實例是不可變的
爲對象request.GET中和
'MergeDict' 對象沒有屬性「更新」
爲request.REQUEST對象
如果你想知道我爲什麼要這麼做:我希望允許用戶填寫一個表格,然後,當他們提出,如果他們沒有登錄它將它們發送到包含隱藏字段中的原始URL的登錄表單。登錄後,而不是重定向回該鏈接(這將是一個GET請求),我希望它調用原始視圖,它與原來的請求變量,以便它可以使用相同的POST請求。
所以當然在這個過程中,我也只是感興趣的是,當給定站點的有效URL時,是否可以模擬向Django視圖發送POST/GET請求。
我認爲更新是在放置操作。您可能需要先分配副本,然後更新它 – jdi 2012-02-21 00:10:56
絕對,謝謝jdi! FTR我實際上粘貼了一個測試POC :) – jpic 2012-02-21 00:13:00
很高興你喜歡這個想法;在某些時候,我會嘗試提取它並在github上發佈它。如果我能弄明白,最終你所要做的就是用裝飾器包裝一個視圖,它會自動爲你處理。 – 2012-02-24 23:48:07