gpt4 book ai didi

Django REST 框架 - 根据 http 方法不同的同一 url View

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

我有一个 REST 框架 API,我必须根据方法将 URL 分派(dispatch)到 2 个不同的 View 。

架构是这样的:

bookshop/authors/ - lists all authors, with POST - adds an author

bookshop/authors/<author>/ - with GET - gets details for an author, including books

bookshop/authors/<author>/ - with POST - creates a posting of a book for the same author.

bookshop/authors/<author>/<book>/ - gets a book, no posting

一般来说,对于我的所有 API,我都使用带有路由器的 View 集。

我尝试这样做:

urlpatterns = patterns(
'',
url(r'^author/(?P<author>[0-9]+)',
AuthorViewSet.as_view({'get': 'retrieve'}),
name='author-detail'),
url(r'^author/(?P<author>[0-9]+)',
BookViewSet.as_view({'post': 'create'})),
)

但随后它会转到第一个 url, View 集会检查方法并抛出异常 MethodNotAllowed。

我试图像这样捕捉它:

try: 
urlpatterns = patterns(
'',
url(r'^author/(?P<author>[0-9]+)',
AuthorViewSet.as_view({'get': 'retrieve'}),
name='author-detail')
)
except MethodNotAllowed:
urlpatterns = patterns(
'',
url(r'^author/(?P<author>[0-9]+)',
BookViewSet.as_view({'post': 'create'})),
)

但是它也不起作用。

有什么方法可以使用 View 集来做到这一点吗?

最佳答案

问题在于,以这种方式组织 API 违反了 RESTful 约定。打破 RESTful 约定并不总是坏事,但通常代表着糟糕的设计,并且当然意味着用户更难使用围绕 Restframework 设计的第三方软件来支持您的架构。所以我的建议是将您的 API 架构更新为:

GET  bookshop/authors/ - lists all authors
POST bookshop/authors/ - creates an author
GET bookshop/authors/<author>/ - gets details for an author
POST bookshop/authors/<author>/books/ - creates a book for an author
GET bookshop/authors/<author>/books/<book> - gets a book

如果您需要添加帖子,您也可以添加(我不确定对象之间的关系,因此不确定下面的内容是否准确地表示了该关系)。

POST bookshop/authors/<author>/books/<book>/postings - creates a posting
GET bookshop/authors/<author>/books/<book>/postings/<posting> - gets a posting

关于Django REST 框架 - 根据 http 方法不同的同一 url View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37054793/

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