1

我从普通的 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)

在视图中使用 sweetpie 资源
从另一个视图调用我服务器上的 API

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

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

4

1 回答 1

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() 

希望能帮助到你。

于 2013-02-01T16:16:13.640 回答