在 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/ ?.
您可能想制作一个从 UserProfile
到 ChatRoom
模型的 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].
我的 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})
此处
您可能想制作一个从 UserProfile
到 ChatRoom
模型的 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].