在Django中,如何将模块的url配置封装在模块内部?

时间:2018-09-11 01:37:52

标签: python django django-rest-framework json-api

当前,我使用以下命令将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中的单独文件中?

并仍然保留以下网址:

  • 获取/ greeter /以获取问候者列表
  • POST / 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"
    }
  ]
}

以防万一,这是我原来的问题已解决: Method "POST" not allowed with 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”资源与 迎宾模块
  • 似乎可以将其他问候者视图添加到 迎宾者网址配置(我尚未对此进行测试)

我认为这尽我所能。再次感谢您的所有帮助:)

2 个答案:

答案 0 :(得分:2)

正如我之前对您所说,路由器需要一个前缀。您需要从主要网址中删除该前缀,并在路由器本身中使用它。

主要:

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之外,您再也没有其他任何URL。

答案 1 :(得分:0)

从正则表达式中删除 ^ Caret符号)即可完成

# greeter/urls.py
# your code

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