繁体   English   中英

在Django模板中使用反向URL查找与关键字争论

[英]Using reverse url lookup in django template with keyword arguements

我想使用关键字参数而不是位置参数在Django模板中使用反向URL查找。

我可以使用位置参数来工作,就像这样:

HTML:

    <a href="{% url 'download' customer.pk %}">download</a>

网址:

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

网址:

    (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作为参数?),但我似乎无法为我的生命找到它。

非常感谢您的帮助。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM