Как запретить Django переопределять URI администратора для / admin вместо / api / admin / - PullRequest
0 голосов
/ 21 октября 2019

Работает над размещением Django API в Kubernetes.

Любой трафик, отправляемый на /, контроллер ingress-nginx отправляет в React FE. Любой трафик, отправляемый на /api, отправляется в Django BE.

Это соответствующая часть ingress-serivce.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /?(.*)
            backend:
              serviceName: client-cluster-ip-service
              servicePort: 3000
          - path: /api/?(.*)
            backend:
              serviceName: server-cluster-ip-service
              servicePort: 5000

Это url.py:

из django.contrib администратор импорта из django.urls import include, path

urlpatterns = [
    path('auth/', include('authentication.urls'), name='auth'),
    path('admin/', admin.site.urls, name='admin'),
]

Часть client работает просто отлично. minikube IP равен 192.168.99.105. При переходе по этому IP-адресу загружается интерфейс реагирования.

При переходе по 192.168.99.105/api/auth/test/ я попадаю в "Hello World!"ответ, который я быстро составил.

Однако, когда я пытаюсь перейти к 192.168.99.105/api/admin. Он автоматически перенаправляет меня на /admin/login/?next=/admin/, который не существует, если удалить /api. Есть ли способ предотвратить такое поведение?

Я также только что попробовал это:

ingress-service.yaml

- http:
    paths:
      - path: /?(.*)
        backend:
          serviceName: client-cluster-ip-service
          servicePort: 3000
      - path: /api/?(.*)
        backend:
          serviceName: server-cluster-ip-service
          servicePort: 5000
      - path: /admin/?(.*)
        backend:
          serviceName: server-cluster-ip-service
          servicePort: 5000

urls.py

urlpatterns = [
    path('auth/', include('authentication.urls'), name='auth'),
    path('/', admin.site.urls),
]

, который просто выдает "Not Found".

Я попытался использовать префикс также, используя этот шаблон, который отображается в документация :

urlpatterns = [
    path('api/', include([
        path('auth/', include('authentication.urls'), name='auth'),
        path('admin/', admin.site.urls),
    ])),
]

Но это только что сделало это /api/api.

Вот маршруты, которые определены для admin/ в site-packages/django/contrib/admin/sites:

# Admin-site-wide views.
urlpatterns = [
    path('', wrap(self.index), name='index'),
    path('login/', self.login, name='login'),
    path('logout/', wrap(self.logout), name='logout'),
    path('password_change/', wrap(self.password_change, cacheable=True), name='password_change'),
    path(
        'password_change/done/',
        wrap(self.password_change_done, cacheable=True),
        name='password_change_done',
    ),
    path('jsi18n/', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
    path(
        'r/<int:content_type_id>/<path:object_id>/',
        wrap(contenttype_views.shortcut),
        name='view_on_site',
    ),
]

Я думаю, '' - это то, что заставляет Django удалить /api из URL и сделать его просто 192.168.99.105/admin вместо 192.168.99.105/api/admin.

1 Ответ

0 голосов
/ 04 ноября 2019

Хорошо, наконец-то разобрался. Определенно был Django параметр. В Django settings.py добавлено следующее:

FORCE_SCRIPT_NAME = '/api/'

Затем мне пришлось обновить STATIC_URL, поскольку он больше не обслуживал ресурсы для портала администратора:

STATIC_URL = '/api/static/`
...