В Django, как вы храните конфигурации URL-адресов модуля в составе модуля? - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я импортирую конфигурации URL в свой проект Django с помощью:

from django.conf.urls import include
from django.contrib import admin
from django.urls import path, re_path
from rest_framework import routers
from greeter.views import GreeterViewSet

ROUTER = routers.DefaultRouter()
ROUTER.register(r'greeters', GreeterViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^', include(ROUTER.urls)),
]

Есть ли способ, где я могу переместить эти части кода:

ROUTER = routers.DefaultRouter()
ROUTER.register(r'greeters', GreeterViewSet)

в отдельныйфайл в greeter/urls.py?

И по-прежнему сохраняйте эти URL:

  • GET / greeter / для получения списка встречающих
  • POST / greeter / для создания новогоgreeter

Я пытался:

my_project / urls.py

from django.conf.urls import include
from django.contrib import admin
from django.urls import path, re_path

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'^greeters/', include('greeter.urls')),
]

greeter / urls.py

from django.conf.urls import url, include
from rest_framework import routers
from .views import GreeterViewSet

ROUTER = routers.DefaultRouter()
ROUTER.register(r'^', GreeterViewSet)

urlpatterns = [
    url(r'^', include(ROUTER.urls)),
]

Но получил:

$ curl -H 'Accept: application/vnd.api+json; indent=2' -X POST http://localhost:8000/greeters/
{
  "errors": [
    {
      "detail": "Method \"POST\" not allowed.",
      "source": {
        "pointer": "/data"
      },
      "status": "405"
    }
  ]
}

В случае, если это поможет, вот мой оригинальный вопрос, который был решен: Метод "POST" не разрешен с Django Rest Framework

Обновление:

С помощью ответов я смог найти решение:

my_project / urls.py

from django.conf.urls import include
from django.contrib import admin
from django.urls import re_path

urlpatterns = [
    re_path('admin/', admin.site.urls),
    re_path('greeters/', include('greeter.urls')),
]

greeter / urls.py

from django.conf.urls import include
from django.urls import re_path
from rest_framework import routers
from .views import GreeterViewSet

ROUTER = routers.DefaultRouter()
ROUTER.register(r'', GreeterViewSet)

urlpatterns = [
    re_path(r'', include(ROUTER.urls)),
]

При этом:

  • вся конфигурация URL-адреса greeter хранится внутри модуля greeter
  • конфигурация url проекта связывает ресурс 'greeter' с приветствиемer module
  • кажется, что в конфигурацию URL приветствия могут быть добавлены дополнительные виды приветствия (я не проверял это)

Я думаю, что это настолько хорошо, насколько я могу получить,Еще раз спасибо за помощь:)

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Как я уже говорил вам, маршрутизатору нужен префикс.Вам необходимо удалить этот префикс из ваших основных URL-адресов и использовать его в самом маршрутизаторе.

main:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('greeter.urls')),
]

app:

ROUTER = routers.DefaultRouter()
ROUTER.register(r'^greeter/', GreeterViewSet)

urlpatterns = ROUTER.urls

(Поскольку вы неУ вас нет никаких URL, кроме маршрутизатора, вам не нужно использовать include там, вы можете просто использовать URL маршрутизатора напрямую.)

Также обратите внимание, что все это почти наверняка не то, что вы хотитесделать;это означает, что вы не можете иметь никаких URL-адресов, кроме тех, которые указаны для вашего набора.

0 голосов
/ 11 сентября 2018

Удаление ^ (символ Caret ) из выражения регулярного выражения сделает работу

# greeter/urls.py
# your code

urlpatterns = [
    url(r'', include(ROUTER.urls)),
]
...