Приложение Django, работающее поверх Serverless + Lambda + API Gateway HTTP API, переписывает ссылки, чтобы они имели префикс default

Мое приложение Django (в основном основанное на REST Framework) в настоящее время создает URL на странице администратора, которые не разрешаются. Ожидаемый результат заключается в том, что запрос на вход Django Admin отправляет форму с помощью POST на /admin/login. Результирующий URL, переданный Django в качестве URL отправки формы, - /$default/admin/login, который возвращает 404 с еще более туманным /$default/$default/admin/login/.

Предполагаю, что у меня какая-то неправильная конфигурация в конфигурации Django или serverless.yml.

В соответствии со следующим serverless.yml Я использую API Gateway V2, Django через WSGI и функции Lambda.

service: api
app: api
org: myapp
frameworkVersion: '3'
provider:
  name: aws
  runtime: python3.8
functions:
  serve:
    handler: wsgi_handler.handler
    timeout: 20
    environment:
      DB_NAME: ${param:db_name}
      DB_PASSWORD: ${param:db_password}
      DB_USER: ${param:db_user}
      DB_PORT: ${param:db_port}
      DB_HOST: ${param:db_host}
    events:
      - httpApi: "*"
  migration:
    handler: migrate.handler
    timeout: 60
    environment: 
      DB_NAME: ${param:db_name}
      DB_PASSWORD: ${param:db_password}
      DB_USER: ${param:db_user}
      DB_PORT: ${param:db_port}
      DB_HOST: ${param:db_host}
custom:
  wsgi:
    app: myapp.wsgi.application
plugins:
  - serverless-python-requirements
  - serverless-wsgi

Мои URL довольно стандартны:

from django.contrib import admin
from django.urls import path, include

from rest_framework.schemas import get_schema_view

schema_view = get_schema_view(
    title="MyApp",
    description="MyApp Universal API",
    version="1.0.0",
)

urlpatterns = [
    path("admin/", admin.site.urls),
    path("user/", include("myapp.core.urls"), name="user"),
    path("openapi", schema_view, name="openapi-schema"),
]

Моя конфигурация еще более стандартная:

Что касается результирующего сообщения об ошибке:

enter image description here

Любая помощь (или идеи) была бы очень признательна!

Я пробовал изменять структуру путей serverless.yml и безрезультатно копался в исходном коде Django в поисках каких-либо подсказок. Естественно, я бы хотел, чтобы админка Django работала. Что касается остальной части приложения, то оно работает нормально, поскольку сам API не является самоссылающимся. Django просто не возвращает правильный путь.

Кратко говоря, Django думает, что все мои маршруты имеют префикс /$default/, но это не так. Я ищу либо решение, чтобы заставить путь, отправляемый Django, быть /, либо исправление для моей конфигурации Serverless, чтобы смягчить эту проблему.

Мне удалось решить эту проблему с помощью довольно нишевой опции настроек Django. https://docs.djangoproject.com/en/4.1/ref/settings/#force-script-name

Хотя это не объясняет, почему он разрешает путь к /$default/, это смягчает эту проблему.

Если вы используете это для другого случая, чем я, и ваш путь находится в подкаталоге (например, противоположном моему), то вы должны добавить ваш путь в FORCE_SCRIPT_NAME вместо этого.

Смотрите ссылку, которую я предоставил для получения дополнительной информации.

Добавьте следующее в settings.py вашего приложения или в любой файл, который вы используете в качестве DJANGO_SETTINGS_MODULE.

# Force Django to resolve the URL to the root of the site
# This is required for API Gateway <- WSGI -> Django path resolution to work properly.
FORCE_SCRIPT_NAME = ""
Вернуться на верх