我想在我的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并不花哨。我想用装饰器。但我不知道如何解决第一个案例。
哪一个是最好的情况?我如何解决它的第一种情况? 或者如果您对此主题有任何良好的最佳实践,请告诉我任何情况。
非常感谢你。
答案 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提到的那样,也可以在中间件中实现这种逻辑,只要确保你的自定义属性是懒惰的,这样如果你只需要这个,你就不会在每个请求上都打到数据库仅在某些视图中属性。