Python REST
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. 快速使用
- INSTALLED_APPS = [
- ...
- 'rest_framework',
- ]
1.注册APP
- from rest_framework import routers
- from . import views
- router = routers.DefaultRouter()
- router.register(r'users', views.UserInfoViewSet)
- urlpatterns = [
- url(r'^', include(router.urls)),
- ]
2.注册路由
- from rest_framework import viewsets
- from . import models
- from . import serializers
- # ########### 1. 基本处理方式 ###########
- class UserInfoViewSet(viewsets.ModelViewSet):
- """
- API endpoint that allows users to be viewed or edited.
- """
- queryset = models.UserInfo.objects.all().order_by('-id')
- serializer_class = serializers.UserInfoSerializer
3.编写ViewSet,视图函数
- from rest_framework import serializers
- from . import models
- class UserInfoSerializer(serializers.HyperlinkedModelSerializer):
- class Meta:
- model = models.UserInfo
- # fields = ('id', 'username', 'pwd','ug') # fields = '__all__'
- exclude = ('ug',)
- 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
- from django.conf.urls import url,include
- from django.contrib import admin
- from . import views
- urlpatterns = [
- url(r'^users/$', views.UserList.as_view()),
- url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
- ]
1.URL
- from rest_framework.views import APIView
- from rest_framework.response import Response
- from rest_framework.request import Request
- from rest_framework.parsers import JSONParser
- from . import models
- from . import serializers
- class UserList(APIView):
- def get(self, request, *args, **kwargs):
- user_list = models.UserInfo.objects.all()
- serializer = serializers.MySerializer(instance=user_list, many=True)
- return Response(serializer.data)
- def post(self, request, *args, **kwargs):
- data = JSONParser().parse(request)
- serializer = serializers.MySerializer(data=data)
- if serializer.is_valid():
- # print(serializer.data)
- # print(serializer.errors)
- # print(serializer.validated_data)
- # 如果有instance,则执行update方法;否则,执行create
- serializer.save()
- return Response(serializer.data, status=201)
- return Response(serializer.errors, status=400)
- class UserDetail(APIView):
- def get(self, request, *args, **kwargs):
- obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
- serializer = serializers.MySerializer(obj)
- return Response(serializer.data)
- def delete(self, request, *args, **kwargs):
- obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
- obj.delete()
- return Response(status=204)
- def put(self, request, *args, **kwargs):
- data = JSONParser().parse(request)
- obj = models.UserInfo.objects.filter(pk=kwargs.get('pk')).first()
- serializer = serializers.MySerializer(obj, data=data)
- if serializer.is_valid():
- serializer.save()
- return Response(serializer.data)
- return Response(serializer.errors, status=400)
2.编写视图函数
- from rest_framework import serializers
- from rest_framework.exceptions import ValidationError
- from . import models
- class MySerializer(serializers.Serializer):
- id = serializers.IntegerField(read_only=True)
- username = serializers.CharField(required=False, allow_blank=True, max_length=100)
- pwd = serializers.CharField()
- def validate_username(self, value):
- if value == '中国':
- raise ValidationError('用户名中存在敏感字符')
- return value
- def validate_pwd(self, value):
- print(value)
- return value
- def validate(self, attrs):
- print(attrs)
- return attrs
- def create(self, validated_data):
- """
- 当执行save方法时,自动调用。instance未传值
- :param validated_data:
- :return:
- """
- print(validated_data)
- return models.UserInfo.objects.create(**validated_data)
- def update(self, instance, validated_data):
- """
- 当执行save方法时,自动调用。instance传值
- :param instance:
- :param validated_data:
- :return:
- """
- instance.username = validated_data.get('username', instance.username)
- instance.save()
- return instance
3.编写serializers
c. 基于CBV
- from django.conf.urls import url,include
- from django.contrib import admin
- from . import views
- urlpatterns = [
- url(r'^users/$', views.user_list),
- url(r'^users/(?P<pk>[0-9]+)/$', views.user_detail),
- ]
1.URL
- from django.http import JsonResponse,HttpResponse
- from rest_framework.response import Response
- from rest_framework.parsers import JSONParser
- from rest_framework.decorators import api_view
- from .serializers import MySerializer
- from . import models
- @api_view(['GET',"POST"])
- def user_list(request):
- """
- List all code snippets, or create a new snippet.
- """
- if request.method == 'GET':
- user_list = models.UserInfo.objects.all()
- serializer = MySerializer(user_list,many=True)
- return Response(serializer.data)
- elif request.method == 'POST':
- data = JSONParser().parse(request)
- serializer = MySerializer(data=data)
- if serializer.is_valid():
- print(serializer.data)
- print(serializer.errors)
- print(serializer.validated_data)
- # 如果有instance,则执行update方法;否则,执行create
- serializer.save()
- return Response(serializer.data, status=201)
- return Response(serializer.errors, status=400)
- @api_view(['GET',"POST","PUT"])
- def user_detail(request, pk):
- """
- Retrieve, update or delete a code snippet.
- """
- obj = models.UserInfo.objects.filter(pk=pk).first()
- if not obj:
- return HttpResponse(status=404)
- if request.method == 'GET':
- serializer = MySerializer(obj)
- # return JsonResponse(serializer.data,json_dumps_params={'ensure_ascii':False},content_type='application/json;charset=utf-8')
- return Response(serializer.data)
- elif request.method == 'PUT':
- data = JSONParser().parse(request)
- serializer = MySerializer(obj, data=data)
- if serializer.is_valid():
- serializer.save()
- return Response(serializer.data)
- return Response(serializer.errors, status=400)
- elif request.method == 'DELETE':
- obj.delete()
- return Response(status=204)
2.视图函数
- from rest_framework import serializers
- from rest_framework.exceptions import ValidationError
- from . import models
- class MySerializer(serializers.Serializer):
- id = serializers.IntegerField(read_only=True)
- username = serializers.CharField(required=False, allow_blank=True, max_length=100)
- pwd = serializers.CharField()
- def validate_username(self, value):
- if value == '中国':
- raise ValidationError('用户名中存在敏感字符')
- return value
- def validate_pwd(self, value):
- print(value)
- return value
- def validate(self, attrs):
- print(attrs)
- return attrs
- def create(self, validated_data):
- """
- 当执行save方法时,自动调用。instance未传值
- :param validated_data:
- :return:
- """
- print(validated_data)
- return models.UserInfo.objects.create(**validated_data)
- def update(self, instance, validated_data):
- """
- 当执行save方法时,自动调用。instance传值
- :param instance:
- :param validated_data:
- :return:
- """
- instance.username = validated_data.get('username', instance.username)
- instance.save()
- return instance
3.编写serializers
d. 权限控制
- REST_FRAMEWORK = {
- 'DEFAULT_PERMISSION_CLASSES': [
- 'permissi.MyPermission',
- ]
- }
1.settings配置文件
- class MyPermission(object):
- """
- A base class from which all permission classes should inherit.
- """
- def has_permission(self, request, view):
- """
- Return `True` if permission is granted, `False` otherwise.
- """
- return True
- def has_object_permission(self, request, view, obj):
- return True
2.权限控制
- - 全局配置
- Highcharts.setOptions({
- global: {
- useUTC: false
- }
- });
- - 主配置
- var chart = new Highcharts.Chart('id1', {
- title: {
- text: '不同城市的月平均气温',
- x: 0
- },
- subtitle: {
- text: '数据来源: WorldClimate.com',
- x: 0
- },
- chart: {
- events: {
- load: function (e) {
- // 图标加载时,执行的函数
- }
- }
- },
- credits: {
- enable: true,
- position: {
- align: 'right',
- verticalAlign: 'bottom'
- },
- text: '老男孩',
- href: 'http://www.oldboyedu.com'
- },
- legend: {
- layout: 'vertical',
- align: 'right',
- verticalAlign: 'middle',
- borderWidth: 1
- },
- xAxis: {
- // categories: ['1.1', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
- type: 'datetime',
- labels: {
- formatter: function () {
- return Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.value);
- },
- rotation: 30
- }
- },
- yAxis: {
- title: {
- text: '数值'
- }
- },
- tooltip: {
- valueSuffix: '个',
- xDateFormat: "%Y-%m-%d %H:%M:%S",
- pointFormatter: function (e) {
- var tpl = '<span style="color:' + this.series.color + '">●</span> ' + this.series.name + ': <b>' + this.y + '</b><br/>';
- return tpl;
- },
- valueDecimals: 1,
- useHTML: true
- },
- plotOptions: {
- series: {
- cursor: 'pointer',
- events: {
- click: function (event) {
- // 点击某个指定点时,执行的事件
- console.log(this.name, event.point.x, event.point.y);
- }
- }
- }
- },
- series: [{
- name: '东京',
- // 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]
- data: [
- [1501689804077.358, 8.0],
- [1501689814177.358, 6.9],
- [1501689824277.358, 16.9],
- [1501689834377.358, 11.9]
- ]
- },
- {
- name: '洛杉矶',
- // 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]
- data: [
- [1501689804077.358, 18.0],
- [1501689814177.358, 16.9],
- [1501689824277.358, 26.9],
- [1501689834377.358, 9.9]
- ]
- }]
- });
- // 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]});
- // 参数:数值;是否重绘; isShift; 是否动画
- // chart.series[0].addPoint(18);
- // chart.series[0].addPoint([12]);
- // chart.series[0].addPoint([v.x, v.y]);
- // 参数:是否重绘
- // chart.series[0].remove(false);
- // 更新饼图
- // $('#id1').highcharts().series[0].data[0].update({x: 0, y: 100})
临时放一下
Python REST的更多相关文章
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- Apache执行Python脚本
由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
随机推荐
- Ubuntu上将终端安装到右键上
Ubuntu上将终端安装到右键上 author:headsen chen 2017-10-12 10:26:12 个人原创,允许转载,请注明作者和出处,否则依法追究法律责任 chen@chen ...
- Linux中断子系统:级联中断控制器驱动
Linux中断子系统 Linux中断子系统是个很大的话题,如下面的思维导图所示,包含硬件.驱动.中断上半部.中断下半部等等.本文着眼于中断控制器(PIC),特别是级联中断控制器驱动部分,对驱动的设计和 ...
- http,socks4,socks5代理的区别
HTTP代理 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80.8080.3128等: SOCKS代理 SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心 ...
- C++标准库vector类型的使用和操作总结
vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...
- java基础笔记(2)----流程控制
java流程控制结构包括顺序结构,分支结构,循环结构. 顺序结构: 程序从上到下依次执行,中间没有任何判断和跳转. 代码如下: package com.lvsling.test; public cla ...
- JavaScript(第十四天)【面向对象和原型】
学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建 ...
- Build to win
UPDATE:看到周筠老师的评论里的链接,那版式真的非常舒服.我想想模仿模仿他的布局来看看,虽然感觉做的也不是太好.另外对博客内容稍作修改. 一.获得小黄衫的感受 很幸运能够获得"领骑衫&q ...
- 201621123050 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...
- Beta预备
团队名称:稳住!我们能赢 Beta预备: 讨论组长是否重选的议题和结论 项目组长可以说是一个团队的灵魂和核心.一个好的领导者可以激发团队成员的工作热情,提高开发效率,保质保量的完成工作.虽然在Alph ...
- 位图(BitMap)
位图 引入:2.给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. [腾讯] 思路:如果内存够的话,40亿个整型使用位图存储需要500M左右的空间. 分 ...