我的Django应用程序中的每个用户都与一个部门相关联,并且几乎每个请求都涉及一些与部门相关的处理。因此,我很想让部门对象在整个应用程序中可用。
以下哪一项是最合适的方法:
request
对象上,例如request.department
,类似于Django的,AuthenticationMiddleware
可以通过访问当前登录的用户request.user
。(例如,请参见此处和此处)request.session
界面在视图中检索该部门。我还没有机会熟悉Django的缓存功能,但是我想最终以每个用户为单位缓存该部门,以避免在每个请求上额外的数据库命中。我看到Django的会话提供了内置的缓存支持。我也想像也可以用第一种方法来实现缓存。
与自定义中间件(上面的#1)相比,使用会话(上面的#2)有优势吗?从内部API的角度来看,中间件方法似乎更干净,但是我猜想这正是会话设计的目的-也许这是开始使用它们的正确时机?
感谢您的指导!
基本上,两种方法都非常相似。request.session
这种方法只需手动设置中间件中的缓存即可消除多余的步骤。关于会话方法的坏事是,如果您开箱即用地使用缓存存储,则不能保证数据是可用的。例如,可能有0.1%的用户具有禁用的Cookie,您正在使用内存缓存存储,可能有必要在重新部署时重新启动内存缓存服务器,并且已登录的用户将丢失其数据,等等。总而言之,我不会将会话与缓存存储一起使用以获取关键数据。在我的项目中,我更喜欢使用1st选项,因为它给了我更大的控制权。
您可以设置具有特殊中间件的view_name
变量添加到请求中,并可以控制显示位置和内容:
class NameMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
# add current view
if isinstance(view_func, str):
request.view_name = view_func
elif hasattr(view_func, '__name__'):
request.view_name = view_func.__name__
然后,您将可以更好地控制在何处向请求提供其他信息,例如,在context_processors中,您可以仅将Department inf附加到选定的视图,并以有效的方式缓存结果(如果需要,可以将请求发送到数据库):
def department_context_processor(request):
if hasattr(request, 'view_name'):
if request.view_name == 'department_view1' or request.view_name == 'department_view2':
departments = cache.get('department_'+str(request.user), None)
if departments is None:
departments = Department.objects.filter(user=request.user)
cache.set('department_'+str(request.user), departments, 60*60)
if departments:
return {
'departments': departments
}
return {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句