【问题标题】:Structure Flask-Restful API to use SQLAlchemy使用 SQLAlchemy 构建 Flask-Restful API
【发布时间】:2015-05-14 00:40:56
【问题描述】:

所以我正在尝试使用 Flask-Restful 制作一个 API,但我找到的所有示例都将所有内容都放入一个 app.py 文件中。我在Flask-Restful docs 中找到了解释如何构建 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'}

【问题讨论】:

  • api中有什么?向我们展示。
  • @RobertMoskal 哦,那是一个文件夹
  • 您的数据库位于__init__,但您从api 中的user.py 导入它
  • 是的,就像corvid所说,你的问题来自user.py中的api,应该来自app import db

标签: flask flask-sqlalchemy flask-restful


【解决方案1】:

将您的资源/模型导入移动到分配db 变量的下方(因为这些模块/脚本依赖于已经实例化的数据库):

myapi/api/__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')

【讨论】:

  • 关键是注意from api.resources.user import User在之后 db = SQLAlchemy(app)
【解决方案2】:

我遇到了同样的问题,它让我难过的时间比我愿意承认的要长。看起来这是同样的问题,所以尽管问题的年龄很长,但我会给出答案,希望我可以节省其他人一些时间。这里的问题实际上是一个包装顺序的事情。 main init 中的 db 必须在导入用户类之前实例化,因为这会导入 db 本身。我认为这是一个很多人陷入的陷阱,因为一个人的直接反应是将所有的包加载器放在文件的顶部 - 遗憾的是,在这种情况下,它不起作用,你最终会追逐你的尾巴年龄...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多