使用其他视图的 sweetpie api

Posted

技术标签:

【中文标题】使用其他视图的 sweetpie api【英文标题】:Using tastypie api from other views 【发布时间】:2013-02-01 13:52:50 【问题描述】:

我从普通的 django 视图中调用tastepie api。

def test(request):

    view = resolve("/api/v1/albumimage/like/user/%d/" % 2 )

    accept =  request.META.get("HTTP_ACCEPT")
    accept += ",application/json"
    request.META["HTTP_ACCEPT"] = accept   
    res = view.func(request, **view.kwargs)

    return HttpResponse(res._container)

Using tastypie resource in viewCall an API on my server from another view

实现同样的目标,但似乎更难。

我调用 api 的方式可以接受吗? 此外,如果我能在 python 字典而不是 json 中得到结果,那就太棒了。 是否可以?

【问题讨论】:

不,没有正确的方法来获取作为 python 字典的 api 响应。 我看到from_json 序列化器的方法,不能用吗? 【参考方案1】:

如果您需要字典,则意味着您必须更好地设计您的应用程序。不要在你的观点中做重要的事情,也不要在 Tastypie 方法中做重要的事情。重构它以具有通用功能。

作为一般规则,浏览量必须很小。不超过 15 行。这使代码可读、可重用且易于测试。

我将提供一个示例以使其更清楚,假设在那个 Tastypie 方法中您必须创建一个 Like 对象,可能会发送一个信号:

class AlbumImageResource(ModelResource):
    def like_method(self, request, **kwargs):
        # Do some method checking

        Like.objects.create(
            user=request.user,
            object=request.data.get("object")
        )
        signals.liked_object(request.user, request.data.get("object"))

        # Something more

但是,如果您需要在视图中重用该行为,正确的做法是将其分解为不同的函数:

# myapp.utils
def like_object(user, object):
    like = Like.objects.create(
        user=request.user,
        object=request.data.get("object")
    )
    signals.liked_object(request.user, request.data.get("object"))
    return like

现在您可以从您的 API 方法和视图中调用它:

class AlbumImageResource(ModelResource):
    def like_method(self, request, **kwargs):
        # Do some method checking
        like_object(request.user, request.data.get("object")) # Here!

在你看来……

# Your view
def test(request, object_id):
    obj = get_object_or_404(Object, id=object_id)
    like_object(request.user, obj)
    return HttpResponse() 

希望对你有帮助。

【讨论】:

感谢您的回答。这真的让我很失望。我最初将utilsview 分开。我认为tastepie 可以取代utils 的功能,但我想不会。为什么叫API framework,那么当我现在显然需要3个组件时,utilsviewapi 我的意思是,那我为什么要用tastepie?我认为构建核心服务(您的答案中的实用程序)简单而强大是美味派的工作。我弄错了吗? 是的,你是对的。糟透了。从技术上讲,有一些方法可以在您的视图中使用 API 方法,但这一点都不好。我认为 Tastypie 的设计考虑到了客户。无论如何,如果您之前确实将其分开,那是一件好事。尝试再做一次,这是值得的。 感谢您的回复。当我使用美味派时,我有自定义过滤(build_filters),数据准备代码(脱水)。我的utils 中已经有了这些。所以如果我需要utils,即使我使用了tastepie,(导致重复代码),我为什么要使用tastepie? 因为 Tastypie 支持创建 REST Web 服务的所有管道。也许你需要那个。您可以在视图中轻松使用自己的 Web 服务。只需发出 HTTP 请求,获取响应,解析 JSON,就完成了。那将是一个不同的架构,但没关系,关注点分离很好。

以上是关于使用其他视图的 sweetpie api的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 项目中使用 sweetpie 将多个对象保存在同一模型中

在 django sweetpie 中过滤 GenericForeignKeyField

使用 Jbuilder(或其他)的 Rails JSON API 布局

Autodesk forge 查看其他 3d 视图和选项

django + sweetpie:我如何发布以替换数据而不得到“重复键值违反唯一约束”

DRF框架中其他功能:认证权限限流