Django中间件,会话和缓存入门

蒂诺

我的Django应用程序中的每个用户都与一个部门相关联,并且几乎每个请求都涉及一些与部门相关的处理。因此,我很想让部门对象在整个应用程序中可用。

以下哪一项是最合适的方法:

  1. 定制的中间件,它简单地从数据库中检索相关部门并将其附加到request对象上,例如request.department,类似于Django的,AuthenticationMiddleware可以通过访问当前登录的用户request.user(例如,请参见此处此处
  2. 用户登录时将部门放置在会话中,然后使用Django的request.session界面在视图中检索该部门

我还没有机会熟悉Django的缓存功能,但是我想最终以每个用户为单位缓存该部门,以避免在每个请求上额外的数据库命中。我看到Django的会话提供了内置的缓存支持我也想像也可以用第一种方法来实现缓存。

与自定义中间件(上面的#1)相比,使用会话(上面的#2)有优势吗?从内部API的角度来看,中间件方法似乎更干净,但是我猜想这正是会话设计的目的-也许这是开始使用它们的正确时机?

感谢您的指导!

Dmytriy Voloshyn

基本上,两种方法都非常相似。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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

django中间件错误

来自分类Dev

django中间件错误

来自分类Dev

从缓存中排除中间件

来自分类Dev

使用中间件Laravel或使用If会话?

来自分类Dev

如何创建一个在Django登录时设置会话变量的中间件?

来自分类Dev

在laravel 5.3中从Web中间件访问api中间件的会话

来自分类Dev

如何分析Django中间件本身?

来自分类Dev

Django Channels中间件使用ORM

来自分类Dev

Django中间件插件与视图

来自分类Dev

Django中间件无法正常工作

来自分类Dev

Django 平面页面中间件

来自分类Dev

cookie会话中间件如何在expressjs中工作?

来自分类Dev

Express + PostgreSQL的最佳会话存储中间件

来自分类Dev

OWIN中间件可以使用http会话吗?

来自分类Dev

ArangoDB:Foxx会话中间件与CORS冲突

来自分类Dev

为过期的会话创建Redux中间件重试功能

来自分类Dev

快速会话中间件的秘密目的是什么?

来自分类Dev

OWIN中间件可以使用http会话吗?

来自分类Dev

在环形中间件中访问会话数据

来自分类Dev

在 Laravel 的自定义中间件中使用会话

来自分类Dev

在单元测试期间,如何在Django RequestFactory中设置消息传递和会话中间件

来自分类Dev

如何在django中使用中间件同时处理基于会话和基于令牌的身份验证?

来自分类Dev

如何在django中使用中间件同时处理基于会话和基于令牌的身份验证?

来自分类Dev

Django QuerySet和缓存

来自分类Dev

Django QuerySet和缓存

来自分类Dev

认证中间件

来自分类Dev

存根中间件

来自分类Dev

捆绑中间件

来自分类Dev

中间件除外