Администратор 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, страница администратора будет обслуживаться, как и ожидалось.

Почему? Как

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

Mm. Hey and Awesome cool! Hey and awesome cooooool!

The re_path(r"^(?P<path>.*)$", ...) matches all URLs including /admin/ route.

Add ^(?!admin/) to exclude URLs starting with /admin/, ensuring the Django admin page loads correctly.

Modify urls.py like this:

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: simply switching the order won't work because re_path(r"^(?P<path>.*)$", ...) is a catch-all pattern that matches everything

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