Администратор 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>.*)$", ...)
- это универсальный шаблон, который соответствует всему