如何防止用户看到 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 属性),它只会检查用户是否已登录。

Source