Python 在Django中,如何保持模块';封装在模块内的url配置?
目前,我使用以下工具将url配置导入到Django项目中: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
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/创建新的接线员
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”。我希望上述解决方案能够解决这一问题。或者至少,由于模块只与一个资源相关,因此可以为迎宾者资源设置一个视图集。再次感谢:)