【问题标题】:Restrict so users only view a certain part of website-Django限制用户只能查看网站的特定部分-Django
【发布时间】:2012-12-29 10:32:31
【问题描述】:

我正在使用 Django,并且只需要某些“试用”用户来激活网站的某个部分 - 有什么想法可以有效地做到这一点吗?

我正在考虑给付费客户一个特定的 ID 并将其链接到网站的 URL 以获得许可。

谢谢,

汤姆

【问题讨论】:

    标签: python django user-interface django-views


    【解决方案1】:

    我决定发布我的解决方案,我什至可能会得到一些反馈。我在设置中定义的某些路径上有一个中间件阻止请求/响应,首先是中间件:

    import re
    from django.conf import settings
    from django.shortcuts import redirect
    
    class InvitationRequired(object):
    
        def process_response(self, request, response):
    
            if not settings.CLOSED_BETA_ACTIVE:
                return response
    
            if (hasattr(request, 'user')
                    and hasattr(request.user, 'is_authenticated')
                    and request.user.is_authenticated()):
                return response
            elif (request.path in
                    settings.CLOSED_BETA_INVITATION_MIDDLEWARE_EXCEPTED_URIS):
                return response
            elif response.status_code < 200 or response.status_code >= 300:
                return response
            else:
                for regex in \
                    settings.CLOSED_BETA_INVITATION_MIDDLEWARE_EXCEPTED_PATTERNS:
                    if re.compile(regex).match(request.path):
                        return response
    
            return redirect(settings.CLOSED_BETA_INVITATION_MIDDLEWARE_REDIRECT)
    

    在 settings.py 我有这样的东西:

    CLOSED_BETA_ACTIVE = True
    
    CLOSED_BETA_INVITATION_URL = '/invitation/'
    CLOSED_BETA_INVITATION_MIDDLEWARE_REDIRECT = CLOSED_BETA_INVITATION_URL
    
    CLOSED_BETA_INVITATION_MIDDLEWARE_EXCEPTED_PATTERNS = (
        r'^/api/v1/',
        r'^/static/',
        r'^/media/',
        r'^/admin/',
        r'^/registration/',
        r'^/',
    )
    

    希望它很清楚,至少它可以给你一个不同的方法。

    【讨论】:

    • 这样的东西正是我想要的。谢谢
    【解决方案2】:

    我会使用这样的视图装饰器:

    def paying_only(view):
        def _decorated(request, *args, **kwargs):
            if not is_paying(request.user):
                redirect('page_explaining_that_this_is_for_paying_users_only')
            return view(request, *args, **kwargs)
        return _decorated
    
    @paying_only
    def some_view(request):
        ...
    

    【讨论】:

    • 我认为装饰器是一个干净的解决方案。我过去使用中间件来限制对封闭测试版网站的访问。
    【解决方案3】:

    这是一个非常广泛的问题。一种解决方案是在每个用户上存储一个trial 标志。在经过身份验证的请求中,检查您的控制器中的 User.trial(可能还有视图),并有选择地允许/拒绝访问端点或有选择地呈现页面的某些部分。

    如果您希望使用 Django 的内置功能,您可以将“试用”视为权限或用户组。

    【讨论】:

    • 很难提供示例,因为这些东西非常依赖于您自己的代码和环境。查找 Django 用户权限和组的示例。
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2019-09-08
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多