使用其他视图的 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()
希望对你有帮助。
【讨论】:
感谢您的回答。这真的让我很失望。我最初将utils
和view
分开。我认为tastepie 可以取代utils
的功能,但我想不会。为什么叫API framework
,那么当我现在显然需要3个组件时,utils
、view
和api
。
我的意思是,那我为什么要用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 布局