/ / Jak mogę zmusić django do uruchamiania programu Pythona po otrzymaniu żądania http? - django, api, odpoczynek

Jak mogę uzyskać django do uruchomienia programu python po otrzymaniu żądania http? - django, api, reszta

Jestem nowy w Pythonie i właśnie skończyłem djangoinstruktaż. Mam witrynę zasilaną przez django i piszę aplikację na Androida, która musi wysyłać i odbierać dane z tej samej bazy danych zarządzanej przez django. Witryna i aplikacja zapewniają tę samą funkcjonalność, ale nie chcę renderować stron dla aplikacji , chcę tylko wysyłać/odbierać polecenia i serializowane obiekty. Zasadniczo to, co muszę zrobić, to

odbierz żądanie http (z telefonu komórkowego) w django ---> Run myProgram.py ---> Update database ---> send confirmation to client.

Czy mogę uzyskać kilka wskazówek dotyczących tego, co/gdzie edytować? Dzięki.

Odpowiedzi:

7 dla odpowiedzi № 1

Wygląda na to, że próbujesz stworzyć API za pomocą Django. Możesz czytać tutaj więcej o REST API.Podstawową ideą jest to, że Twoja witryna będzie miała zestaw linków poleceń/urls - gdzie każdy link albo wykona jakąś akcję (aktualizacja bazy danych, itp.), tylko zwróci jakąś informację (najczęściej w JSON - np. zwróci obiekt z bazy danych) lub zrobi jedno i drugie.

Musisz zrobić listę wszystkich możliwych poleceń, które interfejs API będzie musiał obsłużyć. Obejmuje to wszystkie polecenia pobierania, wstawiania, aktualizowania i usuwania danych.

W tym przykładzie załóżmy, że jedynym zadaniem aplikacji jest zarządzanie towarami w sklepie. Jest to bardzo uproszczone demo, jednak powinno przekazać sedno sprawy.

Oto model Django (w obrębie Store aplikacja django):

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

Załóżmy więc, że możliwe polecenia dla api to:

  • Uzyskaj informacje o konkretnym przedmiocie
  • Uzyskaj informacje o wszystkich przedmiotach
  • Zaktualizuj informacje dla określonego przedmiotu
  • Usuń określony przedmiot
  • Dodaj przedmiot do sklepu

Struktura URL dla wszystkich poleceń

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

Uzyskiwanie informacji o wszystkich przedmiotach

Aby uzyskać informacje z django, bardzo pomocne są funkcje serializacji django. Tutaj jest do tego django docs.

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

Spowoduje to zwrócenie tablicy JSON ze wszystkimi takimi elementami:

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

Dodawanie nowej pozycji

W tym celu twoja aplikacja na Androida będzie musiała wysłać obiekt JSON do django.

Obiekt JSON:

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

Więc teraz Twoja aplikacja django musi przeanalizować informacje z żądania, aby utworzyć nowy element:

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

Niektóre uwagi:

Zwróć uwagę na użycie typu żądania POST.Jest to bardzo ważne w REST API. Zasadniczo w zależności od typu żądania będą wykonywane różne akcje. W następnym widoku będzie to znacznie bardziej obrazowe.


Pobieranie, aktualizowanie i usuwanie

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

Tak więc ta metoda będzie polegać na wykonywaniu różnych działań w zależności od innego typu żądania.


Komentarze

Zauważ, że jest to bardzo, bardzo proste demo. Nie uwzględnia sprawdzania błędów, uwierzytelniania użytkowników itp. Ale miejmy nadzieję, że podsunie ci kilka pomysłów.