Администратор Django всегда перенаправляется на статическое приложение react

Я обслуживаю статическое приложение React в Django следующим образом:

# In /my_django_project/urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r"^(?P<path>.*)$", my_django_app.views.serve_react, {"document_root": settings.REACT_APP_BUILD_PATH})]
# In /my_django_app/views.py
from django.views.static import serve as static_serve

def serve_react(request, path, document_root=None):
    path = posixpath.normpath(path).lstrip("/")
    fullpath = pathlib.Path(safe_join(document_root, path))
    if fullpath.is_file():
        return static_serve(request, path, document_root)
    else:
        return static_serve(request, "index.html", document_root)

Согласно документации Django, URL-адреса подбираются в порядке их объявления в urlpatterns и останавливаются на первом совпадении.

Но если я обращаюсь к http://127.0.0.1:8000/admin или http://127.0.0.1:8000/admin/, я всегда получаю перенаправление на домашнюю страницу моего статического приложения React, несмотря на то, что URL admin/ стоит первым в шаблонах URL (как будто упорядочивание не имеет значения).

Если я закомментирую строку static_serve, страница администратора будет обслуживаться, как и ожидалось.

Почему? Как

сделать так, чтобы страница администратора обслуживалась ?

Ммм. Привет и потрясающе круто! Привет и потрясающе круто!

re_path(r"^(?P<path>.*)$", ...) соответствует всем URL-адресам, включая /admin/ маршрут.

Добавьте ^(?!admin/), чтобы исключить URL-адреса, начинающиеся с /admin/, гарантируя правильную загрузку страницы администратора Django.

Изменить urls.py вот так:

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r"^(?!admin/)(?P<path>.*)$", my_django_app.views.serve_react, {"document_root": settings.REACT_APP_BUILD_PATH}),
]

PS: простое изменение порядка не сработает, потому что re_path(r"^(?P<path>.*)$", ...) - это универсальный шаблон, который соответствует всему

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