Możliwości REST API Pytigona opierają się na fakcie, że każdy ogólny widok już służy podwójnemu celowi: ten sam URL, który renderuje HTML, może zwrócić JSON, XML lub CSV po prostej zmianie parametru.
Dodaj ?format=json do dowolnego URL widoku tabeli Pytigona:
/tables_demo/table/Album/list/?format=json
Odpowiedź:
{
"count": 25,
"offset": 0,
"rows": [
{
"id": 1,
"name": "Abbey Road",
"artist": "The Beatles",
"release_date": "1969-09-26",
"tracks_count": 17
},
...
]
}
Ten sam URL bez ?format=json zwraca stronę tabeli HTML. Te same dane, ten sam URL, inna reprezentacja.
| Format | Parametr URL | Content-Type |
|---|---|---|
| HTML | (domyślny) | text/html |
| JSON | ?format=json lub .../json/list/ |
application/json |
| CSV | .../csv/list/ lub ?format=csv |
text/csv |
| XML | .../xml/list/ |
application/xml |
.../pdf/list/ |
application/pdf |
|
| XLSX | .../xlsx/list/ |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
Dla logiki specyficznej dla API zdefiniuj niestandardowe widoki używając Django REST Framework lub lekkich narzędzi REST Pytigona:
from pytigon_lib.schdjangoext.rest_tools import api_view, api_response
@api_view(['GET'])
def album_api(request):
albums = Album.objects.all()
data = [{"id": a.id, "name": a.name, "artist": a.artist} for a in albums]
return api_response(data)
API widoku listy obsługuje standardowe parametry zapytania:
/tables_demo/table/Album/list/?format=json&offset=0&sort=name&order=asc&search=Beatles
| Parametr | Przeznaczenie |
|---|---|
offset |
Przesunięcie paginacji (od 0) |
sort |
Pole do sortowania |
order |
asc lub desc |
search |
Przeszukiwanie pełnotekstowe w przeszukiwalnych polach |
Pytigon zawiera bibliotekę klienta REST do wykonywania wywołań API z kodu po stronie serwera lub zadań w tle:
from pytigon_lib.schhttptools.rest_client import RestClient
client = RestClient('http://localhost:8000')
response = client.get('/tables_demo/table/Album/list/', params={'format': 'json'})
data = response.json()
Punkty końcowe REST obsługują:
Skonfiguruj uwierzytelnianie w settings_app.py według potrzeb.