restful:representational state transfer,简称REST,描述了一个架构样式的网络系统。
REST并没有一个明确的标准,而更像是一种设计的风格。
这里不再讨论rest是什么,只关心flask环境下的restful api实现。
方法及操作定义:
HTTP 方法 URL 动作
这里是直接使用route实现。
from flask_login import login_required
from flask import request, jsonify
from werkzeug.urls import url_parse
from werkzeug.exceptions import abort
from . import blue_restful
# flask restful api
# 路由实现
books = [
{
‘id‘: 1,
‘title‘: u‘论语‘,
‘auther‘: u‘孔子‘,
‘price‘: 18
},
{
‘id‘: 2,
‘title‘: u‘道德经‘,
‘auther‘: u‘老子‘,
‘price‘: 15
}
]
@blue_restful.route(‘/‘)
def restful_index():
return ‘restful api.‘
@blue_restful.route(‘/bookstore/api/v1/books‘, methods=[‘GET‘])
def get_tasks():
return jsonify({‘books‘: books})
@blue_restful.route(‘/bookstore/api/v1/books/‘, methods=[‘GET‘])
def get_task(id):
for book in books:
if book[‘id‘] == id:
return jsonify({‘book‘: book})
abort(400)
@blue_restful.route(‘/bookstore/api/v1/books‘, methods=[‘POST‘])
def create_task():
if not request.form or not ‘title‘ in request.form:
abort(404)
book = {
‘id‘: books[-1][‘id‘] + 1,
‘title‘: request.form[‘title‘],
‘auther‘: request.form[‘auther‘],
‘price‘: request.form[‘price‘],
}
books.append(book)
return jsonify({‘book‘: book}), 201
@blue_restful.route(‘/bookstore/api/v1/books/‘, methods=[‘PUT‘])
def update_book(id):
for book in books:
if book[‘id‘] == id:
book["title"] = request.form[‘title‘]
book["auther"] = request.form[‘auther‘]
book["price"] = request.form[‘price‘]
return jsonify({‘books‘: books})
abort(400)
@blue_restful.route(‘/bookstore/api/v1/books/‘, methods=[‘DELETE‘])
def delete_task(id):
for book in books:
if book[‘id‘]==id:
books.remove(book)
return jsonify({‘result‘: True})
abort(404)
return jsonify({‘result‘: True})
pip install flask-restful
# flask restful
from flask_restful import Resource, Api, reqparse
parser = reqparse.RequestParser()
parser.add_argument(‘task‘, type=str, help=‘task‘)
parser.add_argument(‘pwd‘, type=str, help=‘task‘)
TODO_TASKS = { ‘todo1‘: {‘task‘: ‘build an API‘},
‘todo2‘: {‘task‘: ‘?????‘},
‘todo3‘: {‘task‘: ‘profit!‘},
}
class FlaskRestful_API(Resource):
def get(self, id=None, name=None):
if not id:
return TODO_TASKS
else:
task = TODO_TASKS.get(str(id), None)
return task
def put(self, id):
print(request.form)
print(‘put‘, request.form)
if id in TODO_TASKS:
TODO_TASKS[id].update(request.form)
return TODO_TASKS[id]
else:
abort(404)
def post(self, *ar, **kw):
args = parser.parse_args()
print(args, ar, kw)
print(request.form)
res_json = jsonify({
‘method‘: request.method
, ‘url‘: request.url
, ‘values‘: request.values
, ‘headers‘: dict(request.headers)
, ‘cookie‘: request.cookies
, ‘session‘: request.host
, ‘body‘: request.data.decode()
, ‘origi‘: request.remote_addr
, "endpoint": request.endpoint
})
return res_json
def delete(self):
pass
# 定义api类并注册视图
api = Api(blue_restful)
# 注册视图
# 注意endpoint,如果不指定便为类名的小写
api.add_resource(FlaskRestful_API, ‘/rest/‘, ‘/rest/‘, endpoint="rest_api")
释义:
关于传参
def add_resource(self, resource, *urls, **kwargs):
参数释义:
上例中的‘/rest/
如果是application/json方式
from flask_restful import request
dict = request.json()
如果是application/x-www-form-urlencoded方式
from flask_restful import request
dict = request.form
简单理解是:
url通过endpoint来去查找视图函数(通常endpoint的名字与视图函数名一致),但是如果不一致的时候,就需要有针对性的指定某个视图函数去执行,也或者多个蓝图里面有一样的视图函数的场景下,需要指定具体的endpoint
原文:https://www.cnblogs.com/wodeboke-y/p/12912832.html