使用python web做Restful 风格,很简单,采用Flask框架轻松实现一个RESTful的服务。

Restful相关介绍请查看:https://www.ibm.com/developerworks/library/ws-restful/index.html

1. 环境搭建

首先需要准备环境

  need virtualenv  python的沙盒环境--virtualenv (不必须)

    这里使用 virtualenv  来创建一个Python环境,用来运行我们稍后的restful服务端。

  need flask (必须)

1.1 安装

1.1.1 pip

  安装软件用

  下载地址:https://pypi.python.org/pypi/pip/

  下载 pip tar.gz

  解压 tar -xzvf

  进入目录安装 python setup.py install 即可使用

1.1.2 virtualenv

  创建虚拟环境用

  pip install virtualenv 直接下载安装

  或者 进入 https://pypi.python.org/pypi/virtualenv 下载 tar包 和pip安装类似

1.1.3 flask

  web框架 重要

  pip install flask 直接下载安装

  或者 https://pypi.python.org/pypi/Flask/0.12.2#downloads 下载tar包 解压安装

  手动装需要(install会自动安装,如果linux虚拟机未联网,根据提示缺什么,去安装什么):

    click >=2.0:https://pypi.python.org/simple/click/

    itsdangerous >=0.21:https://pypi.python.org/simple/itsdangerous/

    jinja2 >= 2.4:https://pypi.python.org/simple/jinja2/

    werkzeug>=0.7:https://pypi.python.org/simple/werkzeug/

2. 环境测试

2.1 创建虚拟环境

选择一个合适的路径下 

我选择的是  /var/flask 当然可以随意选择一个目录

virtualenv web ,做一个名为web的python环境,也可以不要这个环境,直接第二步创建app.py

目录如:

  

2.2 新建app.py

在bin中新建app.py

app.route 的用法和Springmvc 的controller requestmapping很类似,详细请查看:http://www.guadong.net/article/2eHheDFm.html

#环境测试
from flask import Flask app = Flask(__name__) @app.route('/')
def index():
return "Hello, Python Flask!" if __name__ == '__main__':
app.run(host="0.0.0.0",debug=True)

2.3 执行访问

执行 python app.py

  

本地访问(可以新开一个ssh进行测试,也可以用IP地址(ip访问需要绑定0.0.0.0)  app.run(host="0.0.0.0",debug=True)  用浏览器测试)

这里采用linux内部访问:curl -i http://localhost:5000

  

访问得到了Hello, Python Flask!

说明环境搭建成功success!。

3. 正式干活

这里还是使用Person对象来做Restful的演示,参考:SpringMVC 构建Restful风格 及问题处理

/persons  GET         得所有person

/person/{id}  GET     得到id的person

/person   POST        新增person

/person/{id}  PUT      更新id的person

/person/{id}  DELETE    删除id的person

新建person.py

编码:

#coding=utf-8

引入需要的模块:

from flask import Flask,jsonify,abort,make_response,request

模拟数据库数据:

#模拟数据库 person 属性 id name age done url
persons = [
{
'id': 1,
'name': u'loveincode',
'age': 20,
'done': False,
'url':u'loveincode.cnblogs.com'
},
{
'id': 2,
'name': u'strive',
'age': 18,
'done': False,
'url':u'loveincode.cnblogs.com'
}
]

3.1 GET persons

代码设计:

@app.route('/restful/persons', methods=['GET'])
def get_persons():
return jsonify({'persons': persons})

先执行:python person.py

test:curl -i http://localhost:5000/restful/persons

  

3.2 GET person

@app.route('/restful/person/<int:id>', methods=['GET'])
def get_person(id):
person = filter(lambda t: t['id'] == id, persons)
if len(person) == 0:
abort(404)
return jsonify({'person': person[0]})

先执行:python person.py

test:curl -i http://localhost:5000/restful/person/2

  

错误404 后面一起讲。

3.3 POST

@app.route('/restful/person', methods=['POST'])
def create_person():
if not request.json or not 'name' in request.json:
abort(400)
person = {
'id': persons[-1]['id'] + 1,
'name': request.json['name'],
#如果没有提交age参数默认为20
'age': request.json.get('age', 20),
#同理如果没提交url,url也是默认值
'url': request.json.get('url', "默认URL loveincode.cnblogs.com"),
#该参数初始化FALSE
'done': False
}
persons.append(person)
return jsonify({'person': person}), 201

先执行:python person.py

test:提供三个测试

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"new loveincode"}' http://localhost:5000/restful/person

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"new loveincode","age":23}' http://localhost:5000/restful/person

curl -i -H "Content-Type: application/json" -X POST -d '{"name":"new loveincode","age":23,"url":"1234"}' http://localhost:5000/restful/person

验证最后一个 ,先post 再看所有 添加成功

  

3.4 PUT

@app.route('/restful/person/<int:id>', methods=['PUT'])
def update_person(id):
person = filter(lambda t: t['id'] == id, persons)
if len(person) == 0:
abort(404)
if not request.json:
abort(400)
if 'name' in request.json and type(request.json['name']) != unicode:
abort(400)
if 'age' in request.json and type(request.json['age']) is not int:
abort(400)
if 'url' in request.json and type(request.json['url']) != unicode:
abort(400)
if 'done' in request.json and type(request.json['done']) is not bool:
abort(400)
person[0]['name'] = request.json.get('name', person[0]['name'])
person[0]['age'] = request.json.get('age', person[0]['age'])
person[0]['url'] = request.json.get('url', person[0]['url'])
person[0]['done'] = request.json.get('done', person[0]['done'])
return jsonify({'person': person[0]})

先执行:python person.py

test:

curl -i -H "Content-Type: application/json" -X PUT -d '{"done":true}' http://localhost:5000/restful/person/2

curl -i -H "Content-Type: application/json" -X PUT -d '{"name":"update","age":30}' http://localhost:5000/restful/person/2

  

3.5 DELETE

@app.route('/restful/person/<int:id>', methods=['DELETE'])
def delete_person(id):
person = filter(lambda t: t['id'] == id, persons)
if len(person) == 0:
abort(404)
persons.remove(person[0])
return jsonify({'result': True})

先执行:python person.py

test:

curl -i -X DELETE http://localhost:5000/restful/person/2

  

3.6 Error 处理

对400 和 404 进行错误json封装,一个友好的错误提示

@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404) @app.errorhandler(400)
def not_found(error):
return make_response(jsonify({'error': 'Request Error'}), 400)

github地址:https://github.com/loveincode/python-restful-web

参考:http://www.cnblogs.com/vovlie/p/4178077.html

python 部署 Restful web的更多相关文章

  1. 部署一个基于python语言的web发布环境

    ---恢复内容开始--- 1) 一门面向对象的语言 2)拥有丰富的库 3)可移植性 4)免费.开源 5)简单易易学 可做软件开发.人工智能.web开发等等 部署流程: Cnetos7.5+Nginx+ ...

  2. (数据科学学习手札123)Python+Dash快速web应用开发——部署发布篇

    1 简介 这是我的系列教程Python+Dash快速web应用开发的第二十期,在上一期中我介绍了利用内网穿透的方式,将任何可以联网的电脑作为"服务器"向外临时发布你的Dash应用. ...

  3. Jersey the RESTful Web Services in Java

    Jersey 是一个JAX-RS的实现, JAX-RS即Java API for RESTful Web Services, 支持按照表述性状态转移(REST)架构风格创建Web服务. REST 中最 ...

  4. 使用 Spring 3 来创建 RESTful Web Services

    来源于:https://www.ibm.com/developerworks/cn/web/wa-spring3webserv/ 在 Java™ 中,您可以使用以下几种方法来创建 RESTful We ...

  5. Building a RESTful Web Service Using Spring Boot In Eclipse

    一.构建restful web service 创建Maven的java web工程,maven的pom文件加入依赖包 创建包hello Greeting.java package hello; pu ...

  6. [转载] 新兵训练营系列课程——平台服务部署及Web框架

    原文: http://weibo.com/p/1001643875679132642345 大纲 微博平台主要负责微博基础功能.接下来将会介绍 平台的作用,以及服务提供的形式 平台Web服务的部署 平 ...

  7. RESTful Web Services测试工具推荐

    命令行控的最爱:cURL cURL是一个很强大的支持各种协议的文件传输工具,用它来进行RESTful Web Services的测试简直是小菜一碟.这个工具基本上类Unix操作系统(各种Linux.M ...

  8. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service

    准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...

  9. 使用 Spring 3 来创建 RESTful Web Services(转)

    使用 Spring 3 来创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参 ...

随机推荐

  1. 【Centos7】安装mysql5.7.16.tar.gz

    操作系统 centos7.1 云主机 1.下载好了压缩包到windows电脑上 2.使用Smartty的SCP传输到云主机的/home/xxx/下 3.解压 tar xvf  mysql-5.7.16 ...

  2. jumpserver V0.4.0 在CentOs7上的安装

    基于 CentOS 7 一步一步安装 Jumpserver 0.4.0 环境 系统: CentOS 7 IP: 192.168.226.128 一. 准备Python3和Python虚拟环境 1.1 ...

  3. [读书笔记] 一、Spring boot项目搭建与配置文件

    读书笔记:[JavaEE开发的颠覆者 Spring Boot实战] 作者:汪云飞 从今天开始坚持读书,并记录下此读书笔记. 一,初接触 Spring boot 项目Hello world搭建 1.po ...

  4. 第三篇--Jmeter测试数据库Mysql

    Jmeter模拟100用户访问Mysql数据库 1.将Mysql数据库的驱动[mysql-connector-java-5.1.15-bin.jar]放到jmeter的lib目录下,新建线程组100[ ...

  5. Microsoft Dynamics 365 之 味全食品 项目分享和Customer Engagement新特性分享

    味全食品 Dynamics 365项目: 在企业门户和电子商务等新营销模式频出的今天,零售业需要利用统一的管理平台管理日益庞大的客户及销售数据,整合线上线下的零售业务,从采购.仓储.生产.配送到销售. ...

  6. crontab 各参数详解及如何查看日志记录

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt145 crontab各参数说明: crontab [-u user] [fi ...

  7. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  8. MySQL (九)-- 代码执行结构、函数、存储过程

    1 代码执行结构 代码执行结构有三种:顺序结构.分支结构和循环结构. 1.1 分支结构 分支结构:实现准备多个代码块,按照条件选择性执行某段代码. 在MySQL中只有if分支. 基本语法 if 条件判 ...

  9. MyEclipse安装步骤和破解

    Myeclipse的安装步骤 MyEclipse简介: MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用 ...

  10. JavaScript 的使用基础总结③

    JavaScript 中的对象 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... JavaScript 允许自定义对象. (一)数组 数组对象的作用是:使用单独的变量名来存储 ...