如何在没有AuthMiddlewareStack的情况下使用Django频道进行公开聊天?

时间:2018-11-05 17:18:23

标签: django channels

已更新: 我想与移动应用实现聊天。移动应用程序用户不是Django用户,因此Django无法对其进行身份验证。

我不明白如何在路由中不使用AuthMiddlewareStack。现在我的代码是:

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    url(r"leadusers/(?P<pk>\d+)/(?P<chatid>[\w-]+)/$", LeadUserConsumer, name='leaduser_consumer'),
                ]
            )
        ),
    ),
})

我试图仅删除此类AllowedHostsOriginValidator-不起作用。

可能是创建自定义身份验证的答案吗?

class QueryAuthMiddleware:
"""
Custom middleware (insecure) that takes user IDs from the query string.
"""

def __init__(self, inner):
    # Store the ASGI application we were passed
    self.inner = inner

def __call__(self, scope):
    # Look up user from query string (you should also do things like
    # check it's a valid user ID, or if scope["user"] is already populated)
    user = User.objects.get(id=int(scope["query_string"]))
    close_old_connections()
    # Return the inner application directly and let it run everything else
    return self.inner(dict(scope, user=user))

可能有人知道吗?请帮助。

1 个答案:

答案 0 :(得分:0)

AuthMiddlewareStack组合了AuthMiddlewareSessionMiddlewareCookieMiddlewarehttps://channels.readthedocs.io/en/latest/topics/authentication.html

中间件要做的一件事是在范围内添加一些值。例如,AuthMiddleware从cookie中读取会话ID,在会话中寻找相应的django用户,并将该用户添加到范围中。

如果您不想使用django用户,则根本不必使用AuthMiddlewareAuthMiddlewareStack。您可以在使用者类的 init -方法内编写自己的身份验证代码,然后使用self.user保存用户的连接。

您的路由可能如下所示:

application = ProtocolTypeRouter({
    'websocket': AllowedHostsOriginValidator(
        URLRouter(
            [
                url(r"leadusers/(?P<pk>\d+)/(?P<chatid>[\w-]+)/$", LeadUserConsumer, name='leaduser_consumer'),
            ]
        )
    ),
})