Bootstrap

django restful API



项目地址

第一章:

  • 教程作者:Codingstrade
  • 教程地址:
https://www.CSDN.com/watch?v=z6WudaByH1k&t=120s
  • 代码仓库地址:
  • 所用到的框架和插件:
django
djangorestfui
  • 插件
django 
thunder client
sqlite view

第二章:
课程i地址:

https://www.bilibili.com/video/BV1z5411D7BQ?spm_id_from=333.788.videopod.episodes&vd_source=791e6deaa9c8a56b1f845a0bc1431b71&p=17

一、django环境安装以及初识restful

1.1 安装python 3.10的虚拟环境

  1. pipenv 安装指定版本的python
pipenv --python 3.10
  • 另外一种方法
python3.10 -m venv venv
  1. 运行虚拟环境
pipenv shell
  • 另一种方法
.\venv\Scripts\activate

在这里插入图片描述

  1. 安装django
pipenv install django
  • 安装所有的包requirements.txt
django>=4.0.0,<4.1.0
djangorestframework
pyyaml
requests
django-cors-headers
  • 安装
pip install -r requirements.txt

1.2 创建django工程文件

  1. 创建项目myapi是项目的名称
django-admin startproject myapi
  1. 查看文件
    在这里插入图片描述

  2. 运行django,默认localhost:8000

py manage.py runserver 

在这里插入图片描述

1.3 创建一个book app

  1. 控制台输入
py manage.py startapp book 
  1. 成功后,文件夹目录
    在这里插入图片描述

  2. 注册APP到django里
    在这里插入图片描述

1.4 序列化(Django JsonResponse)

将数据库内容 转为python的格式

1.4.1创建一个Models

  1. api/models.py里创建
from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=120)
    author = models.CharField(max_length=120)
    email = models.EmailField( default='')
  1. 注册Models
python manage.py makemigrations
  1. 创建models表
python manage.py miggrate
  1. res_api/admin.py注册我们的Models
admin.site.register(Post)

1.4.2 创建django的超级用户admin

  1. 创建超级用户
python manage.py createsuperuser
  1. 创建完成之后登录到
http://127.0.0.1:8000/admin/

在这里插入图片描述

  1. 成功之后在post里添加一个用户,用于我们将来的测试

1.4.3 添加serializers.py生成序列化器

  1. serializers.py文件里添加
from rest_framework import serializers
from .models import Post    

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'author', 'email']

1.5 FBV创建视图

  • 该模式下,不管是django原生,还是restful风格,都是函数式编程

1.5.1 在app里创建django 视图

  1. 创建res_api/views.py
from django.shortcuts import render
from .models import Post
from .serializers import PostSerializer
from django.http import JsonResponse
from rest_framework.parsers import JSONParser
from django.views.decorators.csrf import csrf_exempt #测试postman使用

# Create your views here.
@csrf_exempt
def PostsView(request):
    if request.method == 'GET':
        posts = Post.objects.all()
        serializer = PostSerializer(posts, many=True)
        return JsonResponse(serializer.data, safe=False)
    
    elif request.method == 'POST':
        post_data = JSONParser().parse(request)
        serializer = PostSerializer(data=post_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

1.5.2创建app的urls路由

1.创建res_api/urls.py:注意,这里的只是app的路由 ,并不是项目的路由,

from django.urls import path
from .views import PostsView

urlpatterns = [
    path('posts/', PostsView),
]

1.5.3 将app的路由注册到项目的路由

1.drf/urls.py里添加


from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('res_api.urls')),
]

1.5.4 整体流程梳理

  1. 在app里创建models,这个models一般对应的数据库里的数据res_api/models.py,使得python可以从数据库里取数
  2. 创建完之后,将models在app的admin下面注册res_api/admin.py,让django知道这个models模型
  3. 序列化Models,res_api/serializers.py,这里一般就是对表中的字段进行序列化
  4. 序列化完整之后需要构建view,res_api/views.py,这里的功能是告诉django如何取到models序列化好的数据,怎么取,以什么方式来取
  5. 注册app自己的路由res_api/views.py,告诉django 该app的models通过什么字段能访问
  6. 将app的路由注册到project里,这样浏览器就可以通过项目的地址+app里定义的字段访问到我们的models数据
  • 至此,有个bug就是post的提交方式是和get一样,我们需要将他改为posts的方式

1.5.5 创建一个可以通过传递id来get/post

  1. rest_aip/views.py添加一个新的函数,用来处理传递的id
@csrf_exempt    
def postuser_by_id(request, pk):
    try:
        post = PostUsers.objects.get(pk=pk)
    except PostUsers.DoesNotExist:
        return HttpResponse(status=404)
    
    if request.method == 'GET':
        serializer = PostSerializer(post)
        return JsonResponse(serializer.data)
    
    elif request.method == 'PUT':
        post_data = JSONParser().parse(request)
        serializer = PostSerializer(post, data=post_data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)
    
    elif request.method == 'DELETE':
        post.delete()
        return HttpResponse(status=204)
  1. 将我们的函数,注册到我们的app的urls里,res_api/urls.py
urlpatterns = [
    path('postusers/', PostUsersView), 
    path('detials/<int:pk>', postuser_by_id),  # using <int:pk> to get the id of the post
]
  1. 测试,成功

1.5.6 使用restful风格改写views

  1. 修改res_api/views.py
from django.shortcuts import render
from .models import PostUsers
from .serializers import PostSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

@api_view(['GET', 'POST'])
def PostUsersView(request):
    if request.method == 'GET':
        posts = PostUsers.objects.all() #quertSet
        serializer = PostSerializer(posts, many=True)
        return Response(serializer.data)
    
    elif request.method == 'POST':
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

@api_view(['GET', 'PUT', 'DELETE'])
def postuser_by_id(request,
;