2011-12-27 7 views
0

私はPythonを初めて使い、ちょうどdjangoチュートリアルを終えました。私はdjangoで動くサイトを持っており、私はdjangoが管理する同じデータベースからデータを送受信する必要があるアンドロイドアプリケーションを作成しています。 Webサイトとアプリケーションは同じ機能を提供しますが、アプリケーション用にレンダリングされたページは必要ありません。コマンドとシリアル化されたオブジェクトを送受信したいだけです。基本的に私は何をする必要があるかhttpリクエストを受け取ったときにPythonプログラムを実行するにはどうすればよいですか?

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

に(携帯から)HTTP要求を受信されて、私は何/編集する方法についていくつかのポインタを持ってもらえますか?ありがとう。

答えて

7

DjangoでAPIを作成しようとしているようです。 REST APIの詳細についてはhereをご覧ください。基本的なアイデアは、あなたのWebサイトには、各リンクが何らかのアクション(データベースの更新など)を行うか、JSONで最も一般的な情報を返すか(dbからオブジェクトを返すなど)、コマンドリンク/ 、または両方を行います。

あなたがしなければならないことは、apiが処理しなければならないすべての可能なコマンドのリストを作ることです。これには、データの取得、挿入、更新、および削除のすべてのコマンドが含まれます。

この例では、アプリケーションの唯一の仕事はストア内のアイテムを管理することだと仮定します。これは非常に簡素化されたデモですが、それはポイントを得る必要があります。ここで

は(Store Djangoのアプリ内で)Djangoのモデルである:

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"), 
    ) 
    

    ため


URL構造を保存するために追加のアイテムを特定の項目

  • を削除

    djangoからの情報を取得するために、djangoのシリアル化関数は非常に役に立ちます。 Hereはそのためのdjangoドキュメントです。

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

    をする必要があります。このAndroidアプリのために新しいアイテム

    の追加:

    #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配列を返すです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") 
    

    を削除それでは、この方法がなると、異なる要求の種類に応じて異なるアクションを行うことです。これは非常に、非常に簡単なデモであることを


    コメント

    注意。エラーチェックやユーザー認証などは考慮されていませんが、うまくいけばそれはあなたにいくつかのアイデアを与えるでしょう。

  • 関連する問題