1

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

0 Answers0