如何在收到http请求后让django运行python程序?

时间:2011-12-27 01:27:27

标签: django api rest

我是python的新手,刚刚完成了django教程。我有一个django驱动的站点,我正在编写一个Android应用程序,需要从django管理的同一个数据库发送和接收数据。网站和应用程序提供相同的功能,但我不希望为应用程序呈现页面,我只想发送/接收命令和序列化对象。基本上我需要做的是

django ---> Run myProgram.py ---> Update database ---> send confirmation to client.

中接收http请求(来自移动设备)

我可以提供一些关于编辑内容/位置的指示吗?感谢。

1 个答案:

答案 0 :(得分:7)

您似乎正在尝试使用Django创建API。您可以阅读有关REST API的更多信息here。基本的想法是你的网站将有一组命令链接/网址 - 其中每个链接将执行一些操作(更新数据库等),只返回一些信息(最常见的是JSON - 例如从数据库返回一个对象) ,或将两者兼顾。

您需要做的是列出api必须处理的所有可能命令。这将包括检索,插入,更新和删除数据的所有命令。

对于此示例,我们假设应用程序的唯一作业是管理商店中的项目。这是一个非常简化的演示,但它应该得到重点。

这是一个Django模型(在Store django app中):

class Item(models.Model):
    name = models.CharField(max_length=255)
    price = models.IntegerField() # assume the price is always int
    quantity = models.IntegerField()

那么我们假设api的可能命令是:

  • 获取有关特定项目的信息
  • 获取有关所有项目的信息
  • 更新特定项目的信息
  • 删除特定项目
  • 将商品添加到商店

所有命令的网址结构

urlpatterns = patterns('',
    # will be used for getting, updating, and removing an item
    url(r'^item/(?P<item_id>\d+)/$', "item"),
    # will be used to get info about all items
    url(r'^item/all/$', "item_all"),
    # will be used to create new item
    url(r'^item/new/$', "item_new"),
)

获取有关所有项目的信息

为了从django获取信息信息,django序列化函数非常有用。 Here是django的文档。

#views.py
from django.core import serializers
import json

def item_all(request):
    items = Item.objects.all()
    data = serializers.serialize("json", items)
    return HttpResponse(data, mimetype="application/json")

这样做会返回一个包含所有项目的JSON数组:

[
  {
    pk: 1,
    model: "store.item",
    fields: {
      name: "some_name",
      price: 20,
      quantity: 1000
    }
  },
  // more items here
]

添加新项目

为此你的Android应用程序必须将一个JSON对象发送到django。

JSON对象:

{ data:
        {
          name: "some_name",
          price: 40,
          quantity: 2000
        }
}

所以现在你的django应用程序必须解析请求中的信息才能创建一个新项目:

#views.py

def item_new(request):
    # the request type has to be POST
    if request.method != "POST":
         return HttpResponseBadRequest("Request has to be of type POST")
    postdata = request.POST[u"data"]
    postdata = json.loads(postdata)
    item = Item()
    item.name = postdata["name"]
    item.price = postdata["price"]
    item.quantity = postdata["quantity"]
    item.save()
    data = serializers.serialize("json", [item])
    return HttpResponse(data, mimetype="application/json")

一些注意事项:

请注意使用POST请求类型。这在REST API中非常重要。基本上取决于请求类型,将执行不同的操作。在下一个视图中,这将更加生动。


获取,更新和删除

#views.py

def item(request, item_id):
    item = get_object_or_404(Item, pk=item_id)
    if request.method == "GET":
        data = serializers.serialize("json", [item])
        return HttpResponse(data, mimetype="application/json")
    elif request.method == "POST":
        postdata = request.POST[u"data"]
        postdata = json.loads(postdata)
        item.name = postdata["name"]
        item.price = postdata["price"]
        item.quantity = postdata["quantity"]
        item.save()
        data = json.dumps(True)
        return HttpResponse(data, mimetype="application/json")
    elif request.method == "DELETE":
        item.delete()
        data = json.dumps(True)
        return HttpResponse(data, mimetype="application/json")
    else:
         return HttpResponseBadRequest("Invalid request")

因此,该方法将根据不同的请求类型执行不同的操作。


<强> 评论

请注意,这是一个非常非常简单的演示。它没有考虑任何错误检查,用户身份验证等。但希望它会给你一些想法。