Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 从其他视图使用tastypieapi_Django_Api_Tastypie - Fatal编程技术网

Django 从其他视图使用tastypieapi

Django 从其他视图使用tastypieapi,django,api,tastypie,Django,Api,Tastypie,我正在从普通的django视图调用tastypieAPI 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.f

我正在从普通的django视图调用tastypieAPI

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)

完成同样的事情,但似乎更难

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

可能吗

如果您需要字典,这意味着您必须更好地设计应用程序。不要在视图中做重要的事情,也不要在tastype方法中做重要的事情。重构它,使其具有共同的功能性

一般来说,视图必须较小。不超过15行。这使得代码可读、可重用且易于测试。

我将提供一个示例使其更清晰,假设在该tastype方法中,您必须创建一个类似的对象,可能会发送一个信号:

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

希望能有所帮助。

如果您需要字典,这意味着您必须更好地设计应用程序。不要在视图中做重要的事情,也不要在tastype方法中做重要的事情。重构它,使其具有共同的功能性

一般来说,视图必须较小。不超过15行。这使得代码可读、可重用且易于测试。

我将提供一个示例使其更清晰,假设在该tastype方法中,您必须创建一个类似的对象,可能会发送一个信号:

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

希望能有所帮助。

不,没有一种合适的方法可以作为python字典获得api响应。我从_json序列化器方法中看到了
,它不能以某种方式使用吗?不,没有一种合适的方法可以作为python字典获得api响应。我从_json
序列化器方法中看到
,它不能以某种方式使用吗?谢谢你的回答。这真让我失望。我最初将
utils
view
分开。我认为tastypie可以取代
utils
的功能,但我想不会。为什么它被称为
API框架
,而我现在显然需要3个组件,
utils
view
API
。我的意思是,为什么我会使用tastypi?我认为构建简单而健壮的核心服务(您的答案中的UTIL)是tastypie的工作。我错了吗?是的,你是对的。真糟糕。从技术上讲,有一些方法可以在视图中使用API方法,但它一点也不好。我认为Tastypie是为客户设计的。不管怎样,如果你以前把它分开了,那是件好事。再试一次,这是值得的。谢谢你的回复。当我使用tastypie时,我有定制的过滤(build_filters),数据准备代码(determinate)。我的
utils
中已经有了这些。因此,如果我需要
utils
,即使我使用了tastype(导致代码重复),为什么还要使用tastype呢?因为tastype支持创建REST web服务的所有管道。也许你需要这个。您可以在视图中轻松使用自己的web服务。只要发出一个HTTP请求,得到响应,解析JSON,就完成了。这将是一个不同的体系结构,但没关系,分离关注点很好。谢谢你的回答。这真让我失望。我最初将
utils
view
分开。我认为tastypie可以取代
utils
的功能,但我想不会。为什么它被称为
API框架
,而我现在显然需要3个组件,
utils
view
API
。我的意思是,为什么我会使用tastypi?我认为构建简单而健壮的核心服务(您的答案中的UTIL)是tastypie的工作。我错了吗?是的,你是对的。真糟糕。从技术上讲,有一些方法可以在视图中使用API方法,但它一点也不好。我认为Tastypie是为客户设计的。不管怎样,如果你以前把它分开了,那是件好事。再试一次,这是值得的。谢谢你的回复。当我使用tastypie时,我有定制的过滤(build_filters),数据准备代码(determinate)。我的
utils
中已经有了这些。因此,如果我需要
utils
,即使我使用了tastype(导致代码重复),为什么还要使用tastype呢?因为tastype支持创建REST web服务的所有管道。也许你需要这个。您可以在视图中轻松使用自己的web服务。只要发出一个HTTP请求,得到响应,解析JSON,就完成了。这将是一个不同的体系结构,但没关系,分离关注点是很好的。