将数据库的东西通过ORM的映射取出来,通过view文件,按照template文件排出的模板渲染成HTML。当用户请求相应的url时,返回相应的结果,这是Django
将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json,这是Django REST Framwork
DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能  
 
了解Django REST Framwork之前 先了解一些API规范(restful API)
面向资源编程 把网络上所有的东西都视为资源
http://127.0.0.1:8008/api/server
# 发送不同的请求执行不同的功能
- GET       # 获取数据
- POST      # 新增数据
- PUT       # 修改数据
- DELETE    # 删除数据
一个符合restful api规范的示例
@method_decorator()
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
@method_decorator(csrf_exempt, name=‘dispatch‘)
class ApiCase(View):
    def get(self, request, *args, **kwargs):
        data = ‘xxxx‘
        return JsonResponse(data)
    def post(self, request, *args, **kwargs):
        data = ‘xxxx‘
        return JsonResponse(data)
Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API
官网:https://www.django-rest-framework.org/
中文文档:https://q1mi.github.io/Django-REST-framework-documentation/
1、安装
pip install djangorestframework
2、注册 在settings中注册djangorestframework
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    # 注册drf
    ‘rest_framework‘,
]
3、使用示例
from django.views import View
from django.http import JsonResponse
# 不使用djangorestframework示例
class UserApi(View):
    def get(self, *args, **kwargs):
        userinfo = {‘username‘: "CatdeXin", ‘sex‘: ‘girl‘}
        return JsonResponse(userinfo)
# 使用djangorestframework示例
from rest_framework.views import APIView # 替换view继承
from rest_framework.response import Response # 替换Response
class DrfUserApi(APIView):
    def get(self, *args, **kwargs):
        userinfo = {‘username‘: "CatdeXin", ‘sex‘: ‘girl‘}
        return Response(userinfo)
 
 
他是一个django的组件(app)
他可以帮助我们快速开发遵循restful规范的接口
    - csrf
    - 页面渲染 (json放到页面了)
    - 序列化 (直接对QuerySet序列化)
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from drfapi import models
# 原生django序列化QuerySet
class DrfUserView(APIView):
    def get(self, request,*args,**kwargs):
        data =  models.AutlUser.objects.all().values()
        return Response(data)
# 使用drf序列化QuerySet
class AutlUserSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.AutlUser
        fields = ‘__all__‘
class DrfUserView(APIView):
    def get(self,request,*args,**kwargs):
        result = models.AutlUser.objects.all()
        ser = AutlUserSerializers(instance=result,many=True)
        return Response(ser.data)
csrf功能
url(r‘^user/‘,views.DrfUserView.as_view())
# Django源码View简写
class View:
    @classonlymethod
    def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            return self.dispatch(request, *args, **kwargs)
        return view
    
    def dispatch(self, request, *args, **kwargs):
        pass
# drf源码的APIView简写
class APIView(View):
    @classmethod
    def as_view(cls, **initkwargs):
        view = super().as_view(**initkwargs) # 执行父类的as_view
        view.cls = cls
        view.initkwargs = initkwargs
        return csrf_exempt(view) # 剔除csrf认证
# drf装饰的视图函数
from rest_framework.views import APIView
from rest_framework.response import Response
class DrfUserView(APIView):
    def get(self,request,*args,**kwargs):
        return Response({‘name‘: ‘nayue‘,‘age‘:18})
# url
urlpatterns = [
    url(r‘^user/$‘,views.DrfUserView.as_view()),
    url(r‘^user/(?P<pk>\d+)/$‘,views.DrfUserView.as_view()),
]
# 数据库
class AutlUser(models.Model):
    username = models.CharField(max_length=18,verbose_name=‘用户名‘)
    password = models.CharField(max_length=18,verbose_name=‘密码‘)
    age = models.IntegerField(verbose_name=‘年龄‘)
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from drfapi import models
class AutlUserSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.AutlUser
        fields = ‘__all__‘
class DrfUserView(APIView):
    # 获取数据
    def get(self, request, *args, **kwargs):
        pk = kwargs.get(‘pk‘)
        if not pk:
            result = models.AutlUser.objects.all()
            ser = AutlUserSerializers(instance=result, many=True)
        else:
            autluser_obj = models.AutlUser.objects.filter(id=pk).first()
            ser = AutlUserSerializers(instance=autluser_obj, many=False)
        return Response(ser.data)
    # 增加数据
    def post(self, request, *args, **kwargs):
        ser = AutlUserSerializers(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({"add": "200"})
        return Response(ser.errors)
    # 删除数据
    def delete(self, request, pk):
        models.AutlUser.objects.filter(id=pk).delete()
        return Response({"delete": "200"})
    def put(self, request, pk):
        ‘‘‘
        全部更新 得携带所有数据
        ‘‘‘
        autluser_obj = models.AutlUser.objects.filter(id=pk).first()
        if not autluser_obj:
            return Response({"put": "300"})
        # models.AutlUser.objects.filter(id=pk).update(**request.data)
        ser = AutlUserSerializers(instance=autluser_obj, data=request.data)
        if ser.is_valid(): 
            ser.save()
        return Response({"put": "200"})
    
    def patch(self, request, pk):
        ‘‘‘局部更新‘‘‘
        pass
url(r‘^new/user/$‘,views.NewDrfUserView.as_view({‘get‘:‘list‘,‘post‘:‘create‘})),
url(r‘^new/user/(?P<pk>\d+)/$‘,views.NewDrfUserView.as_view({‘get‘:‘retrieve‘,"delete":"destroy","put":"update","patch":"partial_update"})),
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from drfapi import models
class AutlUserSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.AutlUser
        fields = ‘__all__‘
class NewDrfUserView(ModelViewSet): # 内部封装了常用的增删改查功能
    queryset = models.AutlUser.objects.all()
    serializer_class = AutlUserSerializers
APIView: 没有提供增删改查功能,全部需要自己手动实现
ModelViewSet: 内部实现了增删改查功能,无需自己写原文:https://www.cnblogs.com/CatdeXin/p/14062573.html