1.什么是编程?

  1. 数据结构和算法的结合

2.什么是REST?

  1. 同一个功能会产生五花八门的url(把查看单条记录和查看多条记录都看成是一个功能),而且响应回去的数据也没有同一的格式规范,这就造成了前后端交互上的困难。
  2. 由此产生了REST. REST下的URL唯一代表资源, http请求方式区分用户行为, 如下是符合REST规范的URL设计示例:
  3.   url的设计规范:
  4.     GET 127.0.0.1:9001/books/ # 获取所有数据
  5.     GET: 127.0.0.1:9001/books/{id} # 获取单条数据
  6.     POST 127.0.0.1:9001/books/ # 增加数据
  7.     DELETE: 127.0.0.1:9001/books/{id} # 删除数据
  8.     PUT: 127.0.0.1:9001/books/{id} # 修改数据
  9.   数据响应规范:
  10.     GET 127.0.0.1:9001/books/ # 返回[{}, {}, {}]
  11.     GET: 127.0.0.1:9001/books/{id} # 返回单条数据{}
  12.     POST 127.0.0.1:9001/books/ # 返回添加成功的数据{}
  13.     DELETE: 127.0.0.1:9001/books/{id} # 返回空""
  14.     PUT: 127.0.0.1:9001/books/{id} # 返回{} ,更新后完整的一条记录,注意并非一个字段
  15.   错误处理:
  16. { "error": "error_message" }
    REST是一种软件架构设计风格, 不是标准, 也不是技术实现, 它只是提供了一组设计原则和约束条件, 是目前最流行的API设计规范, 用于web数据接口的设计.

参考链接:
  http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
  http://www.scienjus.com/my-restful-api-best-practices/

那么, 我们接下来要学习的Django REST Framework与REST有什么关系呢?
事实上, DRF(Django REST Framework)是一套基于Django开发的, 帮助我们更好的设计符合REST规范的web应用的一个Django App, 所以, 从本质上来讲, DRF是一个Django的App.

什么是restful规范?
  是一套规范,规则,用于程序之间进行数据交换的约定。
  他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,restful规范写一个接口,根据http协议的请求方式分为不同的操作,比如post,get,put,patch,delete.
  除此之外restful规范还规定了:
    1.数据之间一般通过json来传递
    2.-url 一般用名词 http://www.baidu.com/article/(面向资源变成,网上所有的数据都是资源)
    3.根据请求方式的不同去做不同的操作:get,post,put,delete,patch
    4.根据筛选条件可以在url后面添加参数:http://www.baidu.com/article?page=1&categroy=1
      注意筛选条件都放在url中进行传递

  扩展:适用于前后端分离的项目,app开发,程序之间(与编程语言无关)

3.Django REST FrameWork(DRF)

  1. 3.1 什么是drf?
      
    帮助我们在django的基础上快速的搭建遵循restful规范接口的程序,本质上是djangoapp

    3.2
    为什么要使用drf
  2. 本质上讲,drf就是django的一个app。有个这样一个app我们可以快速的基于restful规范开发接口。实际上没有DRF,我们也能设计出符合Restful规范的接口。
  3.   from django.shortcuts import HttpResponse
  4.   from django.views import View
  5.   from * import models
  6.   import json
  7.   class CourseView(View):
  8.    def get(self, request):
  9.    course_list = list()
  10.  
  11.    for course in models.Course.objects.all():
  12.   course = {
  13.    'course_name': course.course_name,
  14.    'description': course.description,
  15.    }
  16.    course_list.append(course)
  17.    return HttpResponse(json.dumps(course_list, ensure_ascii=False))
  18.  
  19.  在上面的代码中, 我们获取所有的课程数据, 并且根据REST规范, 将所有资源通过列表返回给用户, 可见, 就算没有DRF, 我们也能够设计出符合RESTful规范的接口, 甚至是整个App应用. 但是, 如果所有的接口都自定义, 难免会出现重复代码, 为了提高工作效率, 我们建议使用优秀的工具, DRF就是这样一个优秀的工具, 另外, 它不仅能够帮助我们快速的设计出符合RESTful规范的接口, 还提供了诸如 认证 , 权限 等等其他强大的功能. 
  20.  
  21. 3.3 什么时候使用DRF?
      drf一般应用在前后端分离项目和移动端项目中使用。
  22.  
  23. 3.4 drf如何帮助我们快速开发?(drf提供了那些功能?)
      - url:执行响应的视图函数
      - 视图:继承了apiview等视图函数(apiview继承了djangoview)
      - 解析器:根据用户请求方式的不同,进行数据解析,解析之后放在request.data
          在进行解析的时候,drf会读取http请求头,content-type
          如果是content-type:x-www-urlencoded,那么drf会根据&符号进行分割的形式去处理
          如果是content-type:applications/json,那么drf会根据json形式去处理请求体
      - 序列化:可以对象和对象列表(queryset)进行序列化,也可以对用户提交的数据进行校验
      - 渲染器:可以帮助我们把json数据血染到页面上进行友好的展示(内部会对请求设备进行判断,会根据请求设备的不同,渲染成不同的页面)
      - 分页器:在url里面里面体现出来,里面有page参数

4.Drf的使用

  1. # 安装django
  2. pip install django
  3.  
  4. # 安装djangorestframework
  5. pip install djangorestframework
  6.  
  7. 安装完成以后, 我们就可以开始使用DRF框架来实现我们的web应用了. 该框架包含以下知识点:
  8.   - APIView: 继承APIview(在内部继承了djangoView)
  9.   - 解析器组件: 解析请求体中的数据,将其变成我们想要的数据格式,request.data
  10.   - 序列化组件: 提供对象和对象列表(quesyset)进行序列化操作以及表单验证的功能
  11.   - 视图组件
  12.   - 认证组件
  13.   - 权限组件
  14.   - 频率控制组件
  15.   - 分页组件
  16.   - 相应器组件
  17.   - url控制

5.drf基本使用

  1. 初识drf:(只有在前后端分离或者是app接口的项目时,才会有用)
  2. 1.安装drfpip3 install djangorestframework(就是djangoapp)
  3. 2.注册app rest_framework
  4. INSTALLED_APPS = [
  5. 'rest_framework'
  6. ]
  7. 3.写路由
  8. from django.conf.urls import url
  9. from django.contrib import admin
  10. from api import views
  11. urlpatterns = [
  12. url(r'^drf/info/', views.DrfInfoView.as_view()),
  13. ]
  14. 4.导入:from rest_framework.views import APIView
  15. from rest_framework.response import Response
  16.  
  17. restful规范:
  18. 1.根据url 请求方式的不同,提供不同的功能
  19. get:获取数据
  20. post:增加数据
  21. put:全部更新
  22. patch:局部更新
  23. delete:删除
  24. 2.不管请求和响应都是json格式的字符串,注意:django里面没有request.data
  25. 3.drf里面不使用request.POST,而是使用request.bodyrequets.data,因为drf使用json格式来进行传递数据,如果前后端使用格式不同,会导致后端的request.POST接收不到数据
  26. 4.restful规范里面请求单条的数据时必须使用关键字参数(id,pk等,后端url设计 url(r'^drf/Category/(?P<pk>\d+)/$',views.DrfCategoryView.as_view()),)

6.drf实例

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from api import views
  4. urlpatterns = [
  5. url(r'^drf/category/$', views.DrfCategoryView.as_view()),
  6. url(r'^drf/category/(?P<pk>\d+)/$', views.DrfCategoryView.as_view()),
  7. ]
  8.  
  9. from api import models
  10. from django.forms.models import model_to_dict 将获取到的quesyset类型转成字典类型,也可以使用json来做
  11. class DrfCategoryView(APIView):
  12. def get(self,request,*args,**kwargs):
  13. """获取所有文章分类/单个文章分类"""
  14. pk = kwargs.get('pk')
  15. if not pk:
  16. queryset = models.Category.objects.all().values('id','name')
  17. data_list = list(queryset)
  18. return Response(data_list)
  19. else:
  20. category_object = models.Category.objects.filter(id=pk).first()
  21. data = model_to_dict(category_object)
  22. return Response(data)
  23.  
  24. def post(self,request,*args,**kwargs):
  25. """增加一条分类信息"""
  26. models.Category.objects.create(**request.data)
  27. return Response('成功')
  28.  
  29. def delete(self,request,*args,**kwargs):
  30. """删除"""
  31. pk = kwargs.get('pk')
  32. models.Category.objects.filter(id=pk).delete()
  33. return Response('删除成功')
  34.  
  35. def put(self,request,*args,**kwargs):
  36. """更新"""
  37. pk = kwargs.get('pk')
  38. models.Category.objects.filter(id=pk).update(**request.data)
  39. return Response('更新成功')

7.drf的解析器

  1. drfserializers帮助我们提供了
  2. 1. 表单数据校验
  3. 2. 序列化
  4.  
  5. 1.如何serializers获取外键中的中文,而不是id
  6.   方法一:通过制定source的方式获取内容
  7.   class ArticleSerializer(serializers.ModelSerializer):
  8.     name = serializers.CharFiled(source='category.name')
  9.     class Meta:
  10.       model = models.Article
  11.       fields = ['id','title','status']
  12.  
  13.   方法二:通过serializers.SerializerMethodField()方法
  14.   class ArticleSerializer(serializers.ModelsSerializer):
  15.     name = serializers.SerializerMethodField() #相当于钩子方法
  16.     class Meta:
  17.       model = models.Article
  18.       fields = ['id','title','status']
  19.  
  20.     def get_name(self,obj): #
  1.   方法三:depth = 1。其实depth默认为0,就是只取自己表里面的数据
      意思是跨一层表进行数据的读取,最大为10
  2. 2.如何通过serializers获取choises中的中文
  3.   例如models里面的status状态字段,获取发布和删除
  4.   status_choise = (
  5.     (1,'发布'),
  6.     (2,'删除')
  7.   )
  8.   status = models.IntegerField(verbose_name='状态',choices=status_choise,default=1)
  9.   class ArticleSerializer(serializers.ModelSerializer,):
  10.   status = serializers.CharField(source='get_status_display',required=False)
         #status = serializers.SerializerMehhodField()
  11.   class Meta:
  12.   model = models.Article
  13.   fields = ['id','title','summary','content','category','name','status']
         #def_status(self.obj):
            return obj.get_status_display()
      
  1.   get_status_display:使用get_字段名__display()获取对应字符串,但是在drf里面不需要添加(),因为drf源码会去判断当前字段是什么类型的,如果是方法,会自动加上扩号,如果是对象.xxx,则直接取出内容
      required=False:告诉后台在执行的时候该字段不是必须被填写的,是自己增加的字段,只是用作展示,但是在实际增加数据的时候不想要该字段。

8.drf解析器实例

  1. class ArticleSerializer(serializers.ModelSerializer,):
  2. name = serializers.CharField(source='category.name',required=False)
  3. # name = serializers.SerializerMethodField() #相当于钩子方法,下面必须写get_name方法
  4. status = serializers.CharField(source='get_status_display',required=False)
  5. # required=False:告诉后台在执行的时候该字段不是必须被填写的,是自己增加的字段,只是用作展示,但是在实际增加数据的时候不想要该字段。
  6. class Meta:
  7. model = models.Article
  8. # fields = "__all__"
  9. fields = ['id','title','summary','content','category','name','status']
  10.  
  11. # def get_name(self,obj):
  12. # return obj.category.name
  13.  
  14. class ArticleView(APIView):
  15. def get(self,request,*args,**kwargs):
  16. pk = kwargs.get('pk')
  17. if not pk :
  18. object = models.Article.objects.all()
  19. ser = ArticleSerializer(instance=object,many=True)
  20. return Response(ser.data)
  21. else:
  22. object = models.Article.objects.filter(id=pk).first()
  23. ser = ArticleSerializer(instance=object,many=False,)
  24. return Response(ser.data)
  25.  
  26. def delete(self,request,*args,**kwargs):
  27. # 删除
  28. pk = kwargs.get('pk')
  29. models.Article.objects.filter(id=pk).delete()
  30. return Response('删除成功')
  31.  
  32. def put(self,request,*args,**kwargs):
  33. # 全部更新
  34. pk = kwargs.get('pk')
  35. object1 = models.Article.objects.filter(id=pk).first()
  36. ser = ArticleSerializer(instance=object1,data=request.data)
  37. if ser.is_valid():
  38. ser.save()
  39. return Response(ser.data)
  40. return Response(ser.errors)
  41.  
  42. def patch(self,request,*args,**kwargs):
  43. # 局部更新
  44. # partial=True 允许字段为空
  45. pk = kwargs.get('pk')
  46. object = models.Article.objects.filter(id=pk).first()
  47. ser = ArticleSerializer(instance=object,data=request.data,partial=True)
  48. if ser.is_valid():
  49. ser.save()
  50. return Response(ser.data)
  51. return Response(ser.errors)
  52.  
  53. def post(self,request,*args,**kwargs):
  54. ser = ArticleSerializer(data=request.data)
  55. if ser.is_valid():
  56. ser.save()
  57. return Response('增加成功!')
  58. return Response(ser.errors)

9.drf默认机制

  1. 1.drf会判断请求源是什么,会返回不同的请求格式
  2. 如果是postman的话,会直接返回json
  3. 如果是浏览器,会返回好看的渲染页面
  4. 2. 如果不返回好看的页面在浏览器加上?format=json

other

  1. 1.django查找模板的顺序
  2. 1.1 优先在根目录下查找templates
  3. 1.2 根据app的注册顺序去每个apptemplates目录中去找
  4.  
  5. 2.url路由里面最后添加终止符,防止其他路由匹配截胡
    3.drf的配置都写在settings里面

pass

drf基础的更多相关文章

  1. DRF基础操作流程

    Django Rest_Framework 核心思想: 缩减编写api接口的代码 -->DRF Django REST framework是一个建立在Django基础之上的Web 应用开发框架, ...

  2. django drf 基础学习3

    一 简述 这里来谈下一些基本原理 二 汇总 1 restful规范 1 根据method不同做不同的操作          request.method='          get(获取) 返回完整 ...

  3. django drf 基础学习2

    DRF基本程序调用一 models初步编写  1 编写model.py    from django.db import models 导入    class dbinfo(models.Model) ...

  4. django drf 基础学习1

    一 环境配置    python3.5+ django2.0 pymysql二 安装   /usr/bin/python3 -m pip install django   /usr/bin/pytho ...

  5. drf基础知识01

    drf框架 """ 接口: 接口规范: drf生命周期: 序列化组件: 三大认证组件: 过滤.筛选.排序.分页组件: 请求.响应.解析.异常模块: jwt: " ...

  6. django drf 基础学习5

    一 简介: 用户登录的验证 二 验证机制:    1 session session需要在服务端存储能够通过session_id而获取的信息,每次请求到达服务端时,需要根据session_id这个ke ...

  7. django drf 基础学习4

    0  简介:介绍ModelViewSet基本使用规则1 views引用以及初始化   from rest_framework.viewsets import ModelViewSet     clas ...

  8. DRF框架(八)——drf-jwt手动签发与校验、搜索过滤组件、排序过滤组件、基础分页组件

    自定义drf-jwt手动签发和校验 签发token源码入口 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面 获取提交的username ...

  9. drf之框架基础

    (一)drf基础 全称:django-rest framework 接口:什么是接口.restful接口规范(协议) CBV(基于FBV的基础上形成).CBV生命周期源码----基于restful规范 ...

随机推荐

  1. [Linux] 029 脚本安装包

    1. 脚本安装包 脚本安装包并不是独立的软件包类型,常见安装的是源码包 是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装 非常类似于 Windows 下软件的安装方式 ...

  2. spring-第六篇之创建bean的3种方式

    1.创建bean的方式有3种: 1>使用构造器创建bean,即设值注入.构造注入本质都是使用bean的构造器创建bean的. 2>使用静态工厂方法创建bean. 3>调用实例工厂方法 ...

  3. Struts2之处理结果集

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...

  4. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  5. MySQL查询时报错Illegal mix of collations

    开发十年,就只剩下这套架构体系了! >>>   1.具体场景 两张表分别为: CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AU ...

  6. 【问题解决方案】Mathtype中丢失Mplugin.dll的问题

    网络上搜索到的答案: Mathtype中丢失Mplugin.dll,把Mplugin.dll文件放到Mathtype安装根目录下就好了. 然而试过以后仍然不行 事实是: 如果下载的mathtype安装 ...

  7. easyui datagrid数据网格

    EasyUI是一组基于jQuery的UI插件集合,它的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.它的许多控件让我们不必写很复杂的javascript,从而极大地提高了开发效率. ...

  8. CAS无锁策略

    并发编程时,对于共享资源的使用需要确保绝对的安全性.除了利用锁机制之外,还有一种无锁的概念.所谓无锁,就是假定在并发情况下,对于共享资源的访问没有冲突,线程可以一直不停的运行,无需阻塞,如果产生冲突, ...

  9. linux典型应用对系统资源使用的特点

  10. SVN中trunk,branches,tags的使用明细--项目代码的管理

    SVN在项目开发过程中有两种模式: 第一种:Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局svn://proj/|+ ...