(django)10 django restful api

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.效果

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值