我正在尝试在IoT项目中使用Flask-appbuilder。因此,FAB用于快速应用程序构建,我们需要专门用于移动应用程序和第三方服务供应商的RESTful API。
在FAB中,有一个RESTful API的实现,作为BaseCURDView的子类。大多数URL定义为
http://host/ / API /列表
如果移动应用程序充当浏览器等用户代理,它会收集用户名/密码,登录并访问FAB的RESTful API,然后权限,url不是什么大问题,一切都可以按照B / S编程。 AKA,所有安全模型都基于cookie和会话。大多数请求信息都在flask.g.user / flask.request。*中。
如果webapp必须支持更多标准样式的RESTful API,如miguel的烧瓶书中所述。外部webapp必须将api密钥/机密嵌入到指定的URL以交换令牌,然后在header或http参数中使用token来访问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())
是的,我可以在另一个带有http标头和使用sqlalchemy的自定义查询的烧瓶项目中实现标准的RESTful API。但我不确定这是否是正确的方法。由于大多数数据都是直接从sqlalchemy原始查询中请求的,因此它们的编程体验完全不同。
在继续前进之前公开任何建议。
答案 0 :(得分:0)
实际上FAB的REST API是专为AJAX设计的,因此对于移动应用和第三方应用,我们需要一个单独的RESTful API,它可以遵循flask megatutorial和最佳实践,并从Miguel中恢复REST-auth库。
无论如何,FAB可以同时使用。