接口

  1. #接口:url连接,通过向链接发送不同的类型请求与参数得到相应的响应数据
  2. #1.在视图书写处理请求的 视图函数
  3. #2.在路由层为视图函数配置 url链接=>产生接口
  4. #3.前台通过ajax,爬虫,工具等对接口发送请求,提交相应的参数获得对应的响应数据
  5. # https://api.map.baidu.com/place/v2/search
  6. '''
  7. ak: 6E823f587c95f0148c19993539b99295
  8. region: 上海
  9. query: 肯德基
  10. output: json
  11. '''

RESTful规范

  1. #定义接口的规范
  2. # REST:表征性状态转移(Representational State Transfer)
  3. #RESTful规范:web数据请求接口设计规范
  4.  
  5. #学习的目的:
  6. #1.如何设计url链接地址
  7. #2.如何设计响应的数据格式
  8.  
  9. '''
  10. 1)通常使用https请求
  11. 2)域名:有api关键字出现
  12. -- https://api.baidu.com (可能涉及跨越问题)
  13. -- https://baidu.com/api
  14. 3)版本:不同版本需要标注
  15. -- https://example.com/api/v1 | -- https://example.com/api/1
  16. -- https://example.com/api/v2 | -- https://example.com/api/2
  17. 4)资源:请求的目标数据称之为资源,资源一般都用名词复数表示
  18. -- https://example.com/api/v1/books (之前不规范的案例: /get_books/)
  19. 5)操作方式:不从请求链接体现操作方式,从请求方式上决定操作方式
  20. -- get:https://example.com/api/v1/books 获取所有
  21. -- post:https://example.com/api/v1/books 新增一本
  22. -- put:https://example.com/api/v1/book/1 更新id=1的一本
  23. -- patch:https://example.com/api/v1/book/1 更新id=1的一本
  24. -- delete:https://example.com/api/v1/book/1 删除id=1的一本
  25. 6)资源过滤:通过接口传递参数来过滤资源
  26. -- https://example.com/api/v1/books?limit=10 限制10条
  27.  
  28. 7)状态码:返回数据要标准状态码,通过在数据中 {"status": 0}
  29. -- SUCCESS("0", "查询成功")
  30. -- NODATA("1xx", "非正确,无数据,显示基本信息")
  31. -- FEAILED("2xx", "查询失败")
  32. 8)错误信息:请求失败需要标注错误信息 {"msg": "请求参数不合法"}
  33. 9)操作结果:请求操作成功的返回结果 {"results": []}
  34. -- get:返回资源列表 | 返回单一资源
  35. -- post:返回单一新增资源
  36. -- put:返回更新的资源
  37. -- patch:返回更新的资源
  38. -- delete:返回空文档
  39. 10)子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
  40. '''

restful规范面试总结

  1. '''
  2. 1.url链接设计:采用https方式,有api关键字,有版本需要明确版本,请求链接用名词来表示资源,具体的操作方式采用请求方式来确定
  3. 2.url响应数据设计:需要明确状态码、错误信息、成功结果,子资源一般用子资源的接口来标注
  4. '''

原生简易书写TESTful规范接口

  1. #路由层
  2. from app import views
  3.  
  4. urlpatterns = [
  5. url(r'^books/', views.books),
  6. ]
  7. #视图层
  8. from django.http import JsonResponse
  9. book_list = [
  10. {
  11. 'id': 1,
  12. 'name': '三国演义'
  13. },
  14. {
  15. 'id': 2,
  16. 'name': '水浒传'
  17. }
  18. ]
  19.  
  20. def books(request):
  21. if request.method == 'GET':
  22. ak = request.GET.get('ak', None)
  23. if not ak:
  24. return JsonResponse({
  25. 'status': 101,
  26. 'message': '没有明确ak',
  27. }, json_dumps_params={'ensure_ascii': False})
  28. return JsonResponse({
  29. 'status': 0,
  30. 'message': 'ok',
  31. 'results': book_list
  32. }, json_dumps_params={'ensure_ascii': False})
  33. if request.method == 'POST':
  34. # return HttpResponse('post back')
  35. name = request.POST.get('name')
  36. id = len(book_list) + 1
  37. book = {'id': id, 'name': name}
  38. book_list.append(book)
  39. return JsonResponse({
  40. 'status': 0,
  41. 'message': 'ok',
  42. 'results': book
  43. }, json_dumps_params={'ensure_ascii': False})

CBV流程

  1. '''
  2. 1)as_view()
  3. --User.as_view()本质拿到view(request,*args,**kwargs)函数对象
  4. 2)view(request,*args,**kwargs)
  5. --return self.dispatch(request,*args,**kwargs)来完成请求的反射
  6. 3)dispatch(request,*args,**kwargs)
  7. --完成具体的请求响应的分发
  8. #注:重写dispatch事可以再分发响应时,加入其他逻辑限制
  9. '''
  1. #路由层
  2. urlpatterns = [
  3. url(r'users/', views.Users.as_view())
  4. ]
  5.  
  6. #视图层
  7. from django.views import View
  8.  
  9. class Users(View):
  10. def dispatch(self, request, *args, **kwargs):
  11. pass # 可以对请求加以限制
  12. result = super(Users, self).dispatch(request, *args, **kwargs)
  13. pass # 可以对请求再近一步处理
  14. return result
  15.  
  16. def get(self, request, *args, **kwargs):
  17. return JsonResponse({
  18. 'message': 'get message'
  19. })
  20.  
  21. def post(self, request, *args, **kwargs):
  22. return JsonResponse({
  23. 'message': 'post message'
  24. })

drf安装

  1. # drf:djangorestfraework => pip3 install djangorestfraework
  2.  
  3. from rest_framework.views import APIView
  4. from rest_framework.request import Request
  5. from rest_framework.response import Response

drf的安装步骤

  1. # 1)安装drf:pip3 install djangorestfraework
  2. # 2)settings.py 注册app:INSTALLED_APPS = [..., 'rest_framework']
  3. # 3)基于cbv完成满足RESTful规范的接口

drf具体使用

  1. #路由层
  2. from app import views
  3.  
  4. urlpatterns = [
  5. url(r'teachers/', views.Teachers.as_view())
  6. ]
  7. #视图层
  8. from rest_framework.views import APIView
  9. from rest_framework.response import Response
  10.  
  11. class Teachers(APIView):
  12. def get(self, request, *args, **kwargs):
  13. # return JsonResponse({
  14. # 'status': 2,
  15. # 'message': '请求成功'
  16. # }, json_dumps_params={'ensure_ascii': False})
  17. salary = request.GET.get('salary')
  18. print(salary)
  19. return Response({
  20. 'status': 2,
  21. 'message': 'get请求成功'
  22. })
  23. # 前台发送数据的方式:formdata|urlencoded|json
  24. #drf的request都对其二次封装解析到request.data中
  25. def post(self, request, *args, **kwargs):
  26. print(request)
  27. print(request._request)
  28. salary = request.data.get('salary')
  29. print(salary)
  30. return Response({
  31. 'status': 2,
  32. 'message': 'post请求成功'
  33. })

drf的请求源码分析

  1. # as_view()
  2. # 核心走了父类as_view
  3. view = super(APIView, cls).as_view(**initkwargs)
  4. # 返回的是局部禁用csrf认证的view视图函数
  5. return csrf_exempt(view)
  6.  
  7. # dispatch(self, request, *args, **kwargs)
  8. # 二次封装request对象
  9. request = self.initialize_request(request, *args, **kwargs)
  10. # 自定义request规则
  11. self.initial(request, *args, **kwargs)
  12.  
  13. # initialize_request(self, request, *args, **kwargs)
  14. # 原生request封装在request._request
  15.  
  16. # initial(self, request, *args, **kwargs)
  17. # 认证
  18. self.perform_authentication(request)
  19. # 权限
  20. self.check_permissions(request)
  21. # 频率
  22. self.check_throttles(request)
  23.  
  24. # 在drf的request.py的模块中,对django的request进行二次封装
  25. def __getattr__(self, attr):
  26. try:
  27. return getattr(self._request, attr)
  28. except AttributeError:
  29. return self.__getattribute__(attr)
  30. # 完成对django的request完全兼容

drf序列化

  1. #models.py
  2. class Students(models.Model):
  3. name = models.CharField(max_length=32)
  4. age = models.IntegerField()
  5. gender = models.CharField(max_length=8)
  6.  
  7. def __str__(self):
  8. return self.name
  9. #自定义序列化类:为具体的类提供序列化
  10. #my_serializers.py
  11. from rest_framework import serializers
  12. class StudentSerializers(serializers.Serializer)
  13. #1.如果没有source引入models的字段名,序列化字段名必须同models的字段名
  14. #2.如果有source引入models的字段名,序列化字段名必须不同于models的字段名,目的是对外隐藏数据库的字段名
  15. id = serializers.IntegerField()
  16. student_name = serializers.CharField(source='name')
  17. age = serializers.IntegerField()
  18. gender = serializers.CharField()
  19. # views.py
  20. from rest_framework.views import APIView
  21. from rest_framework.response import Response
  22. from app import models
  23. from app.my_serializers import StudentSerializers
  24.  
  25. class Students(APIView):
  26. def get(self, request, *args, **kwargs):
  27. student_list = models.Students.objects.all()
  28. # 需要序列化多个对象,需要明确many=True
  29. student_list = StudentSerializers(student_list, many=True)
  30. return Response({
  31. 'status': 0,
  32. 'message': 'ok',
  33. 'results': student_list.data
  34. })
  35.  
  36. def post(self, request, *args, **kwargs):
  37. name = request.data.get('name')
  38. age = request.data.get('age')
  39. gender = request.data.get('gender')
  40. student = models.Students.objects.create(name=name, age=age, gender=gender)
  41. student = StudentSerializers(student)
  42. return Response({
  43. 'status': 0,
  44. 'message': 'ok',
  45. 'results': student.data
  46. })
  47. #urls.py
  48. urlpatterns = [
  49. url(r'students/', views.Students.as_view()),
  50. ]

接口、RESTful规范、DRF的更多相关文章

  1. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  2. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  3. DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用

    CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()),  --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...

  4. DRF之restful规范、Postman接口测试

    一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...

  5. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  6. RESTful规范与django编写restful接口

    一.什么是RESTful规范 ①REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” ②REST从资 ...

  7. 01 drf源码剖析之restful规范

    01 restful规范 目录 01 restful规范 1. 什么是restful规范 2.restful规范详细 1. 什么是restful规范 restful是一套规则,是程序间进行数据传输的一 ...

  8. 微服务接口设计(RESTful规范)

    微服务的接口设计(RESTful规范) 基本知识 URI:在RESTful架构中,每个URI代表一种资源 URI规范: 不用大写 用中杠-,不用下划线_ 路径中不能有动词,只能有名词 名词表示资源集合 ...

  9. DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...

随机推荐

  1. JavaScript 空间坐标

    基础知识 首先参考画布分为视口(窗口)与文档的含义 网页很多都是多屏,所以文档尺寸一般大于视口尺寸 视口尺寸不包括浏览器工具条.菜单.标签.状态栏等 当打开控制台后,视口尺寸相应变小 文档像posit ...

  2. linux 安装sftp

    1.定义sftp的数据目录 mkdir -p /data/sftp 2.将目录归到root用户,否则无法chroot chown root. -R /data/sftp/或者chown root:ro ...

  3. javaString详解

    String基础 Java String 类 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 创建字符串最简单 ...

  4. Scala中的函数高级使用

    1.偏函数 1.基本介绍 在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择 将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范 ...

  5. C++ Templates (1.6 但是为什么不...? But, Should't We ...?)

    返回完整目录 目录 1.6 但是为什么不...? But, Should't We ...? 1.6.1 传值还是传引用? Pass by Value or by Reference? 1.6.2 为 ...

  6. SparkStreaming架构

    SparkStreaming是一个对实时数据流进行高通量.容错处理的流式处理系统,可以对多种数据源(如Kdfka.Flume.Twitter.Zero和TCP 套接字)进行类似Map.Reduce和J ...

  7. 数据隐私和GDPR

    近十几年来,随着大数据给各行各业带来的变化,以及数据时代不断强调的数据就是燃料,谁掌握数据谁就掌握未来的各种论调,大家纷纷开始收集数据,挖掘数据,转卖数据.而个人,作为数据真正拥有者的利益早就在商业利 ...

  8. Magento 2 instantiate object by Factory Objects

    magento2的Factory Objects是用来实例化non-injectable classes,目前还不知道什么叫non-injectable classes. 可以用它来实例化Helper ...

  9. NeoVIM安装使用

    1.What's Neovim Bram Moolenaar 在写 Vim 时还是 90 年代初,至今已经 20 多年 过去了.其中,不仅包含了大量的遗留代码,而且程序的维护.Bug 的 修复.以及新 ...

  10. Unity3d UGUI插件之TSTableView

    TSTableView是Tacticsoft工作室开发的一款适用于UGUI的列表(Table)插件,设计灵感来源于iOS/Mac的UITableView,提供高复用.高性能的列表,其主要特点是: 采用 ...