首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django上通用数据或流程的最佳实践是什么?

django上通用数据或流程的最佳实践是什么?
EN

Stack Overflow用户
提问于 2012-03-26 12:54:49
回答 2查看 217关注 0票数 0

我想在我的Django项目中做一个高级应用。下面是app上的函数。我只知道什么是最好的实践。

案例1. #在会话中使用装饰器

代码语言:javascript
复制
    ''' In custom decorator '''
    def get_premium_status():
        def decorator(func):
            def inner_decorator(request, *args, **kwargs):
                #checking user status logic...

                request.session['premium'] = True

            return func(request, *args, **kwargs)

         return wraps(func)(inner_decorator)
     return decorator


    ''' In app '''
    @get_premium_status() # using decorator with session
    function premium_bbs_list() {
        status = request.session["premium"]
        print status
    }

    @get_premium_status() # using decorator with session
    function premium_bbs_view() {
        status = request.session["premium"]
        print status
    }

案例2. #在view中调用函数

代码语言:javascript
复制
    function get_premium_status()
        return True

    function premium_bbs_list() {
        status = get_premium_status()
        print status
    }

    function premium_bbs_view() {
        status = get_premium_status()
        print status
    }

第一种情况不起作用。b/c如果用户未登录,则Django会话不起作用。案例2并不花哨。我想用装饰器。但我不知道怎么解决第一个案子。

哪种情况是最好的?我怎么才能解决第一个问题呢?或者,如果您对此主题有任何好的最佳实践,请在任何情况下让我知道。

非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2012-03-26 13:01:28

如果我要实现这一点,我会考虑编写Middleware来向request添加一个is_premium字段。

票数 0
EN

Stack Overflow用户

发布于 2012-03-26 13:39:43

首先,会话不依赖于django.contrib.auth,反之亦然。因此,会话与匿名用户一起工作。

但在这种情况下仍然使用会话感觉并不正确,因为会话被设计为在请求之间保存状态,而不是在请求期间。如果您想坚持使用装饰器模式,您可以添加一个自定义属性来请求,如下所示:

代码语言:javascript
复制
request._is_user_premium = True

from your view:
is_premium = getattr(request, '_is_user_premium', False)

但如果我是你,我会通过将这个逻辑封装在某种权限类中来实现这一点:

代码语言:javascript
复制
class Permissions(object):
    def __init__(self, request):
        self.request = request

    def has_premium_access():
        #implement your logic here and return a boolean
        return True

#view code
def myView(request):
    perm = Permissions(request)
    if perm.has_premium_access():
        #do stuff
    else:
        #do other stuff

(只是把它写在我的头上,可能会有一些语法错误;)

但正如David Wolever提到的,在中间件中实现这种逻辑也是可能的,只要确保您的自定义属性是惰性的,这样如果您只在某些视图中需要此属性,那么您就不会在每次请求时都访问数据库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9866756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档