Python 在Django中,如何保持模块';封装在模块内的url配置?

Python 在Django中,如何保持模块';封装在模块内的url配置?,python,django,django-rest-framework,json-api,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() RO

目前,我使用以下工具将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/url.py
中的单独文件中

并且仍然保留这些URL:

  • 获取/接线员/获取接线员列表
  • POST/greeter/创建新的接线员
我试过:

my_项目/url.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')),
]
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/url.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)),
]
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)),
]
但是得到:

$ 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"
    }
  ]
}
如果有帮助的话,以下是我已经解决的原始问题:

更新:

在答案的帮助下,我能够得出以下解决方案:

my_项目/url.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')),
]
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/url.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)),
]
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配置都保存在问候者的内部 模块
  • 项目url配置将“问候者”资源与 迎宾舱
  • 似乎可以将附加的迎宾视图添加到 问候者url配置(我还没有测试过)

我想这是我能得到的最好的了。再次感谢所有的帮助:)

从正则表达式中删除
^
(符号)就可以了

# greeter/urls.py
# your code

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

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

主要内容:

应用程序:

(由于除了路由器URL之外,您没有其他URL,因此不需要使用include there,您可以直接使用路由器URL。)


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

正如我在中提到的,请在
urlpatterns
中添加一些前缀(因为这是其他方法)。空正则表达式
r'^'
可能会导致很多问题。建议始终添加一些前缀。唯一的方法是使用这种URL:/prefix/greeter/?但强制使用前缀似乎有些奇怪,因为大多数其他RESTful URL都不需要前缀:也许我应该放弃将它们分成两个单独的文件。再次感谢你的帮助谢谢你的提示。我会试试看。可能明天再发回来。谢谢JPG的帮助。这个答案并没有把我带到最后一段代码,但我非常感谢。再次感谢并保重:)谢谢丹尼尔的帮助。你的示例代码让我找到了最终的解决方案。我剩下的担心是“除了视图集的URL之外,不能有其他URL”。我希望上述解决方案能够解决这一问题。或者至少,由于模块只与一个资源相关,因此可以为迎宾者资源设置一个视图集。再次感谢:)