I'm making a custom token authentication backend for my django channels app. I'm trying to setup the self.scope['user'] as follows. This is my middleware.py file
class TokenAuthMiddleware:
"""
Token authorization middleware for Django Channels 2
"""
def __init__(self, inner):
self.inner = inner
async def __call__(self, scope):
User = get_user_model()
query = str(scope['query_string'].decode())
user_slug = query[-8:]
print(user_slug)
user = await database_sync_to_async(User.objects.get)(slug=user_slug)
scope['user'] = await user
print('__________')
print(scope['user'])
print('__________')
return self.inner(scope)
TokenAuthMiddlewareStack = lambda inner: TokenAuthMiddleware(AuthMiddlewareStack(inner))
And the following is my error log:
[Failure instance: Traceback: <class 'TypeError'>: 'coroutine' object is not callable
E:\Side\Web\Django Channels\channels\lib\site-packages\autobahn\websocket\protocol.py:2839:processHandshake
E:\Side\Web\Django Channels\channels\lib\site-packages\txaio\tx.py:366:as_future
E:\Side\Web\Django Channels\channels\lib\site-packages\twisted\internet\defer.py:151:maybeDeferred
E:\Side\Web\Django Channels\channels\lib\site-packages\daphne\ws_protocol.py:83:onConnect
--- <exception caught here> ---
E:\Side\Web\Django Channels\channels\lib\site-packages\twisted\internet\defer.py:151:maybeDeferred
E:\Side\Web\Django Channels\channels\lib\site-packages\daphne\server.py:207:create_application
]
My settings.MIDDLEWARE:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'profiles.middleware.hide_django_admin_middleware'
]
Routing.py file:
from channels.routing import ProtocolTypeRouter, URLRouter
from django.urls import path, re_path
from django.conf.urls import url
from chat.consumers import ChatConsumer, NotifyConsumer
from channels.auth import AuthMiddlewareStack
from profiles.middleware import TokenAuthMiddlewareStack
application = ProtocolTypeRouter({
'websocket': TokenAuthMiddlewareStack(
URLRouter([
url(r'^ws/chat/(?P<other_slug>[^/]+)/', ChatConsumer),
url(r'^ws/', NotifyConsumer),
]))
})
I'm using channels version 2.4.0
How to solve this? Thanks in advance