Django:相同的方法不同的网址

Posted

技术标签:

【中文标题】Django:相同的方法不同的网址【英文标题】:Django: same method different url 【发布时间】:2016-12-23 02:13:05 【问题描述】:

我的网址是这样的:

/api/v1/files/
/api/v1/files/100

使用相同的函数来匹配它们是一个好习惯吗?就像下面这样:

class FileView(APIView):
    parser_classes = (MultiPartParser,)
    permission_classes = (IsAuthenticated,)

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(FileView, self).dispatch(request, *args, **kwargs)

    def post(self, request, pk = None):
        if pk is not None:
            Do something
        else:
            do something

如何在基于类的视图中使用不同的功能? 谢谢

【问题讨论】:

【参考方案1】:

我认为拥有单独的方法比基于pk 分支的单一方法更干净。只需查看视图的方法,而不是必须遵循(尽管很简单)控制流,就更容易理解哪些逻辑在哪里。

我的第一个建议是查看viewsets that Django Rest Framework provides 并查看在它提供的给定方法中执行您的逻辑。这似乎最适合您的用例。

另一种选择是查看基于 these mixins 的 DRF 的 generic views。与视图集相比,它们允许更多的控制和自定义,如果您不需要视图集提供的所有功能,有时是更好的选择。

【讨论】:

我已经使用过 post/get/delete/。并且 PUT 不适合这种情况。我会阅读你的参考资料。谢谢 视图集提供listretrievecreate等方法。因此,例如,create 处理到您的 /files/ 端点的 POST,retrieve 处理到您的 /files/100 端点的 GET,而list 处理到您的 /files/ 端点的 GET。只是出于好奇,你想让/files/100 的 POST 做什么? 更新文件对象的某些字段 那么我认为这就是 PUT 和 PATCH 的用途。如果您只是更新单个字段,则使用 PATCH 或视图集中的 partial_update 方法。 使用PUT创建资源,还是使用POST更新资源?在django rest框架中,PUT可以用来创建还是更新?

以上是关于Django:相同的方法不同的网址的主要内容,如果未能解决你的问题,请参考以下文章

Django 视图与网址进阶

Django 视图与网址进阶

如何存根request.get三次?有2个相同的网址和1个不同的网址?

网址在 Django 中不起作用

00-django | 02-处理HTTP请求

Django 动态网址