【发布时间】:2021-12-17 21:07:15
【问题描述】:
我有一个网站,我想阻止访问者看到内容,除非他们获得许可。 我该如何限制它们?
【问题讨论】:
我有一个网站,我想阻止访问者看到内容,除非他们获得许可。 我该如何限制它们?
【问题讨论】:
我建议查看 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 属性),它只检查用户是否已登录。
【讨论】: