gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:37:24 25 4
gpt4 key购买 nike

目前,我将 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/创建新的问候语

我已经尝试过:

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)),
]

这样:

  • 所有的greeter url 配置都保存在greeter 内部模块
  • 项目 URL 配置将“greeter”资源与迎宾模块
  • 似乎可以添加额外的迎宾 View 迎宾网址配置(我还没有测试过)

我认为这已经是我能得到的最好的了。再次感谢您的帮助:)

最佳答案

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

主要:

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

应用程序:

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

urlpatterns = ROUTER.urls

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

另请注意,这整件事几乎肯定不是您想要做的;这意味着您永远不能拥有除 View 集之外的任何 URL。

关于python - 在 Django 中,如何将模块的 url 配置封装在模块内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52267547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com