Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何限制用户访问某些特定URL?_Django_Django Views - Fatal编程技术网

Django 如何限制用户访问某些特定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

我创建了一个视图,允许用户删除带有id的特定预订,但我不希望除与预订对象关联的用户之外的其他用户删除它。如何限制用户访问删除他们不拥有的预订的URL

网址:

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')