初学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机制问题了,好在查了大量资料,终于解决问题,大意是因为循环导入造成的问题。不过因为初学,还没有完全理解原作者的意思,这里我把原文链接贴出:

blog.csdn.net/spider_py/article/de...

修改后代码如下:
首先在文件: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 协议》,转载必须注明作者和本文链接
附言 1  ·  1年前

补充一下第三个问题,我尝试过把查询数据的代码拿到 flask 以外运行,结果是正常的。我想不通,都是循环导入的问题,为什么放在 flask 里面就会出错。

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!