基本上这两种方法都非常相似。request.session
方法可以消除手动在中间件中设置缓存的额外步骤。会话方法的坏处是,如果您使用开箱即用的缓存存储,则无法保证数据可用。例如,可能有 0.1% 的用户禁用了 cookie,您正在使用 memcache 存储,可能需要在重新部署时重新启动您的 memcache 服务器,并且您的登录用户将丢失他们的数据等。总而言之,我不会使用带有缓存存储的会话来存储关键数据。在我的项目中,我更喜欢使用第一个选项,因为它给了我更高级别的控制权。
您可以设置特殊的中间件,将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 中,您可以仅将部门信息附加到选定的视图并以有效的方式缓存结果(如果需要,将请求代理到数据库):
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 {}