Flask-appbuilder API RESTful против API Flask-RESTful

Я пытаюсь использовать 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.*.

Если веб-приложение должно поддерживать API RESTful в более стандартном стиле, как описано в flumb books by 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'}

Я успешно слил их вместе в views.py FAB.

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())

Да, я могу реализовать стандартный API RESTful, как я это делал в другом проекте с флягами с заголовками http и пользовательскими запросами с sqlalchemy. Но я не уверен, что это правильный способ сделать это. Поскольку большая часть данных запрашивается непосредственно из необработанных запросов sqlalchemy, они имеют совершенно другой опыт программирования.

Откройте для любых предложений, прежде чем двигаться вперед.

1 ответ

На самом деле REST API FAB разработан для AJAX, поэтому для мобильных приложений и сторонних приложений нам необходим отдельный RESTful API, который может следовать мегатехнологиям на основе флеш-памяти и рекомендациям, а также использовать библиотеку REST-auth от Miguel.

FAB может работать с обоими так или иначе.

Другие вопросы по тегам