Django REST framework

1. 什么是REST

  • REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
  • REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
  • REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
  • 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
  • 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

设计参考:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

2. 目前如何实现 REST API ?

按照规则,根据不同的请求方式做出不同的处理,并且返回内容以及相应状态码

3. 什么是 Django REST framework

Django REST framework是一个基于Django开发的app,用于快速搭建REST API。

安装:

1
pip3 install djangorestframework

a. 快速使用

  1. INSTALLED_APPS = [
  2. ...
  3. 'rest_framework',
  4. ]

1.注册APP

  1. from rest_framework import routers
  2. from . import views
  3.  
  4. router = routers.DefaultRouter()
  5. router.register(r'users', views.UserInfoViewSet)
  6.  
  7. urlpatterns = [
  8. url(r'^', include(router.urls)),
  9. ]

2.注册路由

  1. from rest_framework import viewsets
  2. from . import models
  3. from . import serializers
  4.  
  5. # ########### 1. 基本处理方式 ###########
  6.  
  7. class UserInfoViewSet(viewsets.ModelViewSet):
  8. """
  9. API endpoint that allows users to be viewed or edited.
  10. """
  11. queryset = models.UserInfo.objects.all().order_by('-id')
  12. serializer_class = serializers.UserInfoSerializer

3.编写ViewSet,视图函数

  1. from rest_framework import serializers
  2. from . import models
  3.  
  4. class UserInfoSerializer(serializers.HyperlinkedModelSerializer):
  5. class Meta:
  6. model = models.UserInfo
  7. # fields = ('id', 'username', 'pwd','ug') # fields = '__all__'
  8. exclude = ('ug',)
  9. depth = 1 # 0<=depth<=10

4.编写serializers,form验证以及数据库操作

PS:最终访问路径

1
2
3
4
5
[GET]          http://127.0.0.1:8000/api/users/
[POST]         http://127.0.0.1:8000/api/users/
[GET]          http://127.0.0.1:8000/api/users/7/
[PUT]          http://127.0.0.1:8000/api/users/7/
[DELETE]       http://127.0.0.1:8000/api/users/7/

b. 基于CBV

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^users/$', views.UserList.as_view()),
  7. url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
  8. ]

1.URL

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.parsers import JSONParser
  5. from . import models
  6. from . import serializers
  7.  
  8. class UserList(APIView):
  9. def get(self, request, *args, **kwargs):
  10. user_list = models.UserInfo.objects.all()
  11. serializer = serializers.MySerializer(instance=user_list, many=True)
  12. return Response(serializer.data)
  13.  
  14. def post(self, request, *args, **kwargs):
  15. data = JSONParser().parse(request)
  16. serializer = serializers.MySerializer(data=data)
  17. if serializer.is_valid():
  18. # print(serializer.data)
  19. # print(serializer.errors)
  20. # print(serializer.validated_data)
  21. # 如果有instance,则执行update方法;否则,执行create
  22. serializer.save()
  23. return Response(serializer.data, status=201)
  24. return Response(serializer.errors, status=400)
  25.  
  26. class UserDetail(APIView):
  27. def get(self, request, *args, **kwargs):
  28. obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
  29. serializer = serializers.MySerializer(obj)
  30. return Response(serializer.data)
  31.  
  32. def delete(self, request, *args, **kwargs):
  33. obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
  34. obj.delete()
  35. return Response(status=204)
  36.  
  37. def put(self, request, *args, **kwargs):
  38. data = JSONParser().parse(request)
  39. obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
  40. serializer = serializers.MySerializer(obj, data=data)
  41. if serializer.is_valid():
  42. serializer.save()
  43. return Response(serializer.data)
  44. return Response(serializer.errors, status=400)

2.编写视图函数

  1. from rest_framework import serializers
  2. from rest_framework.exceptions import ValidationError
  3. from . import models
  4.  
  5. class MySerializer(serializers.Serializer):
  6. id = serializers.IntegerField(read_only=True)
  7. username = serializers.CharField(required=False, allow_blank=True, max_length=100)
  8. pwd = serializers.CharField()
  9.  
  10. def validate_username(self, value):
  11. if value == '中国':
  12. raise ValidationError('用户名中存在敏感字符')
  13. return value
  14.  
  15. def validate_pwd(self, value):
  16. print(value)
  17. return value
  18.  
  19. def validate(self, attrs):
  20. print(attrs)
  21. return attrs
  22.  
  23. def create(self, validated_data):
  24. """
  25. 当执行save方法时,自动调用。instance未传值
  26. :param validated_data:
  27. :return:
  28. """
  29. print(validated_data)
  30. return models.UserInfo.objects.create(**validated_data)
  31.  
  32. def update(self, instance, validated_data):
  33. """
  34. 当执行save方法时,自动调用。instance传值
  35. :param instance:
  36. :param validated_data:
  37. :return:
  38. """
  39. instance.username = validated_data.get('username', instance.username)
  40. instance.save()
  41. return instance

3.编写serializers

c. 基于CBV

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^users/$', views.user_list),
  7. url(r'^users/(?P<pk>[0-9]+)/$', views.user_detail),
  8. ]

1.URL

  1. from django.http import JsonResponse,HttpResponse
  2. from rest_framework.response import Response
  3. from rest_framework.parsers import JSONParser
  4. from rest_framework.decorators import api_view
  5. from .serializers import MySerializer
  6. from . import models
  7.  
  8. @api_view(['GET',"POST"])
  9. def user_list(request):
  10. """
  11. List all code snippets, or create a new snippet.
  12. """
  13. if request.method == 'GET':
  14. user_list = models.UserInfo.objects.all()
  15. serializer = MySerializer(user_list,many=True)
  16. return Response(serializer.data)
  17.  
  18. elif request.method == 'POST':
  19. data = JSONParser().parse(request)
  20. serializer = MySerializer(data=data)
  21. if serializer.is_valid():
  22. print(serializer.data)
  23. print(serializer.errors)
  24. print(serializer.validated_data)
  25. # 如果有instance,则执行update方法;否则,执行create
  26. serializer.save()
  27. return Response(serializer.data, status=201)
  28. return Response(serializer.errors, status=400)
  29.  
  30. @api_view(['GET',"POST","PUT"])
  31. def user_detail(request, pk):
  32. """
  33. Retrieve, update or delete a code snippet.
  34. """
  35.  
  36. obj = models.UserInfo.objects.filter(pk=pk).first()
  37. if not obj:
  38. return HttpResponse(status=404)
  39.  
  40. if request.method == 'GET':
  41. serializer = MySerializer(obj)
  42. # return JsonResponse(serializer.data,json_dumps_params={'ensure_ascii':False},content_type='application/json;charset=utf-8')
  43. return Response(serializer.data)
  44.  
  45. elif request.method == 'PUT':
  46. data = JSONParser().parse(request)
  47. serializer = MySerializer(obj, data=data)
  48. if serializer.is_valid():
  49. serializer.save()
  50. return Response(serializer.data)
  51. return Response(serializer.errors, status=400)
  52.  
  53. elif request.method == 'DELETE':
  54. obj.delete()
  55. return Response(status=204)

2.视图函数

  1. from rest_framework import serializers
  2. from rest_framework.exceptions import ValidationError
  3. from . import models
  4.  
  5. class MySerializer(serializers.Serializer):
  6. id = serializers.IntegerField(read_only=True)
  7. username = serializers.CharField(required=False, allow_blank=True, max_length=100)
  8. pwd = serializers.CharField()
  9.  
  10. def validate_username(self, value):
  11. if value == '中国':
  12. raise ValidationError('用户名中存在敏感字符')
  13. return value
  14.  
  15. def validate_pwd(self, value):
  16. print(value)
  17. return value
  18.  
  19. def validate(self, attrs):
  20. print(attrs)
  21. return attrs
  22.  
  23. def create(self, validated_data):
  24. """
  25. 当执行save方法时,自动调用。instance未传值
  26. :param validated_data:
  27. :return:
  28. """
  29. print(validated_data)
  30. return models.UserInfo.objects.create(**validated_data)
  31.  
  32. def update(self, instance, validated_data):
  33. """
  34. 当执行save方法时,自动调用。instance传值
  35. :param instance:
  36. :param validated_data:
  37. :return:
  38. """
  39. instance.username = validated_data.get('username', instance.username)
  40. instance.save()
  41. return instance

3.编写serializers

d. 权限控制

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PERMISSION_CLASSES': [
  3. 'permissi.MyPermission',
  4. ]
  5. }

1.settings配置文件

  1. class MyPermission(object):
  2. """
  3. A base class from which all permission classes should inherit.
  4. """
  5.  
  6. def has_permission(self, request, view):
  7. """
  8. Return `True` if permission is granted, `False` otherwise.
  9. """
  10.  
  11. return True
  12.  
  13. def has_object_permission(self, request, view, obj):
  14. return True

2.权限控制

  1. - 全局配置
  2. Highcharts.setOptions({
  3. global: {
  4. useUTC: false
  5. }
  6. });
  7.  
  8. - 主配置
  9. var chart = new Highcharts.Chart('id1', {
  10. title: {
  11. text: '不同城市的月平均气温',
  12. x: 0
  13. },
  14. subtitle: {
  15. text: '数据来源: WorldClimate.com',
  16. x: 0
  17. },
  18. chart: {
  19. events: {
  20. load: function (e) {
  21. // 图标加载时,执行的函数
  22. }
  23. }
  24. },
  25. credits: {
  26. enable: true,
  27. position: {
  28. align: 'right',
  29. verticalAlign: 'bottom'
  30. },
  31. text: '老男孩',
  32. href: 'http://www.oldboyedu.com'
  33. },
  34. legend: {
  35. layout: 'vertical',
  36. align: 'right',
  37. verticalAlign: 'middle',
  38. borderWidth: 1
  39. },
  40.  
  41. xAxis: {
  42. // categories: ['1.1', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
  43. type: 'datetime',
  44. labels: {
  45. formatter: function () {
  46. return Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.value);
  47. },
  48. rotation: 30
  49. }
  50.  
  51. },
  52. yAxis: {
  53. title: {
  54. text: '数值'
  55. }
  56. },
  57. tooltip: {
  58. valueSuffix: '个',
  59. xDateFormat: "%Y-%m-%d %H:%M:%S",
  60. pointFormatter: function (e) {
  61. var tpl = '<span style="color:' + this.series.color + '">●</span> ' + this.series.name + ': <b>' + this.y + '</b><br/>';
  62. return tpl;
  63. },
  64. valueDecimals: 1,
  65. useHTML: true
  66. },
  67. plotOptions: {
  68. series: {
  69. cursor: 'pointer',
  70. events: {
  71. click: function (event) {
  72. // 点击某个指定点时,执行的事件
  73. console.log(this.name, event.point.x, event.point.y);
  74. }
  75. }
  76. }
  77. },
  78. series: [{
  79. name: '东京',
  80. // data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
  81. data: [
  82. [1501689804077.358, 8.0],
  83. [1501689814177.358, 6.9],
  84. [1501689824277.358, 16.9],
  85. [1501689834377.358, 11.9]
  86. ]
  87. },
  88. {
  89. name: '洛杉矶',
  90. // data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
  91. data: [
  92. [1501689804077.358, 18.0],
  93. [1501689814177.358, 16.9],
  94. [1501689824277.358, 26.9],
  95. [1501689834377.358, 9.9]
  96. ]
  97. }]
  98. });
  99.  
  100. // chart.addSeries({name:'北京',data: [216.4, 194.1, 95.6, 54.4, 29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5]});
  101. // 参数:数值;是否重绘; isShift; 是否动画
  102. // chart.series[0].addPoint(18);
  103. // chart.series[0].addPoint([12]);
  104. // chart.series[0].addPoint([v.x, v.y]);
  105. // 参数:是否重绘
  106. // chart.series[0].remove(false);
  107. // 更新饼图
  108. // $('#id1').highcharts().series[0].data[0].update({x: 0, y: 100})

临时放一下

Python REST的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  4. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  5. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  6. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  7. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  8. Apache执行Python脚本

    由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...

  9. python开发编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...

  10. 关于解决python线上问题的几种有效技术

    工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...

随机推荐

  1. Ubuntu上将终端安装到右键上

    Ubuntu上将终端安装到右键上 author:headsen chen    2017-10-12  10:26:12 个人原创,允许转载,请注明作者和出处,否则依法追究法律责任 chen@chen ...

  2. Linux中断子系统:级联中断控制器驱动

    Linux中断子系统 Linux中断子系统是个很大的话题,如下面的思维导图所示,包含硬件.驱动.中断上半部.中断下半部等等.本文着眼于中断控制器(PIC),特别是级联中断控制器驱动部分,对驱动的设计和 ...

  3. http,socks4,socks5代理的区别

    HTTP代理 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80.8080.3128等: SOCKS代理 SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心 ...

  4. C++标准库vector类型的使用和操作总结

    vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...

  5. java基础笔记(2)----流程控制

    java流程控制结构包括顺序结构,分支结构,循环结构. 顺序结构: 程序从上到下依次执行,中间没有任何判断和跳转. 代码如下: package com.lvsling.test; public cla ...

  6. JavaScript(第十四天)【面向对象和原型】

    学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建 ...

  7. Build to win

    UPDATE:看到周筠老师的评论里的链接,那版式真的非常舒服.我想想模仿模仿他的布局来看看,虽然感觉做的也不是太好.另外对博客内容稍作修改. 一.获得小黄衫的感受 很幸运能够获得"领骑衫&q ...

  8. 201621123050 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...

  9. Beta预备

    团队名称:稳住!我们能赢 Beta预备: 讨论组长是否重选的议题和结论 项目组长可以说是一个团队的灵魂和核心.一个好的领导者可以激发团队成员的工作热情,提高开发效率,保质保量的完成工作.虽然在Alph ...

  10. 位图(BitMap)

    位图 引入:2.给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. [腾讯] 思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间. 分 ...