Как развернуть приложение django с каналами и websocket на Heroku?
Я создаю мессенджер. Я столкнулся с необходимостью развернуть мое приложение на heroku.
Мой config/settings.py
from pathlib import Path
from datetime import timedelta
import os
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = os.environ.get('SECRET_KEY')
DEBUG = True
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_simplejwt',
'corsheaders',
'users',
'tokens',
'channels',
'chat',
'college'
]
AUTH_USER_MODEL = 'users.User'
ASGI_APPLICATION = 'config.asgi.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [(os.environ.get('REDIS_URI'), 25690)],
},
},
}
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'config.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ.get('ELEPHANT_NAME'),
'USER': os.environ.get('ELEPHANT_USER'),
'PASSWORD': os.environ.get('ELEPHANT_PASSWORD'),
'HOST': os.environ.get('ELEPHANT_HOST'),
'PORT': 5432
}
}
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
........................
Я пользователь heroku-redis
config.asgi
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import chat.routing
from config.middlewares import TokenAuthMiddleware
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": TokenAuthMiddleware(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})
Procfile
release: python manage.py migrate
web: daphne config.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker channels --settings=core.settings -v2
Честно говоря, я не знаю, какой порт я должен указать. Не думаю, что это имеет значение, поэтому я оставил 8001
requirements.txt
....................
daphne==3.0.2
Django==3.2.9
gunicorn==20.1.0
hiredis==2.0.0
psycopg2==2.9.2
channels==3.0.4
channels-redis==3.3.1
.....................
ошибка, которую я получаю
Как я могу решить эту проблему? Если вам нужно что-то еще показать, пожалуйста, комментируйте
Вам нужно вызвать get_asgi_application
перед импортом любых моделей, import chat.routing
, похоже, запускает импорт моделей, поэтому вызовите get_asgi_application()
перед этим импортом
config.asgi
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
django_asgi_app = get_asgi_application()
import chat.routing
from config.middlewares import TokenAuthMiddleware
application = ProtocolTypeRouter({
"http": django_asgi_app,
"websocket": TokenAuthMiddleware(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})