Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
|
django_api [2022/02/23 14:01] enrique_mieza_sanchez [BasicAuthentication] |
django_api [2025/02/05 23:49] (actual) enric_mieza_sanchez [APIs amb Django] |
||
|---|---|---|---|
| Línia 1: | Línia 1: | ||
| ====== APIs amb Django ====== | ====== APIs amb Django ====== | ||
| - | Les API o // | + | Les API o // |
| + | |||
| + | Es basen en l' | ||
| + | * **Mètodes** equivalents al CRUD de BD: **GET, POST, PUT, DELETE** (però poden definir-se més). | ||
| + | * [[https:// | ||
| Referències teoria i documentació: | Referències teoria i documentació: | ||
| Línia 6: | Línia 10: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[Django Ninja]] en aquesta wiki, per implementar APIs de forma similar a FastAPI. | ||
| - | {{tag> #FpInfor #DawMp07 #DawMp07Uf4 # | + | {{tag> |
| \\ | \\ | ||
| Línia 17: | Línia 22: | ||
| Aquestes crides AJAX es poden resoldre amb una simple [[https:// | Aquestes crides AJAX es poden resoldre amb una simple [[https:// | ||
| - | Per exemple, seguint el tutorial de Django " | + | Per exemple, seguint el tutorial de Django " |
| - | <file python | + | <file python |
| from django.http import JsonResponse | from django.http import JsonResponse | ||
| from polls.models import * | from polls.models import * | ||
| Línia 26: | Línia 31: | ||
| def get_questions(request): | def get_questions(request): | ||
| - | | + | |
| return JsonResponse({ | return JsonResponse({ | ||
| " | " | ||
| - | " | + | " |
| }, safe=False) | }, safe=False) | ||
| </ | </ | ||
| + | |||
| + | <WRAP info> | ||
| + | Observa bé què cal per poder serialitzar els objectes del model: | ||
| + | jsonData = list( Question.objects.all().values() ) | ||
| + | |||
| + | - Tenim un queryset de Questions | ||
| + | - Seleccionem només els valors amb '' | ||
| + | - Transformem en una llista amb '' | ||
| + | </ | ||
| Recorda que abans caldrà que implementis un // | Recorda que abans caldrà que implementis un // | ||
| Línia 38: | Línia 52: | ||
| from django.urls import path | from django.urls import path | ||
| - | from . import views | + | from . import views, api |
| urlpatterns = [ | urlpatterns = [ | ||
| path('', | path('', | ||
| #... | #... | ||
| - | path(' | + | path(' |
| ] | ] | ||
| </ | </ | ||
| Línia 51: | Línia 65: | ||
| {" | {" | ||
| + | <WRAP tip> | ||
| Si voleu un //pretty print// del JSON a la línia de comandes podeu fer: | Si voleu un //pretty print// del JSON a la línia de comandes podeu fer: | ||
| $ curl localhost: | $ curl localhost: | ||
| - | {{ django_get_questions_api.png? | + | I per acabar-ho d' |
| + | $ curl localhost: | ||
| + | </ | ||
| + | |||
| + | El //browser// sempre és un tiro segur molt còmode: | ||
| + | {{ django_get_questions_api.png? | ||
| \\ | \\ | ||
| Línia 80: | Línia 100: | ||
| <WRAP tip> | <WRAP tip> | ||
| + | == Decorator @user_passes_test == | ||
| Existeixen altres // | Existeixen altres // | ||
| </ | </ | ||
| Línia 121: | Línia 142: | ||
| curl -u admin: | curl -u admin: | ||
| - | O en la versió amb indentació o " | + | <WRAP info> |
| + | De vegades ens pot interessar una alternativa enviant les dades codificades en base64 en els // | ||
| + | curl -H ' | ||
| + | |||
| + | Per obtenir el //hash// en base64 es pot fer: | ||
| + | echo -n " | ||
| + | </ | ||
| + | |||
| + | <WRAP tip> | ||
| + | O en la versió amb indentació o " | ||
| curl -H ' | curl -H ' | ||
| + | </ | ||
| <WRAP todo> | <WRAP todo> | ||
| Línia 128: | Línia 159: | ||
| - Cerca com ha de ser una query per a enregistrar un nou usuari. | - Cerca com ha de ser una query per a enregistrar un nou usuari. | ||
| - Comprova que si no ens autentiquem no ens deixa enregistrar-lo. | - Comprova que si no ens autentiquem no ens deixa enregistrar-lo. | ||
| - | * Quin //status code// ens dóna amb l' | + | * Quin //status code// ens dóna amb l' |
| - Comprova què passa si intentem insertar un User amb un username preexistent. | - Comprova què passa si intentem insertar un User amb un username preexistent. | ||
| * Quin //status code// ens dóna amb l' | * Quin //status code// ens dóna amb l' | ||
| Línia 173: | Línia 204: | ||
| Per utilitzar el Token: | Per utilitzar el Token: | ||
| - | curl -X GET http:// | + | curl http:// |
| \\ | \\ | ||
| - | ==== Objectes aniuats ==== | + | ===== Objectes aniuats |
| <WRAP todo> | <WRAP todo> | ||
| Exercici amb objectes aniuats: | Exercici amb objectes aniuats: | ||
| Línia 186: | Línia 217: | ||
| \\ | \\ | ||
| + | |||
| + | ===== URLs personalitzades amb TokenAuthentication del REST framework ===== | ||
| + | |||
| + | Si volem fer les nostres pròpies URLs per a la API i volem afegir-hi algun dels mètdodes d' | ||
| + | |||
| + | <code python> | ||
| + | from rest_framework.authentication import TokenAuthentication, | ||
| + | from rest_framework.permissions import IsAuthenticated | ||
| + | from rest_framework.decorators import api_view, authentication_classes, | ||
| + | from django.http import JsonResponse | ||
| + | |||
| + | @api_view([' | ||
| + | @authentication_classes([TokenAuthentication, | ||
| + | @permission_classes([IsAuthenticated]) | ||
| + | def pin_request(request): | ||
| + | return JsonResponse({ | ||
| + | " | ||
| + | " | ||
| + | }) | ||
| + | |||
| + | urlpatterns += [ | ||
| + | path(' | ||
| + | ] | ||
| + | </ | ||
| + | |||
| + | \\ | ||
| + | |||