用APIView和VIew编写5个接口

用APIView和VIew编写5个接口

【一】使用View格式提交form-data数据

【一】创建表

  • models.py
class Book(models.Model):
    name = models.CharField(max_length=50)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    class Meta:
        db_table = 'book2'

【二】后端

from urllib.parse import unquote

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View

from normal.models import Book


# Create your views here.

class BookView(View):
    def get(self, request):
        obj_list = Book.objects.all()
        l = []
        for i in obj_list:
            l.append({"name": i.name, "price": i.price})
        return JsonResponse({'code': 100, 'msg': "查询成功", 'results': l})

    # 增加
    def post(self, request):
        # urlencode和form-data格式
        data = request.POST
        Book.objects.create(name=data.get('name'), price=data.get('price'))
        return JsonResponse({'code': 100, 'msg': "新增成功", })


class BookDetailView(View):
    def get(self, request, pk):
        obj = Book.objects.filter(pk=int(pk)).first()
        return JsonResponse({'code': 100, 'msg': "查询成功", 'results': {'name': obj.name, 'price': obj.price}})

    # 修改
    def put(self, request, pk):
        # request.body bytes格式转换成字符串
        data = request.body.decode('utf-8')
        print(data)
        book_list=data.split('&')  # 拿到一个列表
        dic = {}
        for item in book_list:
            # 转码只给value转
            dic[item.split('=')[0]] = unquote(item.split('=')[1])
        print(dic)
        Book.objects.filter(pk=int(pk)).update(**dic)
        return JsonResponse({'code': 100, 'msg': "修改成功"})

    def delete(self, request, pk):
        obj = Book.objects.filter(pk=int(pk)).delete()
        return JsonResponse({'code': 100, 'msg': "删除成功"})

【三】配置路由

from django.urls import path, include
from normal.views import *

urlpatterns = [
    path('books/', BookView.as_view()),
    path('books/<int:pk>', BookDetailView.as_view())
]

【四】使用Apifox测试

【1】新增数据

image-20240411162016311

【二】查询所有

image-20240411162502246

【三】查询单个

image-20240411163037136

【四】删除

image-20240411163155099

【五】修改

  • put请求提交数据 django框架导致request.POST里面取不出值

【二】使用View格式提交json-data数据

import json

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View

from book.models import Book


# Create your views here.

class TaskView(View):
    def get(self, request):
        book_list = Book.objects.all()
        l = []
        for book in book_list:
            l.append({"name": book.name, "price": book.price})

        return JsonResponse({"code": 100, "message": '查询成功', "results": l})

    def post(self, request):
        data = json.loads(request.body)
        book = Book.objects.create(**data)
        return JsonResponse({"code": 100, "message": '添加成功',
                             "results": {"name": book.name, "price": book.price}})


class TaskDetailView(View):
    # 查询单个
    def get(self, request, id):
        book = Book.objects.get(id=int(id))
        return JsonResponse({"code": 100, "message": '查询单个成功',
                             "results": {"name": book.name, "price": book.price}})

    # 修改
    def put(self, request, id):
        data = json.loads(request.body)
        print(data)
        book_update = Book.objects.filter(id=int(id)).update(**data)
        return JsonResponse({"code": 100, "message": '修改数据成功'}
                            )

    # 删除
    def delete(self, request, id):
        Book.objects.filter(id=int(id)).delete()
        return JsonResponse({"code": 100, "message": '删除数据成功'})

【三】使用API格式提交form-data数据

  • 前端无论什么编码格式,传过来的数据都会被解析到request.data中,是个字典
from urllib.parse import unquote

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from rest_framework.views import APIView

from normal.models import Book

class BookView(APIView):
    def get(self, request):
        obj_list = Book.objects.all()
        l = []
        for i in obj_list:
            l.append({"name": i.name, "price": i.price})
        return JsonResponse({'code': 100, 'msg': "查询成功", 'results': l})
    # 增加
    def post(self, request):
        # urlencode和form-data格式

        Book.objects.create(name=request.data.get('name'), price=request.data.get('price'))
        return JsonResponse({'code': 100, 'msg': "新增成功", })


class BookDetailView(APIView):
    def get(self, request, pk):
        obj = Book.objects.filter(pk=int(pk)).first()
        return JsonResponse({'code': 100, 'msg': "查询成功", 'results': {'name': obj.name, 'price': obj.price}})

    # 修改
    def put(self, request, pk):
        Book.objects.filter(pk=pk).update(name=request.data.get('name'), price=request.data.get('price'))
        return JsonResponse({'code': 100, 'msg': "修改成功"})

    def delete(self, request, pk):
        obj = Book.objects.filter(pk=int(pk)).delete()
        return JsonResponse({'code': 100, 'msg': "删除成功"})

【四】使用API格式提交JSON数据

# 新增数据,有个坑
''' APIView帮咱们---》看POST中有没有数据,如果有,直接赋值给data,如果没有,他去body中转成字典再给data
         json格式:
            POST没有东西 QueryDict
            data有数据  dict
        urlencoded或form-data
            POST有东西 QueryDict
            data有数据  QueryDict
        '''
from urllib.parse import unquote

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from rest_framework.views import APIView

from normal.models import Book

class BookView(APIView):
    def get(self, request):
        obj_list = Book.objects.all()
        l = []
        for i in obj_list:
            l.append({"name": i.name, "price": i.price})
        return JsonResponse({'code': 100, 'msg': "查询成功", 'results': l})
    # 增加
    def post(self, request):
        # urlencode和form-data格式

        Book.objects.create(**request.data)
        return JsonResponse({'code': 100, 'msg': "新增成功", })


class BookDetailView(APIView):
    def get(self, request, pk):
        obj = Book.objects.filter(pk=int(pk)).first()
        return JsonResponse({'code': 100, 'msg': "查询成功", 'results': {'name': obj.name, 'price': obj.price}})

    # 修改
    def put(self, request, pk):
        Book.objects.filter(pk=pk).update(**request.data)
        return JsonResponse({'code': 100, 'msg': "修改成功"})

    def delete(self, request, pk):
        obj = Book.objects.filter(pk=int(pk)).delete()
        return JsonResponse({'code': 100, 'msg': "删除成功"})
  • 执行流程总结:

    • 只要继承了APIView,就没有csrf限制了
    • 只要继承了APIView,request就是新的request了,它有data
    • 在执行跟请求方式同名的方法之前,执行了三大认证:认证,频率,权限
    • 只要在三大认证或者视图类的方法中出了一场,都会被捕获,统一处理
posted @ 2024-04-17 22:03  -半城烟雨  阅读(0)  评论(0编辑  收藏  举报