Я пытаюсь использовать Flask-appbuilder в проекте IoT. Итак, FAB используется для быстрого создания приложений, и нам нужен специальный RESTful API для мобильных приложений и сторонних поставщиков услуг.
В FAB есть реализация RESTful API как подкласс BaseCURDView. Большинство URL-адресов определяется как
http://host/ / api / list
Если мобильное приложение действует как пользовательский агент, например браузер, оно собирает имя пользователя / пароль, логин и получает доступ к RESTful API FAB, тогда разрешения, URL-адрес не имеет большого значения, все может следовать B / S-программированию. ИНАЧЕ, вся модель безопасности основана на файлах cookie и сеансах. Большая часть информации о запросе находится внутри файла flask.g.user / flask.request. *.
Если веб-приложение должно поддерживать RESTful API в более стандартном стиле, как описано в книгах flask, написанных miguel. Внешнее веб-приложение должно встроить ключ / секрет API в указанный URL-адрес для обмена токеном, а затем использовать токен в заголовке или параметрах 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, это совсем другой опыт программирования.
Открыт для любых предложений, прежде чем двигаться дальше.