这是Django中间件线程安全吗?

这是Django中间件线程安全吗?,django,python-2.6,django-1.4,Django,Python 2.6,Django 1.4,我正在使用自定义会话/auth/users/acl系统在Django上编写论坛应用程序。目标之一是允许用户浏览和使用我的应用程序,即使他们关闭了cookie。来自PHP世界,这个问题的最佳解决方案是将sid=附加到页面上的每个链接。以下是我的计划: 会话中间件检查用户是否有会话cookie或记住我cookie。如果他做了,这很可能意味着饼干对他有用。若他并没有,我们生成新的会话ID,打开新会话(在数据库的会话表中创建新条目),然后发送cookie并将用户重定向到他所在的位置,但将SID附加到ur

我正在使用自定义会话/auth/users/acl系统在Django上编写论坛应用程序。目标之一是允许用户浏览和使用我的应用程序,即使他们关闭了cookie。来自PHP世界,这个问题的最佳解决方案是将sid=附加到页面上的每个链接。以下是我的计划:

会话中间件检查用户是否有会话cookie或记住我cookie。如果他做了,这很可能意味着饼干对他有用。若他并没有,我们生成新的会话ID,打开新会话(在数据库的会话表中创建新条目),然后发送cookie并将用户重定向到他所在的位置,但将SID附加到url。重定向后,中间件将查看会话id是否可以从cookie或GET中获得。如果它是cookie,我们将停止向URL添加sid。如果它得到了,我们保留它们

我计划通过在django.core.urlresolvers.reverse和reverse_lazy上附加?SID=的函数来将SID=part插入url。但是,这会带来一些问题,因为中间件和URL解析程序都不是线程安全的。为了克服这一点,我创建了如下内容:

class SessionMiddleware(object):
    using_decorator = False
    original_reverse = None

    def process_request(self, request):        
        self.using_decorator = True
        self.original_reverse = urlresolvers.reverse
        urlresolvers.reverse = session_url_decorator(urlresolvers.reverse, 's87add8ash7d6asdgas7dasdfsadas')

    def process_response(self, request, response):
        # Turn off decorator if we are using it
        if self.using_decorator:
            urlresolvers.reverse = self.original_reverse
            self.using_decorator = False
        return response
如果必须通过链接传递SID,则使用_decorator将_请求集处理为true,并将未修饰的urlresolvers.reverse存储在单独的方法中。在呈现页面之后,进程\响应使用\ decorator检查是否必须执行“垃圾收集”。若确实如此,它会将反向函数返回到原始的未修饰状态

我的问题是,这种方法是线程安全的吗?或者我的论坛流量的增加会导致中间件一次又一次地装饰这些功能,无法运行“垃圾收集”?我还考虑使用正则表达式来简单地浏览生成的HTML响应中的链接,并提供模板过滤器和变量,以便手动将SID添加到正则表达式忽略的位置


哪种方法更好?当前的单线程安全吗?

首先:在URL中使用SID是非常危险的,例如,如果您复制并粘贴一个朋友的链接,他将以您的身份登录。因为大多数用户不知道SID是什么,所以他们会遇到这个问题。因此,你永远不应该在url中使用SID,因为Facebook和朋友都需要cookies,所以你也应该很好

考虑到这一点,monkeypatching urlResolver.reverse很幸运地不起作用!使用自定义URLResolvers子类可能是可行的,但我建议不要这样做


是的,您的中间件不是线程安全的。中间件只初始化一次并在线程之间共享,这意味着在self上存储任何东西都不是线程安全的。

我的问题来自在线列表和在线计数器。当你被不做cookies的用户访问时,你最终会发现在线计数器大得离谱,因为他的每一个请求都会打开一个新的会话。我想我会通过只显示和统计“匹配”字段设置为true的用户来应对它,从而对第二个请求成功匹配会话的用户进行计数。