限制所以用户只能查看网站的某个部分-Dangoo

时间:2013-01-15 10:34:30

标签: python django user-interface django-views

我正在使用Django,并且要求某些“试用”用户仅激活网站的某个部分 - 有效的方法是否有任何想法?

我正考虑给付费客户一个特定的ID,并将其链接到网站的网址以供许可。

谢谢,

汤姆

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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):
    ...

答案 2 :(得分: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'^/',
)

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