Как я могу заставить django запускать программу на python после получения http-запроса? - PullRequest
0 голосов
/ 27 декабря 2011

Я новичок в Python и только что закончил учебник по Django.У меня есть сайт с поддержкой django, и я пишу приложение для Android, которое должно отправлять и получать данные из той же базы данных, которой управляет django.Веб-сайт и приложение предоставляют одинаковую функциональность, но я не хочу, чтобы страницы отображались для приложения, я просто хочу отправлять / получать команды и сериализованные объекты.По сути, мне нужно

получить http-запрос (с мобильного телефона) в django ---> Run myProgram.py ---> Update database ---> send confirmation to client.

Могу ли я иметь несколько советов о том, что / где редактировать?Спасибо.

1 Ответ

7 голосов
/ 27 декабря 2011

Похоже, вы пытаетесь создать API с помощью Django. Вы можете прочитать здесь подробнее об API REST. Основная идея заключается в том, что ваш веб-сайт будет иметь набор командных ссылок / URL-адресов, где каждая ссылка будет либо выполнять какое-либо действие (обновление базы данных и т. Д.), Просто возвращать некоторую информацию (чаще всего в JSON - например, возвращать объект из базы данных) , или сделаю оба.

Что вам нужно будет сделать, это составить список всех возможных команд, которые API будет обрабатывать. Это будет включать все команды извлечения, вставки, обновления и удаления данных.

Для этого примера предположим, что единственной задачей приложения является управление товарами в магазине. Это очень упрощенная демонстрация, однако она должна объяснить все.

Вот модель Django (в приложении Store django):

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

Итак, давайте предположим, что возможные команды для 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"),
)

Получение информации обо всех предметах

Для получения информации от 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")

Что это будет делать, так это возвращать массив 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")

Итак, этот метод будет выполнять различные действия в соответствии с различным типом запроса.


Комментарии

Обратите внимание, что это очень, очень простая демонстрация. Он не учитывает проверку ошибок, аутентификацию пользователей и т. Д. Но, надеюсь, он даст вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...