Попытка развернуть API Django в веб-приложении Azure
В настоящее время я пытаюсь развернуть свой бэкэнд Django на Azure. Проект запускается локально без проблем. Он также прекрасно собирается и разворачивается в Azure, но когда я захожу в домен по умолчанию, то получаю сообщение 404 not found. Сначала я подумал, что проблема связана с модулем настроек, так как у меня их 2, в зависимости от локальности или запуска на Azure, как показано в этом учебнике Azure с кодом здесь в файлах settings.py и production.py, но, похоже, все работает. Я пробовал разные настройки в production.py, в том числе добавлял туда все модули, но это не дало никакого эффекта. Журналы Azure не выдают никаких ошибок, только ошибку 404, когда я пытаюсь получить доступ к сайту. Может ли проблема быть связана с тем, как я настраиваю URLS? Урл api выглядит следующим образом
from django.urls import path
# from .views import *
from . import views
urlpatterns = [
path("posts/", views.PostsListCreate.as_view(), name="post-view-create"),
path("replies/", views.RepliesListCreate.as_view(), name="reply-view-create")
]
Пока урлы проектов выглядят следующим образом
from django.urls import path, include
from django.contrib import admin
urlpatterns = [
path('', include("api.urls")),
path('admin/', admin.site.urls),
]
Вот и мои взгляды тоже
from rest_framework import generics
from .models import Posts
from .serializers import PostSerializer
from .models import Replies
from .serializers import RepliesSerializer
class PostsListCreate(generics.ListCreateAPIView):
queryset = Posts.objects.all()
serializer_class = PostSerializer
class RepliesListCreate(generics.ListCreateAPIView):
queryset = Replies.objects.all()
serializer_class = RepliesSerializer
Я попробовал несколько различных настроек модуля настроек и добавление всех ссылок на 1. Я ожидаю, что при переходе к определенным конечным точкам домена по умолчанию на Azure будут отображаться соответствующие представления.
Я создал приложение Django на основе предоставленных вами фрагментов кода, вы можете проверить мой пример кода.
Я получил ту же самую 404 ошибку, которая в основном возникает, когда ALLOWED_HOSTS
конфигурация в settings.py
неправильная.
Я изменил ALLOWED_HOSTS
на '*'
, разрешив все домены.
Это мой project/settings.py:
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'your-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',
'api',
]
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'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',
]
ROOT_URLCONF = 'yourproject.urls'
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 = 'yourproject.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
- Убедитесь, что ваш
wsgi.py
правильно установил DJANGO_SETTINGS_MODULE в 'yourproject.settings'.
wsgi .py:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourproject.settings')
application = get_wsgi_application()
api/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path("posts/", views.PostsListCreate.as_view(), name="post-view-create"),
path("replies/", views.RepliesListCreate.as_view(), name="reply-view-create")
]
api/views.py:
from django.http import HttpResponse
from rest_framework import generics
from .models import Posts, Replies
from .serializers import PostSerializer, RepliesSerializer
class PostsListCreate(generics.ListCreateAPIView):
queryset = Posts.objects.all()
serializer_class = PostSerializer
class RepliesListCreate(generics.ListCreateAPIView):
queryset = Replies.objects.all()
serializer_class = RepliesSerializer
def index(request):
return HttpResponse("Welcome to the Django API. Use /api/posts/ or /api/replies/ to access the API endpoints.")
Я добавил models.py
и serializers.py
в api.
api/models.py:
from django.db import models
class Posts(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
def __str__(self):
return self.title
class Replies(models.Model):
post = models.ForeignKey(Posts, on_delete=models.CASCADE)
content = models.TextField()
def __str__(self):
return self.content
api/serializers.py
from rest_framework import serializers
from .models import Posts, Replies
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Posts
fields = '__all__'
class RepliesSerializer(serializers.ModelSerializer):
class Meta:
model = Replies
fields = '__all__'
project/urls.py:
from django.contrib import admin
from django.urls import path, include
from api import views
urlpatterns = [
path('', views.index, name='index'),
path('api/', include('api.urls')),
path('admin/', admin.site.urls),
]
project/manage.py:
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourproject.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
Это мой requirements.txt файл:
Django==3.2.4
djangorestframework==3.12.4
whitenoise
Выполните приведенные ниже команды, чтобы собрать статические файлы для производства.
python manage.py collecstatic
python manage.py migrate
- Убедитесь, что вы установили
DEBUG = False
вsettings.py
перед развертыванием веб-приложения в Azure App Service. - Убедитесь, что виртуальная среда вашего проекта Django настроена правильно и активна при развертывании.
Локальный выход:
Вот вывод после развертывания: