我想使用关键字参数而不是位置参数在django模板中使用反向URL查找。
我让它使用位置参数正常工作:
HTML:
<a href="{% url 'download' customer.pk %}">download</a>
URL:
(r'^generator/download/(?P<customer_id>\d+)/$', 'generator.views.send_file', name='download'),
查看定义:
def send_file(request, customer_id):
问题在于我注意到一个安全漏洞,现在任何人都可以像以下网址一样输入:
/generate/download/<any number>/
并下载仅供其他人使用的文件。我知道可以通过使用用户权限等来减轻这种风险,但我仍然想添加另一层安全性以防万一。也许我认为关键字参数在这方面更安全是错误的,因为它不能简单地在URL中传递......但这就是我的想法。
我认为代码的工作方式如下:
HTML:
<a href="{% url 'download' customer_id=customer.pk %}">download</a>
URL:
(r'^generator/download/$', 'generator.views.send_file', name='download'),
查看定义:
def send_file(request, customer_id=None):
customer = get_object_or_404(Customer, pk=customer_id)
... other code
意思是如果在网址中输入/ generate / download /(没有附带的kwarg),它只会给它们404.
但是当我尝试使用此代码时出现以下错误:
Reverse for 'download' with arguments '()' and keyword arguments '{u'customer_id': 33}' not found. 1 pattern(s) tried: ['generator/download/$']
我确信我只是在django url调度程序文档中传递了一些愚蠢的东西,或者它可能是我定义我的视图的方式(也许我需要** kwargs作为参数?)但我可以似乎找不到我的生活。
非常感谢您的帮助。
答案 0 :(得分:1)
不幸的是,你的假设是完全错误的。关键字参数是在URL中传递,它们只是以不同的方式发送到视图函数 - 用kwargs而不是args。
解决问题的最简单方法就是在下载功能中检查用户。
def download(request, pk):
obj = Download.objects.get(pk)
if obj.customer_id != request.user.id:
return HttpResponseForbidden()