在django模板中使用带有关键字参数的反向URL查找

时间:2014-07-31 15:33:21

标签: python django

我想使用关键字参数而不是位置参数在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作为参数?)但我可以似乎找不到我的生活。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

不幸的是,你的假设是完全错误的。关键字参数在URL中传递,它们只是以不同的方式发送到视图函数 - 用kwargs而不是args。

解决问题的最简单方法就是在下载功能中检查用户。

def download(request, pk):
    obj = Download.objects.get(pk)
    if obj.customer_id != request.user.id:
        return HttpResponseForbidden()