本文摘自php中文网,作者巴扎黑,侵删。
下面小编就为大家带来一篇使用Python & Flask 实现RESTful Web API的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧环境安装:
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 服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
1 2 3 4 5 6 7 8 | 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
使用
1 2 | resp = jsonify(data)
resp.status_code = 200
|
替换
1 | resp = Response(js, status=200, mimetype= 'application/json' )
|
Status Codes & Errors
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 | 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如何安装whl文件
Python解析socket数据流异常bytes的问题(详细)
Python基础_文件操作实现全文或单行替换的方法
Python在普通工作中的应用有那些
Python删除不需要的Python文件方法
冒泡排序有哪2种写法,用冒泡排序对10个数进行排列
mac上用什么写Python
Python函数基础入门
Python标准库是什么
如何用Python统计字符串中字母个数?
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » 实例讲解使用Python & Flask 实现RESTful Web API