使用Python & Flask 实现RESTful Web API的实例


Posted in Python onSeptember 19, 2017

环境安装:

sudo pip install flask

Flask 是一个Python的微服务的框架,基于Werkzeug, 一个 WSGI 类库。

Flask 优点:

Written in Python (that can be an advantage);
Simple to use;
Flexible;
Multiple good deployment options;
RESTful request dispatching

RESOURCES

一个响应 /articles 和 /articles/:id的 API 服务:

from flask import Flask, url_for
app = Flask(__name__)

@app.route('/')
def api_root():
 return 'Welcome'

@app.route('/articles')
def api_articles():
 return 'List of ' + url_for('api_articles')

@app.route('/articles/<articleid>')
def api_article(articleid):
 return 'You are reading ' + articleid

if __name__ == '__main__':
 app.run()

请求:

curl http://127.0.0.1:5000/

响应:

GET /
Welcome

GET /articles
List of /articles

GET /articles/123
You are reading 123

REQUESTS

GET Parameters

from flask import request

@app.route('/hello')
def api_hello():
 if 'name' in request.args:
  return 'Hello ' + request.args['name']
 else:
  return 'Hello John Doe'

请求:

GET /hello
Hello John Doe

GET /hello?name=Luis
Hello Luis

Request Methods (HTTP Verbs)

@app.route('/echo', methods = ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'])
def api_echo():
 if request.method == 'GET':
  return "ECHO: GET\n"

 elif request.method == 'POST':
  return "ECHO: POST\n"

 elif request.method == 'PATCH':
  return "ECHO: PACTH\n"

 elif request.method == 'PUT':
  return "ECHO: PUT\n"

 elif request.method == 'DELETE':
  return "ECHO: DELETE"

请求指定request type:

curl -X PATCH http://127.0.0.1:5000/echo
GET /echo
ECHO: GET

POST /ECHO
ECHO: POST

Request Data & Headers

from flask import json

@app.route('/messages', methods = ['POST'])
def api_message():

 if request.headers['Content-Type'] == 'text/plain':
  return "Text Message: " + request.data

 elif request.headers['Content-Type'] == 'application/json':
  return "JSON Message: " + json.dumps(request.json)

 elif request.headers['Content-Type'] == 'application/octet-stream':
  f = open('./binary', 'wb')
  f.write(request.data)
    f.close()
  return "Binary message written!"

 else:
  return "415 Unsupported Media Type ;)"

请求指定content type:

curl -H "Content-type: application/json" \
-X POST http://127.0.0.1:5000/messages -d '{"message":"Hello Data"}'

curl -H "Content-type: application/octet-stream" \
-X POST http://127.0.0.1:5000/messages --data-binary @message.bin

RESPONSES

from flask import Response

@app.route('/hello', methods = ['GET'])
def api_hello():
 data = {
  'hello' : 'world',
  'number' : 3
 }
 js = json.dumps(data)

 resp = Response(js, status=200, mimetype='application/json')
 resp.headers['Link'] = 'http://luisrei.com'

 return resp

查看response HTTP headers:

curl -i http://127.0.0.1:5000/hello

优化代码:

from flask import jsonify

使用

resp = jsonify(data)
resp.status_code = 200

替换

resp = Response(js, status=200, mimetype='application/json')

Status Codes & Errors

@app.errorhandler(404)
def not_found(error=None):
 message = {
   'status': 404,
   'message': 'Not Found: ' + request.url,
 }
 resp = jsonify(message)
 resp.status_code = 404

 return resp

@app.route('/users/<userid>', methods = ['GET'])
def api_users(userid):
 users = {'1':'john', '2':'steve', '3':'bill'}
 
 if userid in users:
  return jsonify({userid:users[userid]})
 else:
  return not_found()

请求:

GET /users/2
HTTP/1.0 200 OK
{
"2": "steve"
}

GET /users/4
HTTP/1.0 404 NOT FOUND
{
"status": 404,
"message": "Not Found: http://127.0.0.1:5000/users/4"
}

AUTHORIZATION

from functools import wraps

def check_auth(username, password):
 return username == 'admin' and password == 'secret'

def authenticate():
 message = {'message': "Authenticate."}
 resp = jsonify(message)

 resp.status_code = 401
 resp.headers['WWW-Authenticate'] = 'Basic realm="Example"'

 return resp

def requires_auth(f):
 @wraps(f)
 def decorated(*args, **kwargs):
  auth = request.authorization
  if not auth: 
   return authenticate()

  elif not check_auth(auth.username, auth.password):
   return authenticate()
  return f(*args, **kwargs)

 return decorated

replacing the check_auth function and using the requires_auth decorator:

@app.route('/secrets')
@requires_auth
def api_hello():
return "Shhh this is top secret spy stuff!"
HTTP basic authentication:

curl -v -u "admin:secret" http://127.0.0.1:5000/secrets

SIMPLE DEBUG & LOGGING

Debug:

app.run(debug=True)
Logging:

import logging
file_handler = logging.FileHandler('app.log')
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)

@app.route('/hello', methods = ['GET'])
def api_hello():
 app.logger.info('informing')
 app.logger.warning('warning')
 app.logger.error('screaming bloody murder!')
 
 return "check your logs\n"

以上这篇使用Python & Flask 实现RESTful Web API的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现系统状态监测和故障转移实例方法
Nov 18 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
Python内置函数OCT详解
Nov 09 Python
Python通过future处理并发问题
Oct 17 Python
python实现画圆功能
Jan 25 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
python实现两个字典合并,两个list合并
Dec 02 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
Python循环之while无限迭代
Apr 30 Python
python基本语法练习实例
Sep 19 #Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 #Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 #Python
Python 文件操作的详解及实例
Sep 18 #Python
python Socket之客户端和服务端握手详解
Sep 18 #Python
Python基于time模块求程序运行时间的方法
Sep 18 #Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 #Python
You might like
PHP中SimpleXML函数用法分析
2014/11/26 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python SQLite3数据库操作类分享
2014/06/10 Python
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
介绍一下游标
2012/01/10 面试题
C#的几个面试问题
2016/05/22 面试题
计算机本科生自荐信
2013/10/15 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
学校四风对照检查材料
2014/08/28 职场文书
计算机科学与技术专业求职信
2014/09/03 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
公证书
2019/04/17 职场文书
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android