如何防止用户看到 Django 中的所有内容?
How to prevent users from seeing all content in Django?
我有一个网站,我想阻止访问者在未经许可的情况下查看内容。
我该如何限制它们?
我建议查看 django 文档中的 Permissions and Authorization。
这是一种方法:
在您的用户模型中:
class User(AbstractUser):
@property
def has_permission_I_want(self):
# check permissions here
# return True or False
在视图中:
from django.contrib.auth.decorators import user_passes_test
@user_passes_test(user.has_permission_I_want)
def some_view(request)
# Some code here
或限制页面内的内容,将用户从视图传递到模板字典:
return render(
request, "app/some_page.html",
{"user": request.user}
)
并在模板中:
{% if user.has_permission_I_want %}
<p> You can see this content </p>
{% endif %}
另请查看此 SO question。
如果您想让用户必须登录才能访问某个功能,您可以
from django.contrib.auth.decorators import login_required
@login_required
def some_view(request):
# Some code inside the function
不使用装饰器检查权限:
# models.py
from django.db import models
class UserProfile(models.Model):
has_permission = False
注册用户时,在 UserProfile 中创建一条记录
# admin.py
from django.contrib import admin
from app.models import UserProfile
admin.register(UserProfile)
然后转到管理员设置权限
def some_view(request):
user_profile = UserProfile.objects.get(id=request.user.pk)
if userprofile.has_permission:
# Give permission
else:
# Deny permission
创建装饰器
创建一个文件,decorators.py
在应用中
from django.core.exceptions import PermissionDenied
from simple_decorators.apps.models import Entry
def check_if_deleter_is_author(function):
def wrap(request, *args, **kwargs):
post = Post.objects.get(pk=kwargs['post_id'])
if post.created_by == request.user:
return function(request, *args, **kwargs)
else:
raise PermissionDenied
wrap.__doc__ = function.__doc__
wrap.__name__ = function.__name__
return wrap
# views.py
from app.decorators import check_if_deleter_is_author
@check_if_deleter_is_author
def some_view(request):
# Some code to delete the post
在基于功能的视图中限制对已登录用户的访问
如果您使用的是基于函数的视图,您可以通过使用 @login_required
装饰器装饰函数,将对视图的所有访问限制为已登录的用户。
从django.contrib.auth.decorators导入login_required
@login_required
def my_view(request):
return HttpResponse()
这样做的结果是,任何未登录并试图通过 URL 访问视图的用户都将被重定向到您网站的登录页面。请注意,此装饰器不会检查用户是否处于活动状态(使用 is_active 属性),它只会检查用户是否已登录。
我有一个网站,我想阻止访问者在未经许可的情况下查看内容。 我该如何限制它们?
我建议查看 django 文档中的 Permissions and Authorization。
这是一种方法:
在您的用户模型中:
class User(AbstractUser):
@property
def has_permission_I_want(self):
# check permissions here
# return True or False
在视图中:
from django.contrib.auth.decorators import user_passes_test
@user_passes_test(user.has_permission_I_want)
def some_view(request)
# Some code here
或限制页面内的内容,将用户从视图传递到模板字典:
return render(
request, "app/some_page.html",
{"user": request.user}
)
并在模板中:
{% if user.has_permission_I_want %}
<p> You can see this content </p>
{% endif %}
另请查看此 SO question。
如果您想让用户必须登录才能访问某个功能,您可以
from django.contrib.auth.decorators import login_required
@login_required
def some_view(request):
# Some code inside the function
不使用装饰器检查权限:
# models.py
from django.db import models
class UserProfile(models.Model):
has_permission = False
注册用户时,在 UserProfile 中创建一条记录
# admin.py
from django.contrib import admin
from app.models import UserProfile
admin.register(UserProfile)
然后转到管理员设置权限
def some_view(request):
user_profile = UserProfile.objects.get(id=request.user.pk)
if userprofile.has_permission:
# Give permission
else:
# Deny permission
创建装饰器
创建一个文件,decorators.py
在应用中
from django.core.exceptions import PermissionDenied
from simple_decorators.apps.models import Entry
def check_if_deleter_is_author(function):
def wrap(request, *args, **kwargs):
post = Post.objects.get(pk=kwargs['post_id'])
if post.created_by == request.user:
return function(request, *args, **kwargs)
else:
raise PermissionDenied
wrap.__doc__ = function.__doc__
wrap.__name__ = function.__name__
return wrap
# views.py
from app.decorators import check_if_deleter_is_author
@check_if_deleter_is_author
def some_view(request):
# Some code to delete the post
在基于功能的视图中限制对已登录用户的访问
如果您使用的是基于函数的视图,您可以通过使用 @login_required
装饰器装饰函数,将对视图的所有访问限制为已登录的用户。
从django.contrib.auth.decorators导入login_required
@login_required
def my_view(request):
return HttpResponse()
这样做的结果是,任何未登录并试图通过 URL 访问视图的用户都将被重定向到您网站的登录页面。请注意,此装饰器不会检查用户是否处于活动状态(使用 is_active 属性),它只会检查用户是否已登录。