初学python+flask+sqlalchemy遇到的一些问题及解决办法
初学python,因为以前我是搞web开发的,所以先从搭建web开始学起,用的flask。但由于不太熟悉python的机制,又被视频误导……也不能说是误导吧,至少讲师那里没出问题,总之走了两天的弯路,这里给大家分享一下,算是交流吧。
首先,代码刚完善一点点报错:
This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context().
这个简单,加app.app_context().push()
就能解决。
第二,Blueprint蓝图的问题,先贴代码:
文件:controller/index.py
from flask import Blueprint, render_template
indexRoute = Blueprint("index", __name__)
@indexRoute.route("/")
def page_index():
return render_template("index.html")
文件:main.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
app.app_context().push()
from controller.index import *
app.register_blueprint(indexRoute)
if __name__ == '__main__':
app.run(debug=True)
运行后报错:NameError: name 'indexRoute' is not defined
我明明在controller/index.py
中,已经indexRoute = Blueprint("index", __name__)
,我第一念头是不是哪个字母打错,但不是,应该是python机制问题了,好在查了大量资料,终于解决问题,大意是因为循环导入造成的问题。不过因为初学,还没有完全理解原作者的意思,这里我把原文链接贴出:
修改后代码如下:
首先在文件:controller/__init__.py
中添加代码:
from flask import Blueprint
indexRoute = Blueprint('index', __name__)
from . import index
文件:controller/index.py
修改代码:
from flask import render_template
from . import indexRoute
@indexRoute.route("/")
def page_index():
return render_template("index.html")
文件:main.py
修改代码:
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
app.app_context().push()
from controller import indexRoute
app.register_blueprint(indexRoute)
if __name__ == '__main__':
app.run(debug=True)
相当于把原controller/index.py
的Blueprint那句,放至__init__.py
中,其它就是就是改下引用。
第三,当我把数据库连起来的时候,报错
KeyError: <weakref at 0x0000018692731350; to ‘Flask’ at 0x000001869149A8D0>
这个问题我还发过帖子求助,虽然我把from controller这段代码放置if name这段外时,看起来好像问题解决了,但实际上并没有。还好,因为有了第二个,就是Blueprint那个问题带来的思路,仔细看源代码,确定了也因为循环导入出现的问题。
究其原因,是我不想每次对数据库操作都要来个db
什么什么的,所以我这段代码放在了单独的一个文件里,想法是每次访问数据库前调用一下就好,没想到它让我绕了两天弯路。
只要找到原因就好解决:
1、先新建一个文件,比如database.py
,代码:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
2、修改main.py
里的几个地方:
(1)加入database的引用from database import db
(2)把db = SQLAlchemy(app)
改成db = init_app(app)
3、flask的配置文件config.py
初始化一下db
,代码是:db = SQLAlchemy()
4、自己写的数据库操作的那些个文件,也from database import db
做下引用
其他代码不变。
我写这文的目的一是想加深自己的印象,二是想分享给跟我一样刚学python的朋友们,回头想想,几行代码就能解决的事情……经验太重要,而网络上现在胡扯的又太多,很容易把你带向弯路。
当然,也欢迎大家一起讨论交流!
本作品采用《CC 协议》,转载必须注明作者和本文链接
补充一下第三个问题,我尝试过把查询数据的代码拿到 flask 以外运行,结果是正常的。我想不通,都是循环导入的问题,为什么放在 flask 里面就会出错。
推荐文章: