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

Chi*_*nex 0 api django rest

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

接收http请求(来自移动设备) django ---> Run myProgram.py ---> Update database ---> send confirmation to client.

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

mik*_*725 7

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

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

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

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

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

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

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

所有命令的URL结构

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"),
)
Run Code Online (Sandbox Code Playgroud)

获取有关所有项目的信息

为了从django获取信息信息,django序列化函数非常有用.是一个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")
Run Code Online (Sandbox Code Playgroud)

这将做的是返回一个包含所有项目的JSON数组,如下所示:

[
  {
    pk: 1,
    model: "store.item",
    fields: {
      name: "some_name",
      price: 20,
      quantity: 1000
    }
  },
  // more items here
]
Run Code Online (Sandbox Code Playgroud)

添加新项目

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

JSON对象:

{ data:
        {
          name: "some_name",
          price: 40,
          quantity: 2000
        }
}
Run Code Online (Sandbox Code Playgroud)

所以现在你的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")
Run Code Online (Sandbox Code Playgroud)

一些说明:

请注意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")
Run Code Online (Sandbox Code Playgroud)

那么这个方法将根据不同的请求类型执行不同的操作.


评论

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