在Django中创建NON-REST API的最简单方法是什么?

时间:2014-10-24 20:55:28

标签: python json django api rest

关于REST的专业人士和骗局的辩论。 我个人在我的项目中并不需要它,这个主题不是要争论我实际上需要它的事实^^

请注意,我在" REST模式下使用Tastypie"并决定切换到非REST模式,因为我的应用程序根本不是基于CRUD的。我的API是应用程序API ,而不是用户 API。就我而言,使用REST迫使我做肮脏和愚蠢的事情。

在我的项目中,我想做的事情可以更简单:

  • 自定义URL#1执行一些自定义Django代码
  • 自定义URL#2执行其他自定义Django代码
  • 等......那就是它!

我唯一需要的是:

  • GET和POST请求。
  • 当用户调用URL时,我想知道该用户是谁(request.user)还是未经过身份验证。我使用经典的HTTP身份验证。
  • 以JSON的形式返回结果,以便我的客户理解它。

侵入式API的内容我不需要(但我非常不得不在REST模式下使用它):

  • 按资源划分逻辑 - >当一个请求需要处理许多模型时,分割的资源只会让我疯狂到达我的目标。
  • 身份验证 - >让我自己用我的Django代码处理它!我的模型实际上知道谁可以做什么。

那么,如何以简单的方式创建这个非REST API?使用哪个框架? 非常感谢。

2 个答案:

答案 0 :(得分:1)

我的项目中使用了方法。 您必须定义基础资源:

class BaseResource(object):

    __METHODS = {
        'GET': 'get',
        'POST': 'post',
    }

    def __init__(self, methods):
        # here you look what allowed methods are in class init
        # and add it to self.methods

    def _process_body(self, request):
        request.data = None # here you will handle request and put json into variable

    def __call__(self, request, **kwargs):
        # here you look which method of view you must call

        if not request.method in self.methods:
            return HttpResponseNotAllowed(self.methods)

        attr = self.methods[request.method]
        func = getattr(self, attr, None)

        self._process_body(request)
        response = func(request, **kwargs)

        # here you can return response

您的观点可能如下所示:

class SuppaView(BaseResource):
    def post(self, request):
        ...

然后在网址中:

url('^your-cool-resource/$', views.SuppaView(methods=['POST'])),

您可以根据需要添加授权等来装饰类方法。

答案 1 :(得分:1)

我自己回答了这个问题:

我刚刚发现Tastypie的创建者创建了第二个名为Restless的Python API框架。 尽管这个名称,它仍然是一个Restfull框架,但其理念与前一个框架截然不同。

  

在建立Tastypie时,我试图创造出非常完整的东西。全面。结果是写了很多钩子方法(为了方便扩展性)&当我试图以灵活/可覆盖的方式容纳人们可能想要/需要的一切时,很多(感知的)臃肿。但实际上,我真正想要的只是RESTful动词,JSON序列化和覆盖行为的能力。

此框架允许您对每种REST方法的行为进行硬编码(谢谢!!!!)。

现在唯一的事情就是试图绕过" REST行为"以优雅的方式...