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

问题描述 投票:1回答:2

目前,我将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的单独文件?

并保留这些网址:

  • GET / 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')),
]

招待员/ 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')),
]

招待员/ 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)),
]

有了这个:

  • 所有的greeter url配置都保存在greeter模块内
  • 项目网址配置将“greeter”资源与greeter模块联系起来
  • 似乎可以在greeter url配置中添加额外的greeter视图(我没有测试过这个)

我认为这和我能得到的一样好。再次感谢所有的帮助:)

python django django-rest-framework json-api
2个回答
2
投票

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

主要:

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

应用:

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

urlpatterns = ROUTER.urls

(由于除路由器之外没有任何URL,因此您不需要在那里使用包含,您可以直接使用路由器URL。)

还要注意,这整件事几乎肯定不是你想要做的;这意味着除了视图集之外,您永远不会有任何URL。


0
投票

从正则表达式中删除^Caret符号)将完成这项工作

# greeter/urls.py
# your code

urlpatterns = [
    url(r'', include(ROUTER.urls)),
]
© www.soinside.com 2019 - 2024. All rights reserved.