【问题标题】:Can I have different root URLs in the same app?我可以在同一个应用程序中有不同的根 URL 吗?
【发布时间】:2018-10-06 20:04:55
【问题描述】:

在我的 DRF 项目中,我有 2 个应用程序,UsersProductsProducts 有 2 个模型:CategoryProduct。我的根 URL conf 看起来像这样

api_urls = [
    path('users/', include('users.urls')),
    path('products/', include('products.urls'))
]

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

和 products.urls

urlpatterns = [
  path('', views.ProductListCreateAPIView.as_view())
]

我希望我的 API 方案类似于

/api/users/
/api/products/
/api/categories/

现在,这对前两个 URL 工作正常,但显然不是第三个,即如果我要添加

path('categories', views.CategoriesListCreateAPIView.as_view())

对于我的 products.urls,URL 方案将是

/api/products/categories/

我的问题是,有没有办法在不将Category 拆分成自己的应用程序的情况下实现/api/categories/ 的目标?我觉得保证拥有自己的应用程序似乎太微不足道了,应该与Product 在同一个应用程序中。显然,我想我可以直接在根 URL conf 中导入视图,但这并不像是一个“干净”的解决方案。我应该考虑为类别创建一个单独的应用程序吗? Product 模型与 Category 有外键关系,对我来说,感觉好像 2 个单独的应用程序只会让事情变得复杂。

【问题讨论】:

  • 没有根本原因需要将其拆分为不同的应用程序。 Django 应用程序只是一种构造代码和命名数据库表的便捷方式。 Django rest 框架包括它自己的 url 路由器,它在底层 django 路由之上添加了额外的功能。这正是 drf 路由器的用例。 django-rest-framework.org/api-guide/routers
  • @HåkenLid 您能否提供一个使用路由器的这种场景的工作示例?
  • 这在我看来是一个非常典型的 API 结构,所以我喜欢的官方文档中的示例应该可以工作。

标签: django django-rest-framework django-urls


【解决方案1】:

我最终选择了以下方法:我没有在我的 Products 应用程序中使用单个 urls.py,而是在应用程序中创建了一个 URL 模块,并在其中添加了两个 urlconfs,每个 @987654326 一个@和Product

#product/urls/producturls.py

urlpatterns = [
  path('', views.ProductListCreateAPIView.as_view())
]

#product/urls/categoryurls.py

urlpatterns = [
  path('', views.CategoryListCreateAPIView.as_view())
]

然后我include()都在我的根urlconf

api_urls = [
    path('users/', include('users.urls')),
    path('products/', include('products.urls.producturls')),
    path('categories/', include('products.urls.categoryurls'))
]

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

【讨论】:

    【解决方案2】:

    首先你需要认识到你有一些相互矛盾的要求;你想做一些不寻常的事情(同一个应用程序中有两个单独的根路径),但你也想保持它“干净”。

    我能想到的最简洁的解决方案是在包含应用程序 urlconf 时根本不使用前缀,而是在文件中设置它,就像为 api 前缀所做的那样。所以:

    path('', include('products.urls'))
    

    然后

    product_patterns = [
      path('', views.ProductListCreateAPIView.as_view()),
      ...
    ]
    
    urlpatterns = [
        path('categories', views.CategoriesListCreateAPIView.as_view()),
        path('products/', include(product_patterns)
    ]
    

    【讨论】:

    • 在这种情况下您会推荐什么?类别应该是一个单独的应用程序吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2018-04-03
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2020-01-31
    • 2023-01-13
    相关资源
    最近更新 更多