有没有办法阻止用户访问应用程序中的某些(或所有)URL?例如,我正在关注Django教程,其中一个示例有一个URL:
#music/album/<pk>/delete
url(r'image/(?P<pk>[0-9]+)/delete/$', views.ImageDelete.as_view(), name='image-delete'),
删除数据库条目的将pk
作为参数。当然,现在可以通过使用任何现有的主键复制粘贴URL来删除此条目,那么避免它的最佳做法是什么?感谢
编辑。根据回复和评论,我决定详细说明一下。我实际上正在使用DeleteView
和POST
请求表单作为@solarissmoke在回答中建议。
<form action="{% url 'album:image-delete' image.id%}" method="post" style="display: inline;">
{% csrf_token %}
<input type="hidden" name="image_id" value="{{ image.id }}"/>
<button type="submit" class="btn btn-default btn-sm">
<span class="glyphicon glyphicon-trash"></span>
</button>
</form>
和我的views.py
:
class ImageDelete(DeleteView):
model = Album
# if you successfully delete the object, page redirects to <homepage>
success_url = reverse_lazy('album:index')
因此,几乎没有建议检查用户是否经过验证可以删除URL条目(例如图像)并添加弹出/通知以验证用户确实是否要删除该条目。但是,它并不像是一个完整的解决方案。在评论中我带来了Facebook的例子,你可以通过复制粘贴删除 URL来不删除imeage / post。当然,我并不是要求类似Facebook的安全性,但是,我真的很好奇如何保护URL,以便普通用户几乎不可能通过简单的复制粘贴来删除条目。再次感谢!
答案 0 :(得分:2)
最佳做法是,您不应允许通过HTTP GET
请求修改此类数据,这些请求(顾名思义)用于获取数据而非更新数据。
您应该使用表单和POST
请求来执行删除对象等操作.Django提供lots of helper views来执行此操作。例如DeleteView
:
显示确认页面并删除现有对象的视图。仅当请求方法为
POST
时,才会删除给定对象。如果通过GET
获取此视图,则会显示一个确认页面,该页面应包含POST
到同一网址的表单。
使用这些视图的好处是:
您可以确保用户有权在进行任何更改之前编辑对象。 Django将为您执行基本检查(例如,CSRF)。您可以扩充视图以执行其他检查,例如making sure a user is logged in或checking any other permission。
第二次访问URL无法意外删除对象(如上文所述)。
答案 1 :(得分:1)
有很多方法......例如:
user = request.user
if user.is_authenticated() and user.profile.can_delete_image(image_pk):
# only then, image can be deleted by this user
# can_delete_image(image_pk) is defined by you
else:
raise DeletePermissionDenied # you can define your own Exception, just for fun