Попытка развернуть 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 настроена правильно и активна при развертывании.

Локальный выход: enter image description here

enter image description here

Вот вывод после развертывания: enter image description here

enter image description here

Вернуться на верх