我想在我的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. #在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
}第一种情况不起作用。b/c如果用户未登录,则Django会话不起作用。案例2并不花哨。我想用装饰器。但我不知道怎么解决第一个案子。
哪种情况是最好的?我怎么才能解决第一个问题呢?或者,如果您对此主题有任何好的最佳实践,请在任何情况下让我知道。
非常感谢。
发布于 2012-03-26 13:01:28
如果我要实现这一点,我会考虑编写Middleware来向request添加一个is_premium字段。
发布于 2012-03-26 13:39:43
首先,会话不依赖于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提到的,在中间件中实现这种逻辑也是可能的,只要确保您的自定义属性是惰性的,这样如果您只在某些视图中需要此属性,那么您就不会在每次请求时都访问数据库。
https://stackoverflow.com/questions/9866756
复制相似问题