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 № 1Wyglą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.