Структура Flask-Restful API для использования SQLAlchemy
Поэтому я пытаюсь создать API, используя Flask-Restful, но все примеры, которые я нахожу, помещают все в один файл app.py. В документах Flask-Restful я нашел информацию, объясняющую, как структурировать ваш API, но она не включает ничего для использования базы данных. Я опубликовал то, что придумал, и это работает, если я жестко закодирую некоторые данные, но когда я импортирую db
в users.py
Я получаю ошибку ImportError: cannot import name 'db'
, Итак, каков наилучший способ структурировать API для ввода ваших данных из базы данных?
Состав
myapi
run.py
api
__init__.py
resources
__init__.py
user.py
MyAPI /run.py
from api import app
app.run()
MyAPI / __ init__.py
from flask import Flask
from flask.ext.restful import Api
from flask.ext.sqlalchemy import SQLAlchemy
from api.resources.user import User
app = Flask(__name__)
app.debug = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/myapi'
api = Api(app)
db = SQLAlchemy(app)
api.add_resource(User, '/user')
../resources/user.py
from flask.ext.restful import Resource
from api import db
class User(Resource, db.Model):
def get(self):
return {'class': 'user', 'first': 'john', 'last': 'doe'}
2 ответа
Переместите ваш ресурс / модель импорта ниже, где вы назначаете db
переменная (поскольку эти модули / скрипты полагаются на уже созданную базу данных):
MyAPI / апи /__init__.py
from flask import Flask
from flask.ext.restful import Api
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.debug = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/myapi'
api = Api(app)
db = SQLAlchemy(app)
from api.resources.user import User
api.add_resource(User, '/user')
Я столкнулся с той же самой проблемой, и это заставило меня остаться в тупике дольше, чем я хочу признать. Похоже, что это та же проблема, поэтому, несмотря на возраст вопроса, я дам ответ в надежде, что смогу спасти кого-то еще. Проблема здесь на самом деле в том, что касается порядка пакетов. БД в главном init должен быть создан до импорта пользовательского класса, потому что это импортирует саму БД. Я думаю, что это ловушка, в которую попадают многие люди, потому что немедленный рефлекс состоит в том, чтобы поместить все загрузчики пакетов в начало файла - к сожалению, в этом случае это не работает, и вы в итоге гоняетесь за хвостом на века...