[[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),
]