[[oktatas:web:back-end_framework:django|< Django]] ====== Django REST API keretrendszer ====== * **Szerző:** Sallai András * Copyright (c) 2024, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== * https://www.django-rest-framework.org/ ===== Projekt létrehozása ===== Hozzuk létre a projekt könyvtárat és lépjünk be. mkdir emp cd emp python3 -m venv .venv Aktiváljuk a környezetet: MacOS és Linuxon: source .venv/bin/active Windowson: .\venv\Scripts\activate Ellenőrizzük a jelenlegi függőségeket: pip freeze Indítsunk VSCode-t: code . Hozzuk létre a requirements.txt fájlt. Tartalma: django>=4.0.0,<4.1.0 djangorestframework pyyaml requests django-cors-headers Telepítsük a függőségeket: pip install -r requirements.txt Hozzuk létre két könyvtárat: emp/ |-backend/ |-py_client/ ===== Főrész ===== django-admin startproject emp . ===== Indítás ===== Lesz egy manage.py fájl, ami Python scripteket tartalmaz a projekt kezelésére. A szerver indítása: python manage.py runserver * http://localhost:8000/ Az alapvető adatbázis elkészítése: python manage.py migrate ===== Admin felület ===== Nézzük meg az adminisztrációs felületet: * http://127.0.0.1:8000/admin Létre kell hoznunk egy felhasználót. Parancssorban: python manage.py createsuperuser A kimenet ehhez hasonló lehet: python manage.py createsuperuser Username (leave blank to use 'andras'): admin Email address: admin@zold.lan Password: Password (again): This password is too short. It must contain at least 8 characters. Bypass password validation and create user anyway? [y/N]: y Superuser created successfully. Lépjünk be. ===== Modell létrehozása ===== Hozza létre a models.py fájlt: from django.db import models class Employee(models.Model): name = models.CharField(max_length=50) city = models.CharField(max_length=50) salary = models.FloatField() Regisztráljuk a settings.py fájlban a modellt: Vegyük fel a tömb végére az employees mint alkalmazást: # ... # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'emp', ] # ... Készítsünk migrációt: python3 manage.py makemigrations emp Migráljunk: python3 manage.py migrate ===== Modell az adminfelületre ===== Kössük be a modellt az admin felületre: from django.contrib import admin from .models import Employee admin.site.register(Employee) Indítsuk újra a szervert, majd nézzük meg az admin felületet, a böngészőlap újratöltésével. * http://127.0.0.1:8000/admin/ Vegyünk fel két új dolgozót. ==== A __str__ felülírása ==== from django.db import models class Employee(models.Model): name = models.CharField(max_length=50) city = models.CharField(max_length=50) salary = models.FloatField() def __str__(self): return self.name Nézzük meg újból az admin felületen a dolgozókat, az oldal frissítésével: * http://127.0.0.1:8000/admin/ ===== REST framework használata ===== ==== Szeriálizálás ==== Készítsünk egy az emp könyvtárban egy serializers.py fájlt, a következő tartalommal: from rest_framework import serializers from .models import Employee class EmployeeSerializer(serializers.ModelSerializer): class Meta: model = Employee fields = ['id', 'name', 'city', 'salary'] ==== Nézet ==== Készítsünk az emp könyvtárban egy views.py fájlt: from django.http import JsonResponse from .models import Employee from .serializers import EmployeeSerializer def read_employees(request): employees = Employee.objects.all() serializer = EmployeeSerializer(employees, many=True) return JsonResponse(serializer.data, safe=False) ==== Útvonal ==== from django.contrib import admin from django.urls import path from .views import read_employees urlpatterns = [ path('admin/', admin.site.urls), path('employees', read_employees), ] ===== Read és Create ===== from django.http import JsonResponse from .models import Employee from .serializers import EmployeeSerializer from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status @api_view(['GET', 'POST']) def read_create_employees(request): if request.method == 'GET': employees = Employee.objects.all() serializer = EmployeeSerializer(employees, many=True) return JsonResponse(serializer.data, safe=False) if request.method == 'POST': serializer = EmployeeSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) from django.contrib import admin from django.urls import path from .views import read_create_employees urlpatterns = [ path('admin/', admin.site.urls), path('employees', read_create_employees), ] ===== CRUD műveletek ===== from django.http import JsonResponse from .models import Employee from .serializers import EmployeeSerializer from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status @api_view(['GET', 'POST']) def read_create_employees(request): if request.method == 'GET': employees = Employee.objects.all() serializer = EmployeeSerializer(employees, many=True) return JsonResponse(serializer.data, safe=False) if request.method == 'POST': serializer = EmployeeSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) @api_view(['GET', 'PUT', 'DELETE']) def detail_employee(request, id): try: employee = Employee.objects.get(pk=id) except Employee.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET': serializer = EmployeeSerializer(employee) return Response(serializer.data) elif request.method == 'PUT': serializer = EmployeeSerializer(employee, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE': affected = employee.delete() return Response(affected,status=status.HTTP_200_OK) from django.contrib import admin from django.urls import path from emp import views urlpatterns = [ path('admin/', admin.site.urls), path('employees', views.read_create_employees), path('employees/', views.detail_employee), ]