已更新: 我想与移动应用实现聊天。移动应用程序用户不是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))
可能有人知道吗?请帮助。
答案 0 :(得分:0)
AuthMiddlewareStack
组合了AuthMiddleware
,SessionMiddleware
和CookieMiddleware
:https://channels.readthedocs.io/en/latest/topics/authentication.html
中间件要做的一件事是在范围内添加一些值。例如,AuthMiddleware
从cookie中读取会话ID,在会话中寻找相应的django用户,并将该用户添加到范围中。
如果您不想使用django用户,则根本不必使用AuthMiddleware
或AuthMiddlewareStack
。您可以在使用者类的 init -方法内编写自己的身份验证代码,然后使用self.user
保存用户的连接。
您的路由可能如下所示:
application = ProtocolTypeRouter({
'websocket': AllowedHostsOriginValidator(
URLRouter(
[
url(r"leadusers/(?P<pk>\d+)/(?P<chatid>[\w-]+)/$", LeadUserConsumer, name='leaduser_consumer'),
]
)
),
})