首页 > 其他 > 详细

flask restful

时间:2020-05-18 21:52:46      阅读:73      评论:0      收藏:0      [点我收藏+]

flask restful


1. restful

restful:representational state transfer,简称REST,描述了一个架构样式的网络系统。
REST并没有一个明确的标准,而更像是一种设计的风格。

这里不再讨论rest是什么,只关心flask环境下的restful api实现。

方法及操作定义:
HTTP 方法 URL 动作

  • GET http://[hostname]/todo/api/v1.0/tasks 检索任务列表
  • GET http://[hostname]/todo/api/v1.0/tasks/[task_id] 检索某个任务
  • POST http://[hostname]/todo/api/v1.0/tasks 创建新任务
  • PUT http://[hostname]/todo/api/v1.0/tasks/[task_id] 更新任务
  • DELETE http://[hostname]/todo/api/v1.0/tasks/[task_id] 删除任务

2. 路由简单实现

这里是直接使用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})  

3. 使用restful包实现

3.1. 安装

pip install flask-restful

3.2. 实现

  
# 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")  

释义:

  1. endpoint是用来给url_for 反转url的时候指定的。如果不写endpoint,那么将会使用视图的名字的小写来作为endpoint.
  2. add_resource的第二个参数是访问这个视图函数的url,这个url可以跟之前的route一样,可以传递参数。并且还有一点不同的是,这个方法可以传递多个url来指定这个视图函数
  3. 如果想返回json数据就使用flask_restful,如果想渲染模板,还是建议“app.route”。
  4. api类创建可以使用app也可以使用blueprint,上例中即是使用blueprint
  5. 核心句是add_resource,它会注册视图到map。

关于传参

  • request.form也可以使用;
  • flask-restful提供了reqparse类用于解析参数,它的参数必须使用add_argument声明,否则不会解析出来;

3.2.1. add_resouce()

def add_resource(self, resource, *urls, **kwargs):  

参数释义:

  • resource:API类;
  • urls:一个或多个url,与route(url)中的url作用一样,不同的是可以添加多个,这多个url都会指向同一endpoint;
  • kw:kw中可以指定endpoint名,如不指定默认为API类名的小写化。

上例中的‘/rest/‘意味着get和put都会解析出id参数并传递给视图函数。

4. 附录

4.1.1. post 传参

如果是application/json方式
from flask_restful import request
dict = request.json()

如果是application/x-www-form-urlencoded方式
from flask_restful import request
dict = request.form

4.1.2. endpoint

简单理解是:
url通过endpoint来去查找视图函数(通常endpoint的名字与视图函数名一致),但是如果不一致的时候,就需要有针对性的指定某个视图函数去执行,也或者多个蓝图里面有一样的视图函数的场景下,需要指定具体的endpoint

flask restful

原文:https://www.cnblogs.com/wodeboke-y/p/12912832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!