Структура 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 должен быть создан до импорта пользовательского класса, потому что это импортирует саму БД. Я думаю, что это ловушка, в которую попадают многие люди, потому что немедленный рефлекс состоит в том, чтобы поместить все загрузчики пакетов в начало файла - к сожалению, в этом случае это не работает, и вы в итоге гоняетесь за хвостом на века...

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