在 Django 中,限制用户访问特定的 url

In Django, restrict users to particular urls

我的 Django 应用程序中有以下 url

path('rooms/<room_id>',views.home,name='home'),

型号:

class ChatRoom(models.Model):
    eid = models.CharField(max_length=64, unique=True)
    name = models.CharField(max_length=25)

观看次数

def rooms(request):
    room = UserProfile.objects.filter(user=request.user).values()[0]['room_id']
    rooms = ChatRoom.objects.all().values()
    user = User.objects.filter(username=request.user)
    return render(request,'chat/rooms.html',{'rooms':rooms,'room_user':room})

此处 是可变的,即它取决于房间模型的 eid。一个用户只能是一个房间的一部分。因此,用户只能访问一个,假设为“4”。因此,用户只能访问 rooms/4/。我怎样才能限制用户进入其他网址,例如/rooms/5/ ?.

您可能想制作一个从 UserProfileChatRoom 模型的 ForeignKey

class UserProfile(models.Model):
    <b>room</b> = models.<b>ForeignKey(</b>ChatRoom, on_delete=models.PROTECT<b>)</b>
    # …

然后您可以过滤房间以仅允许用户使用以下房间:

from django.contrib.auth.decorators import login_required

@login_required
def rooms(request):
    # the ChatRoom or None
    room = ChatRoom.objects.filter(userprofile__user=request.user).first()
    return render(request,'chat/rooms.html',{'room': room})

因为你说的一个用户只能属于一个房间,所以是一个房间。

在您的 home 方法中,我们可以使用 get_object_or_404(…) [Django-doc] 引发 404,以防房间不是用户之一:

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404

@login_required
def home(request, room_id):
    room = <b>get_object_or_404(</b>ChatRoom, eid=room_id, userprofile__user=request.user<b>)</b>
    # …

也就是说,如果一个用户只能是一个 ChatRoom 的成员,那么将其包含在 URL 中就没有多大意义了。您可以简单地获取如上所示的聊天室。


Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].