文章目录
django restful api
1.restful特点
比起传统的结构,就多了对model序列化/反序列化Serializer的步骤
2.安装依赖
Django Rest Framework 3.11.0
Django-cors-headers 3.2.1
pip install djangorestframework
pip install django-cors-headers
3.相同的步骤
(1)修改settings.py
INSTALLED_APPS = [
'rest_framework',
'corsheaders',
...
]
(2)新建app
python manage.py startapp restdemo
(3)定义models.py
from django.db import models
# Create your models here.
class Books:
title = models.CharField(max_length=70, blank=False, default='')
description = models.CharField(max_length=200,blank=False, default='')
published = models.BooleanField(default=False)
(4)数据库迁移
python manage.py makemigrations
python manage.py migrate
4.为模型创建序列化类
定义serializers.py
from rest_framework import serializers
from .models import Books
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Books
fields = ('id', # id是自动生成的一个field,但是也要包含在字段中
'title',
'description',
'published')
5.配置cors-headers
修改settings.py
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
···
]
···
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
'http://localhost:8000',
)
6.视图
from django.shortcuts import render
from django.http.response import JsonResponse
from rest_framework.parsers import JSONParser
from rest_framework import status
from .models import Books
from .serializers import BookSerializer
from rest_framework.decorators import api_view
@api_view(['GET', 'POST', 'DELETE'])
def book_list(request):
if request.method == 'GET':
books = Books.objects.all()
title = request.query_params.get('title', None)
if title is not None:
books = books.filter(title__icontains=title)
tutorials_serializer = BookSerializer(books, many=True)
return JsonResponse(tutorials_serializer.data, safe=False)
# 'safe=False' for objects serialization
elif request.method == 'POST':
books_data = JSONParser().parse(request)
book_serializer = BookSerializer(data=books_data)
if book_serializer.is_valid():
book_serializer.save()
return JsonResponse(book_serializer.data, status=status.HTTP_201_CREATED)
return JsonResponse(book_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
count = Books.objects.all().delete()
return JsonResponse({'message': '{} Tutorials were deleted successfully!'.format(count[0])}, status=status.HTTP_204_NO_CONTENT)
@api_view(['GET', 'PUT', 'DELETE'])
def book_detail(request, pk):
print("pk: ",pk)
try:
books = Books.objects.get(id=pk)
except Books.DoesNotExist:
return JsonResponse({'message': 'The book does not exist'}, status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
book_serializer = BookSerializer(books)
return JsonResponse(book_serializer.data)
elif request.method == 'PUT':
book_data = JSONParser().parse(request)
book_serializer = BookSerializer(books, data=book_data)
if book_serializer.is_valid():
book_serializer.save()
return JsonResponse(book_serializer.data)
return JsonResponse(book_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
books.delete()
return JsonResponse({'message': 'Tutorial was deleted successfully!'}, status=status.HTTP_204_NO_CONTENT)
@api_view(['GET'])
def book_published(request):
books = Books.objects.filter(published=True)
if request.method == 'GET':
book_serializer = BookSerializer(books, many=True)
return JsonResponse(book_serializer.data, safe=False)
7.路由
主路由
urlpatterns = [
path('admin/', admin.site.urls),
path('restdemo/',include("restdemo.urls")),
]
from django.conf.urls import url
from .views import *
urlpatterns = [
url(r'^api/book$', book_list),
url(r'^api/book/(?P<pk>[0-9]+)$', book_detail),
url(r'^api/book/published$', book_published),
]
8.效果