Using tastypie api from other views

别说谁变了你拦得住时间么 提交于 2020-01-05 06:47:31

问题


I am calling tastypie api from normal django views.

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 view
Call an API on my server from another view

achieve the same thing but seems harder.

Is my way of calling api acceptable?
Besides, it would be awesome if I could get the result in python dictionary instead of json.
Is it possible?


回答1:


If you need a dictionary, it means that you must design your application better. Don't do important stuff in your views, nor in the Tastypie methods. Refactor it to have common funcionality.

As a general rule, views must be small. No more than 15 lines. That makes the code readable, reusable and easy to test.

I'll provide an example to make it clearer, suppose in that Tastypie method you must be creating a Like object, maybe sending a signal:

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

But, if you need to reuse that behavior in a view, the proper thing would be to factorize that in a different function:

# 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

Now you can call it from your API method and your view:

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

And in your view...

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

Hope it helps.



来源:https://stackoverflow.com/questions/14647819/using-tastypie-api-from-other-views

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!