首页 > 其他 > 详细

Django Rest Framwork

时间:2020-11-30 19:14:43      阅读:24      评论:0      收藏:0      [点我收藏+]

Django和Django Rest Framwork

将数据库的东西通过ORM的映射取出来,通过view文件,按照template文件排出的模板渲染成HTML。当用户请求相应的url时,返回相应的结果,这是Django
将数据库的东西通过ORM的映射取出来,通过view和serializers文件绑定REST接口,当前端请求时,返回序列化好的json,这是Django REST Framwork

DRF是Django的超集,去掉了模板的部分,提供了一个REST的接口,同时也提供了满足该接口的代码工作流。同时,在REST的规范下,升级了权限和分页等功能,增加了限流和过滤搜索等功能 技术分享图片 技术分享图片

了解Django REST Framwork之前 先了解一些API规范(restful API)

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 REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API
官网:https://www.django-rest-framework.org/
中文文档:https://q1mi.github.io/Django-REST-framework-documentation/

二、 Django REST Framework安装和配置

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)

技术分享图片 技术分享图片

什么是drf

他是一个django的组件(app)
他可以帮助我们快速开发遵循restful规范的接口
    - csrf
    - 页面渲染 (json放到页面了)
    - 序列化 (直接对QuerySet序列化)

DRF序列化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})

使用Django REST Framework开发API接口

APIView

# 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

ModelViewSet

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

面试题

  • 你曾经在使用drf时,视图都继承过哪些类
    APIView: 没有提供增删改查功能,全部需要自己手动实现
    ModelViewSet: 内部实现了增删改查功能,无需自己写

Django Rest Framwork

原文:https://www.cnblogs.com/CatdeXin/p/14062573.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!