django上常见数据或流程的最佳实践是什么?

时间:2012-03-26 04:54:49

标签: django django-views

我想在我的Django项目中制作一个高级应用程序。 这是app上的功能。我只知道最佳做法是什么。

案例1.#使用带有会话的装饰

    ''' 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. #call the view in view

    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
    }

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

哪一个是最好的情况?我如何解决它的第一种情况? 或者如果您对此主题有任何良好的最佳实践,请告诉我任何情况。

非常感谢你。

2 个答案:

答案 0 :(得分:0)

如果我正在实施此功能,我会考虑撰写Middleware以向is_premium添加request字段。

答案 1 :(得分:0)

好吧,第一个会话不依赖于django.contrib.auth,反之亦然。因此会话与匿名用户合作。

但在这种情况下仍然使用会话感觉不对,因为会话旨在保存请求之间的状态,而不是在请求期间。如果您想坚持使用装饰器模式,可以像下面这样添加自定义属性:

request._is_user_premium = True

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

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

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提到的那样,也可以在中间件中实现这种逻辑,只要确保你的自定义属性是懒惰的,这样如果你只需要这个,你就不会在每个请求上都打到数据库仅在某些视图中属性。