【发布时间】:2013-10-01 05:48:54
【问题描述】:
我很难让我的应用程序运行。每当我尝试在包中分离模块时,Flask-SQLAlchemy 扩展都会创建一个空数据库。为了更好地解释我在做什么,让我展示一下我的项目的结构:
Project
|
|-- Model
| |-- __init__.py
| |-- User.py
|
|-- Server
| |-- __init__.py
|
|-- API
| |-- __init__.py
这个想法很简单:我想为我的模型创建一个包,因为我不喜欢在单个包中传播代码,以及单独的“子”项目(如 API),因为我将来会使用蓝图以更好地隔离子应用。
代码很简单:
首先,Model.__init__.py:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
请注意,我创建它只是为了在包中使用单个 SQLAlchemy() 对象。不,我们去 Model.User
from Model import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
Name = db.Column(db.String(80))
Age = db.Column(db.Integer)
...
再次注意我用来允许相同 db 对象的 from Model import db。
最后,Server.__init__.py 是这样的:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import Model, API
db = Model.db
def main():
app = Flask("__main__")
db = SQLAlchemy(app)
db.create_all()
API.SetAPIHookers(app)
app.run(host="0.0.0.0", port=5000, debug=True)
if __name__ == "__main__":
main()
在我看来,db = SQLAlchemy(app) 允许我在不创建循环引用的情况下传递我的应用程序对象。
问题是每当我运行这段代码时,sqlite 数据库文件都会被创建为空的。这让我觉得也许 Python 并没有像我想象的那样导入东西。所以我通过删除导入模型并直接在服务器内部创建用户来测试我的理论......瞧,它奏效了!
现在我的问题来了:有没有一种“pythonic”的方式来正确分离我想要的模块,或者我应该把所有东西都放在同一个包中?
【问题讨论】:
-
多年后这句话“Python不会像我想象的那样导入东西”仍然是一个问题。在博客、视频甚至课程上教授 Python 的方式与实际工作环境中的 Python 之间似乎仍然存在巨大的差距。我对初学者的建议:不要拘泥于仅展示基本功能如何工作的简单示例;总是更进一步,检查它们在现实世界中的使用方式。但始终检查奖励和成本之间的平衡。
标签: python flask flask-sqlalchemy