【问题标题】:In Django, restrict users to particular urls在 Django 中,将用户限制为特定的 url
【发布时间】:2020-07-09 15:28:51
【问题描述】:

我的 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})

这里 是可变的,即它取决于 Room 模型的 eid。一个用户只能是一个房间的一部分。因此,用户只能访问一个 ,假设为“4”。因此,用户只能访问房间/4/。如何限制用户输入其他 URL,例如/rooms/5/ ?.

【问题讨论】:

  • 我认为您需要在UserChatRoom 之间定义OnetoMany 关系?
  • 只需在UserChatRoom 之间创建多对多并将用户与房间匹配,反之亦然,然后只需检查用户是否分配了房间

标签: django django-urls django-users restrict


【解决方案1】:

您可能希望将 ForeignKeyUserProfile 改为 ChatRoom 模型:

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

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

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 = get_object_or_404(ChatRoom, eid=room_id, userprofile__user=request.user)
    # …

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


注意:您可以使用 @login_required decorator [Django-doc].

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2021-06-11
    • 2018-10-24
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多