【发布时间】:2012-03-11 07:44:27
【问题描述】:
假设我有以下网址:/valid/django/app/path/?foo=bar&spam=eggs
因此,我可以在 Django 中模拟对这个 URL 的请求:
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 请求感兴趣。
【问题讨论】:
标签: python django django-views django-urls