-
http://github.com/liaogx/drf-tutorial
查看全部 -
course的views.py
from django.http.response import HttpResponse from rest_framework.decorators import api_view from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Course from .serializers import CourseSerializer """一、函数式编程""" @api_view(["GET","POST"]) def course_list(request): """ 获取所有课程信息或新增一个课程 """ 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": 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": # 这里的instance的只是查出来的course,而data则是request传来的值 s = CourseSerializer(instance=course, data=request.data) if s.is_valid(): s.save() return Response(s.data,status=status.HTTP_200_OK) elif request.method == "DELETE": course.delete() return Response(status=status.HTTP_204_NO_CONTENT) """类试图 Class Based Views""" class CourseList(APIView): def get(self, request): queryset = Course.objects.all() s = CourseSerializer(instance=queryset, many=True) # instance = xxx 是查询集 return Response(s.data, status=status.HTTP_200_OK) def post(self,request): s = CourseSerializer(data=request.data) # data是传递过来的数据,return前要先调用is_valid()方法验证数据 if s.is_valid(): s.save(teacher=self.request.user) return Response(data=s.data, status=status.HTTP_201_CREATED) return Response(s.errors, status.HTTP_400_BAD_REQUEST) class CourseDetail(APIView): @staticmethod def get_object(pk): try: return Course.objects.get(pk=pk) except Course.DoesNotExist: # 返回none return def get(self,request,pk): obj = self.get_object(pk) if not obj: return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND) s = CourseSerializer(instance=obj) return Response(s.data, status=status.HTTP_200_OK) def put(self,request,pk): obj = self.get_object(pk) if not obj: return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND) s = CourseSerializer(instance=obj, data=request.data) if s.is_valid(): s.save() return Response(data=s.data, status=status.HTTP_201_CREATED) return Response(data=s.data,status=status.HTTP_400_BAD_REQUEST) def delete(self,request,pk): obj = self.get_object(pk) if not obj: return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND) obj.delete() return Response(status=status.HTTP_204_NO_CONTENT)
添加 course下的路由:
from django.urls import path, include
from course import views
urlpatterns = [ # Function Based View path("fbv/list/", views.course_list, name="fbv-list"), path("fbv/detail/<int:pk>/", views.course_detail, name="fbv-detail"), # Class Based View path("cbv/list/", views.CourseList.as_view(), name="cbv-list"), path("cbv/detail/<int:pk>/", views.CourseDetail.as_view(), name="cbv-detail") ]
工程下的urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('api-auth/', include('rest_framework.urls')), # DRF的登录退出 path('admin/', admin.site.urls), path('course/', include('course.urls')) ]
查看全部 -
这里调用gcbv/list/会报错:
views.py文件内容:
from django.http.response import HttpResponse from rest_framework.decorators import api_view from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Course from .serializers import CourseSerializer from rest_framework import generics """一、函数式编程""" @api_view(["GET","POST"]) def course_list(request): """ 获取所有课程信息或新增一个课程 """ 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": 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": # 这里的instance的只是查出来的course,而data则是request传来的值 s = CourseSerializer(instance=course, data=request.data) if s.is_valid(): s.save() return Response(s.data,status=status.HTTP_200_OK) elif request.method == "DELETE": course.delete() return Response(status=status.HTTP_204_NO_CONTENT) """类试图 Class Based Views""" class CourseList(APIView): def get(self, request): queryset = Course.objects.all() s = CourseSerializer(instance=queryset, many=True) # instance = xxx 是查询集 return Response(s.data, status=status.HTTP_200_OK) def post(self,request): s = CourseSerializer(data=request.data) # data是传递过来的数据,return前要先调用is_valid()方法验证数据 if s.is_valid(): s.save(teacher=self.request.user) return Response(data=s.data, status=status.HTTP_201_CREATED) return Response(s.errors, status.HTTP_400_BAD_REQUEST) class CourseDetail(APIView): @staticmethod def get_object(pk): try: return Course.objects.get(pk=pk) except Course.DoesNotExist: # 返回none return def get(self,request,pk): obj = self.get_object(pk) if not obj: return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND) s = CourseSerializer(instance=obj) return Response(s.data, status=status.HTTP_200_OK) def put(self,request,pk): obj = self.get_object(pk) if not obj: return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND) s = CourseSerializer(instance=obj, data=request.data) if s.is_valid(): s.save() return Response(data=s.data, status=status.HTTP_201_CREATED) return Response(data=s.data,status=status.HTTP_400_BAD_REQUEST) def delete(self,request,pk): obj = self.get_object(pk) if not obj: return Response(data={"msg": "没有此课程信息"}, status=status.HTTP_404_NOT_FOUND) obj.delete() return Response(status=status.HTTP_204_NO_CONTENT) """三、通用类试图 Generic Class Based View""" class GCourseList(generics.ListCreateAPIView): queryset = Course.objects.all() serializer_class = CourseSerializer def perform_create(self, serializer): serializer.save(teacher=self.request.user) class GCourseDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Course.objects.all() serializer_class = CourseSerializer
查看全部 -
实例代码: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里面去注释掉了。
查看全部 -
使用DRF开发RESTful API接口
查看全部 -
20 个模块?
查看全部 -
BrowsableAPIRenderer
https://www.django-rest-framework.org/topics/browsable-api/#the-browsable-api
https://www.imooc.com/video/22363
查看全部 -
$ python manage.py createsuperuser
查看全部 -
$ python manage.py makemigrations $ python manage.py migrate
查看全部 -
os.pardir ❓
查看全部 -
os.pathdir ❓
查看全部 -
views 返回 HTML,全栈开发, PHP / JAVA
查看全部 -
$ python3 manage.py runserver 0.0.0.0:8080
查看全部
举报
0/150
提交
取消