0

我正在尝试在 IoT 项目中使用 Flask-appbuilder。因此,FAB 用于快速应用程序构建,我们需要为移动应用程序和 3rd 方服务供应商提供专用的 RESTful API。

在 FAB 中,作为 BaseCURDView 的子类,有一个 RESTful API 的实现。大多数 URL 被定义为

http://host/ /api/list

如果移动应用程序像浏览器一样充当用户代理,它收集用户名/密码,登录并访问 FAB 的 RESTful API,然后权限,url 没什么大不了的,一切都可以遵循 B/S 编程。AKA,所有安全模型都基于 cookie 和会话。大多数请求信息都在 flask.g.user/flask.request.* 中。

如果 webapp 必须支持更多标准样式的 RESTful API,如 miguel 的烧瓶书中所述。外部 webapp 必须将 api key/secret 嵌入到指定的 url 以交换令牌,然后在 header 或 http 参数中使用令牌来访问资源以进行 CRUD 操作。

http://host/api/v1/get_token
header:api_key:balabalabala
header:api_secret:abcdefxyz
return {'token':'1234567890'}


http://host/api/v1/resource
header:token:1234567890
return {'resource':'abcdefghijk'}

我已经成功地将它们合并到 FAB 的 views.py 中。

from flask import render_template
from flask_appbuilder.models.sqla.interface import SQLAInterface
from flask_appbuilder import ModelView, BaseView, expose
from app import appbuilder, db

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

tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good python tutorial',
        'done': False
    }
] 

def make_public_task(task):
    new_task = {}
    for field in task:
        if field == 'id':
            new_task['uri'] = url_for('get_task', task_id=task['id'], _external=True)
        else:
            new_task[field] = task[field]
    return new_task


class ApiView(BaseView):
    route_base = "/api/v1"
    default_view = "index"

    @expose("/index")
    def index(self):
        #return jsonify({'tasks': map(make_public_task, tasks)}) 
        print repr(request.args)
        print repr(request.method)
        print repr(request.headers)
        return jsonify(tasks)

    @expose("/get_token")
    def get_token(self):
        print repr(request.headers)
        return jsonify({'res': True})

    @expose("/get_resource")
    def get_resource(self):
        return jsonify({'res': False})

    @expose("/del_resource")
    def del_resource(self):
        return jsonify({'res': False})

"""
    Application wide 404 error handler
"""
@appbuilder.app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html', base_template=appbuilder.base_template, appbuilder=appbuilder), 404

db.create_all()

appbuilder.add_view_no_menu(ApiView())

是的,我可以实现标准的 RESTful API,就像我在另一个烧瓶项目中使用 http 标头和使用 sqlalchemy 的自定义查询一样。但我不确定这是否是正确的方法。由于大部分数据都是直接从 sqlalchemy 原始查询请求的,因此它们是完全不同的编程体验。

在继续前进之前,欢迎提出任何建议。

4

1 回答 1

0

实际上 FAB 的 REST API 是为 AJAX 设计的,所以对于移动应用程序和 3rd 方应用程序,我们需要一个单独的 RESTful API,它可以遵循flask 大教程和最佳实践,并从 Miguel 重新获取 REST-auth 库。

无论如何,FAB 都可以使用。

于 2018-01-10T01:45:33.923 回答