Tartalomjegyzék
Django REST API keretrendszer
- Szerző: Sallai András
- Copyright © 2024, Sallai András
- Licenc: CC BY-SA 4.0
- Web: https://szit.hu
Bevezetés
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:
- requirements.txt
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
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:
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:
- emp/models.py
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:
- settings.py
# ... # 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:
- emp/admin.py
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.
Vegyünk fel két új dolgozót.
A __str__ felülírása
- emp/models.py
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:
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:
- emp/serializers.py
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:
- emp/views.py
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
- emp/urls.py
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
- emp/views.py
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)
- emp/urls.py
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
- emp/views.py
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)
- emp/urls.py
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/<int:id>', views.detail_employee), ]