本节内容

Django原生中是function base view 和class view2种。之前ins项目有用到。本节也有代码复习演示
实例代码:course工程下views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Course
from .serializers import CourseSerializer
"""一、函数式编程 Function Baseed View"""
@api_view(["GET","POST"])
def course_list(request):
"""
获取所有课程信息或新增一个课程
:param request:
:return:
"""
if request.method == "GET":
s = CourseSerializer(instance=Course.objects.all(), many=True)
return Response(data=s.data, status=status.HTTP_200_OK)
elif request.method == "POST":
# partial=True 允许传部分字段过来不是全部,但是model要求必须传的,这个参数设置了也没用
# 只适用于非必填字段
s = CourseSerializer(data=request.data, partial=True)
if s.is_valid():
s.save(teacher=request.user)
return Response(data=s.data,status=status.HTTP_201_CREATED)
return Response(s.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(["GET","PUT","DELETE"])
def course_detail(request, pk):
"""
获取删除或更新一个课程
"""
try:
course = Course.objects.get(pk=pk)
except Course.DoesNotExist:
return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND)
else:
if request.method == "GET":
s = CourseSerializer(instance=course)
return Response(data=s.data, status=status.HTTP_200_OK)
elif request.method == "PUT":
s = CourseSerializer(instance=course,data=request.data)
if s.is_valid():
s.save()
return Response(s.data, status=status.HTTP_200_CREATED)
elif request.method == "DELETE":
course.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
回顾Django中自带的view试图编写:
CourseApp下的 views.py文件中:
from django.http.response import HttpResponse
from django.shortcuts import render
import json
from django.http import JsonResponse
from django.views.decorators import csrf
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View
# Create your views here.
course_dict = {
'name': '课程名称',
'introduction': '课程介绍',
'price': 0.11
}
# 使用Django原生的 FBV 编写API接口
@csrf_exempt
def course_list(request):
if request.method == 'GET':
return JsonResponse(course_dict)
if request.method == 'POST':
course = json.loads(request.body.decode('utf-8'))
return HttpResponse(json.dumps(course), content_type='application/json')
# Django CBV 编写API接口
@method_decorator(csrf_exempt, name='dispath') # 方法装饰器,只针对于post方法,name的值不是post,因为这是根据请求原理决定的。先到dispath,之后才到post方法
class CourseList(View):
def get(self, request):
return JsonResponse(course_dict)
def post(self, request):
course = json.loads(request.body.decode('utf-8'))
return HttpResponse(json.dumps(course), content_type='application/json')
可以使用装饰器,取消csrf,就不用setting里面去注释掉了。