RESTful API Flask-appbuilder против 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. *.

Если веб-приложение должно поддерживать 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, это совсем другой опыт программирования.

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


person Allan K Liu    schedule 22.11.2017    source источник


Ответы (1)


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

В любом случае FAB может работать с обоими.

person Allan K Liu    schedule 10.01.2018