【问题标题】:How to prevent users from seeing all content in Django?如何防止用户看到 Django 中的所有内容?
【发布时间】:2021-12-17 21:07:15
【问题描述】:

我有一个网站,我想阻止访问者看到内容,除非他们获得许可。 我该如何限制它们?

【问题讨论】:

    标签: django django-permissions


    【解决方案1】:

    我建议查看 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

    【讨论】:

      【解决方案2】:

      如果你想让用户必须登录才能访问某个功能,你可以

      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
      

      【讨论】:

        【解决方案3】:

        在基于函数的视图中限制对登录用户的访问

        如果您使用基于函数的视图,您可以通过使用 @login_required 装饰器装饰函数来简单地将视图的所有访问权限限制为已登录的用户。

        从 django.contrib.auth.decorators 导入 login_required

        @login_required
        def my_view(request):
            return HttpResponse()
        

        这样做的结果是,任何未登录并尝试通过其 URL 访问视图的用户都将被重定向到您网站的登录页面。请注意,此装饰器不检查用户是否处于活动状态(使用 is_active 属性),它只检查用户是否已登录。

        Source

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-04
          • 1970-01-01
          • 2015-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多