【问题标题】:Django user in tornado龙卷风中的 Django 用户
【发布时间】:2013-05-09 02:28:16
【问题描述】:

我一直在使用下面的代码在 tornado 中获取 django 用户:

from django.conf import settings
import django.contrib.auth
import django.utils.importlib

import tornado
from tornado.options import options
import tornado.web
import tornado.ioloop
import sockjs.tornado

class RouterConnection(sockjs.tornado.SockJSConnection):

    def get_current_user(self, info):
        engine = django.utils.importlib.import_module(django.conf.settings.SESSION_ENGINE)
        session_key = str(info.get_cookie(django.conf.settings.SESSION_COOKIE_NAME)).split('=')[1]

        class Dummy(object):
            pass

        django_request = Dummy()
        django_request.session = engine.SessionStore(session_key)
        user = django.contrib.auth.get_user(django_request)
        return user


    def on_open(self, info):
        user = self.get_current_user(info=info)

if __name__ == "__main__":
    import logging
    Router = sockjs.tornado.SockJSRouter(RouterConnection)

    app = tornado.web.Application(Router.urls, debug=True, )

    app.listen(settings.TORNADO_PORT)

    tornado.options.parse_command_line()
    tornado.ioloop.IOLoop.instance().start()

我的问题如下:
Django 更改了日志配置,我再也看不到龙卷风的任何日志输出。如何重新初始化龙卷风日志记录?还有其他方法可以将 Django 与 Tornado 集成吗?

非常感谢。

【问题讨论】:

    标签: python django websocket tornado sockjs


    【解决方案1】:

    要重置 django 日志记录,我使用以下命令:

    logger = logging.getLogger('')
    for handler in logger.handlers:
        logger.removeHandler(handler)
    tornado.options.parse_command_line()
    

    当使用 django.conf 模块时,LazySettings 类在初始化 django 记录器的地方被初始化。 我还必须使用初始化设置类重写代码:

    from django.conf import settings
    import django.contrib.auth
    import django.utils.importlib
    
    import tornado
    from tornado.options import options
    import tornado.web
    import tornado.ioloop
    import sockjs.tornado
    
    TORNADO_PORT = settings.TORNADO_PORT
    
    class RouterConnection(sockjs.tornado.SockJSConnection):
    
        def get_current_user(self, info):
            engine = django.utils.importlib.import_module(settings.SESSION_ENGINE)
            session_key = str(info.get_cookie(settings.SESSION_COOKIE_NAME)).split('=')[1]
    
            class Dummy(object):
                pass
    
            django_request = Dummy()
            django_request.session = engine.SessionStore(session_key)
            user = django.contrib.auth.get_user(django_request)
            return user
    
    
        def on_open(self, info):
            user = self.get_current_user(info=info)
    
    if __name__ == "__main__":
        import logging
        logger = logging.getLogger('')
        for handler in logger.handlers:
            logger.removeHandler(handler)
        tornado.options.parse_command_line()
    
        Router = sockjs.tornado.SockJSRouter(RouterConnection)
    
        app = tornado.web.Application(Router.urls, debug=settings.DEBUG)
    
        app.listen(settings.TORNADO_PORT)
    
        tornado.options.parse_command_line()
        tornado.ioloop.IOLoop.instance().start()
    

    【讨论】:

      【解决方案2】:

      使用tornado.wsgi.WSGIContainer 包装Django。有关工作示例,请参阅 this demo project

      【讨论】:

      • 谢谢 Stefano,将 django 与 tornado 集成是一个很好的做法,但它不会授予 django 用户访问权限。
      • 这不会授予 Django 用户访问权限:[
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多