• 初识drf


    初识drf

    1,什么是restful规范

    ```
    
    -是一套规则,用于程序之间进行数据交换的规定,
    -建议用https协议代替HTTP协议,加密数据,保证数据传输的安全
    
    -在url中体现API,就是在域名后面加上API标识,表名这是一个接口
    
    -在url中提现版本,在API后面加上版本信息,也可以把版本信息放在请求头中,
    -方便在项目开发的过程中进行功能的添加和优化时,更好的管理
    
    -restful规范又称为是面向资源的编程,视网络上的一切都是资源,对资源可以进行操 
    -作,所以资源一般用名词
    
    -如果要加入一些筛选条件,可以在添加在url中,方便对数据的过滤与筛选
    
    -根据请求方式method的不同,
    
    -返回给用户状态码,来判断请求的状态,以处理相应的请求,比如在状态码是以4开头
    -时,应该捕捉相应错误并返回错误信息,也可以自己自定义code状态码
    
    - 返回结果,针对不同的操作,服务器向用户返回不同得到结果
            '''
        -GET/collection:返回资源对象的列表
        -GET/collection/resource:返回单个资源对象
        -POST/collection:返回新生成的资源对象
        -PUT/collection/resource:返回完整的资源对象
        -PATCH/collection/resource:返回完整的资源对象
        -DELETE/collection/resource:返回一个空文档
            '''
    
    -操作异常时,要返回错误信息
    
    -对于下一个请求,要返回一些接口:
    
    
    -多应用在:前后端分离,APP开发,程序之间,与编程语言无关
    
    ```
    

    2,什么是drf

    ```
    drf是一个基于Django开发的组件,本质是一个Django的app
    drf可以帮我们快速的开发出一个遵循restful规范的程序
    ```
    

    drf是如何帮我们快速开发的,提供了哪些功能

    ```
    -视图:继承了APIview类,
    
    -版本处理
    
    -认证
    
    -权限
    
    -节流--频率限制
    
    
    -解析器:根据用户请求体格式不同进行数据解析,解析之后放在request.data中
    	在进行解析时候,drf会读取HTTP请求头content—type
    	如果content-type= x-www-urlencoded,那个drf会根据&符号分隔的形式去处理请求体:user=david&age=19
    	如果content-type=application/json,那么drf会根据json形式去处理请求体数据: {"user":david, "age":19}
    	
    -筛选器
    
    -分页
    
    -序列化:可以对Queryset进行序列化,也可以对用户提交的数据进行校验
    
    
    -渲染器:可以帮助我们把json数据渲染到页面上进行更好的展示
    
    
    可以根据Django的生命周期去思考问题
    ```
    

    序列化,展示特殊的数据

    ```
    depth:范围是1-10,展示所有外键关联的数据
    source:无序加括号,在源码内部会判断是否可执行,如果可执行,自动加括号【ForeignKey/choices】
    serializermethodfield:定义钩子方法
    
    ```
    

    drf简单应用

    安装

    ```
    pip3 install djangorestframework
    ```
    

    url

    ```
    from django.conf.urls import url
    from django.contrib import admin
    from API import views
    urlpatterns = [
    	url(r'^admin/', admin.site.urls),
    	url(r'^new/article/$', views.NewArticleView.as_view(),),
    	url(r'^new/article/(?P<pk>d+)/$', views.NewArticleView.as_view(),),
    ```
    

    字段 处理

    from rest_framework import serializers
    from API import models
    
    
    class ArticleSerializers(serializers.ModelSerializer):
    
    	# 特殊字段处理
    	category_name = serializers.CharField(source='category.name', required=False)
    	status_display = serializers.CharField(source='get_status_display', required=False)
    	tag = serializers.SerializerMethodField()
    
    	class Meta:
    		model = models.Article
    		fields = ['id', 'title', 'summary', 'content', 'category', 'category_name', 'tag', 'status', 'status_display', ]
    		# depth 方法
    		# depth = 2
    		
    		
    	#钩子方法
    	def get_tag(self, obj):
    		return [row for row in obj.tag.all().values("id", "label")]
    
    class NewArticleSerializers(serializers.ModelSerializer):
    	class Meta:
    		model = models.Article
    		fields = '__all__'
    

    视图业务处理:增删改查

    ```
    from rest_framework.response import Response
    from rest_framework.views import APIView
    from API import models, serializer
    ```
    
    ```
    class NewArticleView(APIView):
    
    	def get(self, request, *arge, **kwargs):
    		pk = kwargs.get("pk")
    		if not pk:
    			queryset = models.Article.objects.all()
    			ser = serializer.ArticleSerializers(instance=queryset, many=True)
    			return Response(ser.data)
    		queryset = models.Article.objects.filter(pk=pk).first()
    		ser = serializer.ArticleSerializers(instance=queryset, many=False)
    		return Response(ser.data)
    		pass
    
      def post(self, request, *arge, **kwargs):
    		ser = serializer.NewArticleSerializers(data=request.data)
    		if ser.is_valid():
    			ser.save()
    			return Response(ser.data)
    	    return Response(ser.errors)
    
    	    pass
    
      def put(self, request, *arge, **kwargs):
    			pk = kwargs.get("pk")
    			article_obj = models.Article.objects.filter(id=pk).first()
    			ser = serializer.NewArticleSerializers(data=request.data, instance=article_obj)
    			if ser.is_valid():
    				ser.save()
    				return Response(ser.data)
    			return Response(ser.errors)
    			pass
    
      def patch(self, request, *args, **kwargs):
    		pk = kwargs.get("pk")
    		article_obj = models.Article.objects.filter(pk=pk).first()
    		ser = serializer.NewArticleSerializers(instance=article_obj, data=request.data, partial=True)
    		if ser.is_valid():
    			ser.save()
    			return Response(ser.data)
    	    return Response(ser.errors)
    
      def delete(self, request, *arge, **kwargs):
    		pk = kwargs.get("pk")
    		models.Article.objects.filter(id=pk).delete()
    		return Response("删除成功")
    		pass
    
    ```
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    天气预报FLEX版本
    关于“ORA01000: 超出打开游标的最大数”
    WIN7(x64) IIS7.5 404.17错误:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。
    解决GDI+中“内存不足”问题
    Stack Overflow Exception
    清洁的Javascript
    设置SQL Server数据库中某些表为只读的多种方法
    程序员肿么了?为何总被认为是“屌丝”
    jquery datepicker 显示12个月份
    apache2.4配置虚拟主机随记
  • 原文地址:https://www.cnblogs.com/daviddd/p/11918361.html
Copyright © 2020-2023  润新知