Python 在Django中创建非RESTAPI的最简单方法是什么?

Python 在Django中创建非RESTAPI的最简单方法是什么?,python,json,django,api,rest,Python,Json,Django,Api,Rest,关于其余部分的赞成和反对意见存在争论。 我个人在我的项目中不需要它,这个话题不是为了讨论我实际需要它的事实^^ 请注意,我在“REST模式”中使用了Tastypie,并决定切换到非REST模式,因为我的应用程序根本不基于CRUD。我的API是应用程序API,而不是用户API。在我的情况下,使用休息迫使我做肮脏和愚蠢的事情 在我的项目中,我想做的事情再简单不过了: 自定义URL#1执行一些自定义Django代码 自定义URL#2执行其他自定义Django代码 等等。。。就这样 我唯一需要的是:

关于其余部分的赞成和反对意见存在争论。 我个人在我的项目中不需要它,这个话题不是为了讨论我实际需要它的事实^^

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

在我的项目中,我想做的事情再简单不过了:

  • 自定义URL#1执行一些自定义Django代码
  • 自定义URL#2执行其他自定义Django代码
  • 等等。。。就这样
我唯一需要的是:

  • 获取并发布请求
  • 当一个用户调用一个URL时,我想知道这个用户是谁(request.user)或者没有经过身份验证。我使用经典的HTTP身份验证
  • 以JSON格式返回结果,以便我的客户理解
我不需要侵入式API的东西(但我不得不在REST模式下使用它)是:

  • 按资源拆分逻辑->当一个请求需要处理多个模型时,拆分的资源会让我为达到目标而疯狂
  • 身份验证->让我自己用Django代码来处理它!我的模特们确实知道谁能做什么
那么,如何简单地创建这个非REST api呢?使用哪种框架?
非常感谢。

我在项目中使用了一些方法。 您必须定义基本资源:

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中:

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

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

我在回答自己的问题:

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

在构建Tastypie时,我试图创建一些非常完整和全面的东西。结果是编写了大量的钩子方法(为了易于扩展)&大量(感知到的)膨胀,因为我试图以灵活/可重写的方式适应人们可能想要/需要的一切。但实际上,我个人真正想要的只是RESTful动词、JSON序列化和重写行为的能力

这个框架允许您硬编码每个REST方法的行为(谢谢!!!!)


现在唯一要做的就是尝试以一种优雅的方式绕过“REST行为”…

将创建您自己的视图来处理请求,然后返回JSON。这太简单了?您必须为CBV创建基类,它处理数据并支持您需要的HTTP方法。例如,当您执行
POST
时,可以从请求中获取它,并调用类中定义的继承基本资源的
POST()
方法。框架对于你来说太重了。嘿@schillingt这太简单了,我根本没想过:)它实际上很聪明。。。我自己要做的两件事是处理GET vs POST+JSON序列化。“我想这两件事都不复杂。”谢谢你的回答。不过我对CBV还不太了解,但我正在阅读文档以便更好地理解您的答案:)@schillingt 1只看到一个问题:在这种情况下,您如何处理登录?我使用了经典的HTTP身份验证。谢谢!我开始明白了。但是假设我永远不会使用同一个URL来创建GET或POST。我的意思是我将有“^get your cool resource/$”和“^post your cool resource/$”两种方式。代码是如何以这种方式编写的?实际上,您可以在一个类中定义GET和POST,但是在url中您将有
url(“^GET your cool resource/$”,views.SuppaView(methods=['GET'])
url(“^POST your cool resource/$”,views.SuppaView(methods=['POST'])