为了账号安全,请及时绑定邮箱和手机立即绑定

Django REST framework前后端分离框架实践

  • 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
    查看全部
首页上一页123下一页尾页

举报

0/150
提交
取消
课程须知
1、熟练Python语法 2、有Django项目基础
老师告诉你能学到什么?
1、深入理解RESTful API 2、Django REST framework组件介绍 3、DRF中的序列化Serializers 4、Django的views开发API接口 5、DRF的多种视图api_view/APIView… 6、Django的URLs与DRF的Routers 7、使用DRF的API接口文档 8、API测试神器Postman 9、DRF的认证和权限

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!