Администратор 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