Django 如何限制用户访问某些特定URL?
我创建了一个视图,允许用户删除带有id的特定预订,但我不希望除与预订对象关联的用户之外的其他用户删除它。如何限制用户访问删除他们不拥有的预订的URL 网址:Django 如何限制用户访问某些特定URL?,django,django-views,Django,Django Views,我创建了一个视图,允许用户删除带有id的特定预订,但我不希望除与预订对象关联的用户之外的其他用户删除它。如何限制用户访问删除他们不拥有的预订的URL 网址: path('manage/', views.ManageView, name='manage'), path('manage/delete_booking/(?P<pk>\d+)', views.delete_booking, name='delete_booking'), 模板: <div class="w3-cont
path('manage/', views.ManageView, name='manage'),
path('manage/delete_booking/(?P<pk>\d+)', views.delete_booking, name='delete_booking'),
模板:
<div class="w3-content">
<div class="w3-third w3-padding w3-center">
<h4 class="bg-color">Infomation</h4>
<p>Student ID: {{ user.profile.student_id }}</p>
<p>Full name: {{ user.last_name }} {{ user.first_name }}</p>
</div>
<div class="w3-two w3-padding w3-center">
<h4 class="bg-color">Booking</h4>
{% if not bookings.exists %}
<p>You don't have any booking</p>
{% else %}
{% for booking in bookings %}
<p>{{ booking.room }} {{ booking.date }} {{ booking.lesson.number }} <a href="{% url 'delete_booking' booking.pk %}">Delete</a></p>
{% endfor %}
{% endif %}
</div>
信息
学生ID:{{user.profile.Student\u ID}
全名:{{user.last_name}{{user.first_name}}
预订
{%if not bookings.exists%}
你没有预约吗
{%else%}
{预订百分比中的预订百分比}
{{booking.room}{{booking.date}{{{booking.lesson.number}
{%endfor%}
{%endif%}
您可以在视图中添加一个复选框,例如:
@login_required
def delete_booking(request, pk):
booking = get_object_or_404(Booking, pk=pk, user=request.user)
booking.delete()
return redirect('manage')
这将返回401错误(未授权)
这两种方法都有其优点。例如,通过提出401,您给出一个“提示”,即存在一个具有此pk
的对象。然后,恶意用户可以尝试通过另一种方式访问(查看、更改或删除)对象。另一方面,401更好地描述了问题所在:用户无法查看/更新/更改对象。前端可以提供更多信息。例如,如果某个管理员没有足够的权限处理某个对象
注意:通常只有POST、PATCH、PUT和DELETE方法会产生副作用。因此,您可能还想省略request.method=='GET'
案例。像搜索引擎这样的机器人通常“假定”GET请求是安全的(实际上它们应该是安全的)。因此,通过不检查方法,搜索引擎可以“触发”删除、更新等
@login_required
def delete_booking(request, pk):
booking = get_object_or_404(Booking, pk=pk, user=request.user)
booking.delete()
return redirect('manage')
@login_required
def delete_booking(request, pk):
booking = get_object_or_404(Booking, pk=pk)
if booking.user_id != request.user.id:
return HttpResponse('Unauthorized', status=401)
booking.delete()
return redirect('manage')