将数据库的东西通过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