代码之家  ›  专栏  ›  技术社区  ›  Zhao Li

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

  •  1
  • Zhao Li  · 技术社区  · 8 年前

    目前,我将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:

    • 获取/问候语/获取问候语列表
    • 发布/问候语/创建新问候语

    我已经尝试过:

    我的项目/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

    更新:

    在答案的帮助下,我得出了这个解决方案:

    我的项目/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)),
    ]
    

    用这个:

    • 所有的问候语URL配置都保存在问候语中。 模块
    • 项目URL配置将“问候语”资源与 欢迎模块
    • 似乎可以将其他问候语视图添加到 问候语URL配置(我还没有测试过这个)

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   Daniel Roseman    8 年前

    如我之前所说,路由器需要一个前缀。您需要从主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。)

    另外请注意,这一整件事几乎肯定不是您想要做的;这意味着除了视图集的URL之外,您永远无法拥有其他任何URL。

        2
  •  0
  •   JPG    8 年前

    去掉 ^ (the Caret symbol)from regex表达式将执行该操作

    # greeter/urls.py
    # your code
    
    urlpatterns = [
        url(r'', include(ROUTER.urls)),
    ]