Каналы Python Django выдают ошибку при запуске на компьютере коллеги, но не на моем компьютере, что происходит не так?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Каналы Python Django выдают ошибку при запуске на компьютере коллеги, но не на моем компьютере, что происходит не так?

Сообщение Anonymous »

Я столкнулся со следующей ошибкой.
Странность этой ошибки заключается в том, что она не возникает на моем компьютере с Windows 11, а возникает только на компьютере с Windows 11 коллега и на удаленном Linux-сервере Debian, который я настроил специально, чтобы проверить, возникнет ли подобная ошибка и в Linux.
Все компьютеры имеют одинаковый код (синхронизированный с git), одни и те же библиотеки. (pip Freeze и venv), та же версия Python (кроме Linux-сервер)
Я не могу выяснить причину и не могу найти никакой информации о подобной ошибке на StackOverflow или любом другом сайте. Самое странное, что он работает на моем компьютере!

Код: Выделить всё

Traceback (most recent call last):
File "/usr/lib/python3.11/threading.py", line 1038, in _bootstrap_inner
self.run()
File "/usr/lib/python3.11/threading.py", line 975, in run
self._target(*self._args, **self._kwargs)
File "/srv//venv/lib/python3.11/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "/srv//venv/lib/python3.11/site-packages/daphne/management/commands/runserver.py", line 128, in inner_run
application=self.get_application(options),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/srv//venv/lib/python3.11/site-packages/daphne/management/commands/runserver.py", line 153, in get_application
return ASGIStaticFilesHandler(get_default_application())
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/srv//venv/lib/python3.11/site-packages/daphne/management/commands/runserver.py", line 31, in get_default_application
raise ImproperlyConfigured("Cannot import ASGI_APPLICATION module %r" % path)
django.core.exceptions.ImproperlyConfigured: Cannot import ASGI_APPLICATION module 'config.asgi'
Эта ошибка очень бесполезна, поэтому после дополнительной отладки мы выяснили, что причина сбоя:

Код: Выделить всё

ImportError: cannot import name 'DEFAULT_CHANNEL_LAYER' from 'channels'
Мой компьютер:
Windows 11 — Python 3.12.1 (работает здесь)
Мой коллега:
Windows 11 — Python 3.12.1 (здесь не работает)
Сервер Linux (текущая обратная трассировка):
Debian — Python 3.11.2 (не работает) работайте и здесь)
Это маловероятно из-за несоответствия версии Python, потому что у моего коллеги тоже есть эта проблема, и он использует ту же версию, что и я.
Я хотел бы добавить, что используемые каналы django представляют собой относительно чистую установку. Поэтому я считаю, что проблема в настройке. Мы также используем Django Rest Framework, Django Tenants и Django Tenant User в качестве основных библиотек.
Ошибка выдается только при использовании сервера ASGI daphne вместо WSGI по умолчанию, и происходит сбой только тогда, когда потребитель импортируется, иначе он не аварийно завершает работу.
Соответствующий код:
asgi.py

Код: Выделить всё

import os

from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
from django.urls import path
from config.middleware import TokenAuthMiddleware

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
# Initialize Django ASGI application early to ensure the AppRegistry
# is populated before importing code that may import ORM models.
django_asgi_app = get_asgi_application()

from apps.chats.consumers import MyWebSocketConsumer

application = ProtocolTypeRouter({
"http": django_asgi_app,
"websocket": TokenAuthMiddleware(
URLRouter(
[
path("ws/test/", MyWebSocketConsumer.as_asgi()),
]
)
),
})
config/middleware.py

Код: Выделить всё

from django.contrib.auth.models import AnonymousUser
from rest_framework.authtoken.models import Token
from channels.db import database_sync_to_async
from channels.middleware import BaseMiddleware

@database_sync_to_async
def get_user(token_key):
try:
token = Token.objects.get(key=token_key)
return token.user
except Token.DoesNotExist:
return AnonymousUser()

class TokenAuthMiddleware(BaseMiddleware):
def __init__(self, inner):
super().__init__(inner)

async def __call__(self, scope, receive, send):
try:
token_key = dict(scope['headers']).get(b'authorization').decode('ascii').split(" ")[1]
except ValueError:
token_key = None
print("test3")
print(token_key)
scope['user'] = AnonymousUser() if token_key is None else await get_user(token_key)
return await super().__call__(scope, receive, send)
apps/chats/consumers.py

Код: Выделить всё

import json
from channels.generic.websocket import JsonWebsocketConsumer
from django_tenants.utils import get_tenant_model

from apps.public.models import Domain
from django_tenants.utils import tenant_context

Tenant = get_tenant_model()

class MyWebSocketConsumer(JsonWebsocketConsumer):
def connect(self):
user = self.scope['user']

tenant_domain = dict(self.scope['headers']).get(b'host').decode('ascii').split(":")[0]
tenant_domain_obj = Domain.objects.get(domain=tenant_domain)
tenant = Tenant.objects.filter(domains=tenant_domain_obj).first()

with tenant_context(tenant):
if user.is_authenticated:
user_chats = user.chats_followed.all()

self.groups = [f"chat_{chat.id}"  for chat in user_chats]

# Subscribe the WebSocket connection to all the user's chat groups
for group_name in self.groups:
self.channel_layer.group_add(group_name, self.channel_name)

# Accept the WebSocket connection
self.accept()

def disconnect(self, close_code):
# Remove the WebSocket connection from the group
for group_name in self.groups:
self.channel_layer.group_discard(group_name, self.channel_name)

def receive_json(self, content):
# This is called when a message is received from the client
message = content.get("message", "")
chat_id = content.get("chat_id")

print(message)

# Broadcast the message to the specific chat group
if chat_id:
group_name = f"chat_{chat_id}"
self.channel_layer.group_send(
group_name,
{
"type": "chat_message",
"chat_id": chat_id,
"message": message,
}
)

def chat_message(self, event):
message = event['message']

# Send the message to the WebSocket
self.send(text_data=json.dumps({"message": message}))
Я сам совершенно озадачен тем, почему это работает на моем компьютере, а не на чужом компьютере.
  • У меня есть проверил переменные среды (с ними все в порядке)
  • Я проверил версию Python
  • Я проверил установленные пакеты
    < li>Я проверил версии ОС
это все то же самое, что происходит не так.

Подробнее здесь: https://stackoverflow.com/questions/792 ... er-but-not
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как узнать, отключается ли удаленный одноранговый коллеги при использовании CloudFlare Calls SFU?
    Anonymous » » в форуме Javascript
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Django webrtc и каналы django
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Keycloak – Почему я получаю 405, а мои коллеги нет?
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Почему я получаю 405, а мои коллеги нет?
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Почему я получаю 405, а мои коллеги нет? [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»