5.1、錯誤提示:KeyError:
解釋:在使用藍圖進行資料庫操作時,會出現以上錯誤提示,即為弱引用提示,說明引用方式不對
解決辦法:在定義藍圖的檔案内引用全局變量app,即:
from main import app
隻要在檔案子產品内引用,可以不使用此引用的app,即可解決此問題。
(如下在\controller\user.py:檔案中增加引用 from main import app)
舉例:
main.py:
from flask import Flask
import os
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import MetaData
# 為相容老版本的mysql需要通過pymsql注冊上mysqldb
import pymysql
from controller import user
# 以下的install對于資料庫的flask-sqlalchemy架構來說是必須的
pymysql.install_as_MySQLdb()
# static_url_plan表示靜态資源的路徑,static_folder表示指定靜态目錄;templates表示指定模闆目錄
app = Flask(__name__, static_url_path='/', static_folder='resource', template_folder='template')
# 生成随機着種子,用于産生session ID
app.config['SECRET_KEY'] = os.urandom(24)
# # Flask使用內建的方式連接配接mysql
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost:3306/woniunote?charset=utf8'
# 以下參數,True:跟蹤資料庫的修改,及時發送通知,False則關閉此消息通知。此參數會影響性能
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 執行個體化DB對象
db = SQLAlchemy(app)
# 若出現上下檔案的提示時增加,否則不需增加,此檔案出現在擷取表使用Table函數時
# 對于上下檔案關系解釋:https://github.com/gnu4cn/flaskLearnings/blob/master/10_flask-SQLAlchemy.md
app.app_context().push()
# 無jinja2模闆的演練
if __name__ == '__main__':
from controller.user import *
app.register_blueprint(user)
app.run(port=8080, debug=True)
\controller\user.py:
# 控制類,主要控制頁面跳轉
# 藍圖引用,操作資料庫,必須加from main import app 的引用,否則會出現弱引用的錯誤
from main import app
from module.users import Users
from flask import Blueprint
user = Blueprint('user', __name__)
@user.route('/userx')
def user_demo():
# 執行個體化User類0Users.query.filter(Users.userid == 2).first()
users = Users()
row = users.find_user_by_id(1)
return str(row.userid)
\module\users.py
# 建立一個資料表的模型
from sqlalchemy import Table, MetaData
from main import db
# 在模型檔案中進行資料的定義與連接配接操作
class Users(db.Model):
# 新的flask-sqlalemy的編寫方法需要寫上表的相應的字段,後面才能讀出資料
# __tablename__ = "user"
# userid = db.Column(db.Integer, primary_key=True, autoincrement=True)
# username = db.Column(db.String(50), nullable=False)
# 原來sqlalemy的寫法,但這種方法會引起上下文的錯誤提示,需要在主檔案main.py中增加
# app.app_context() 的兩句引用
__table__ = Table('user', MetaData(bind=db.engine), autoload=True)
def find_user_by_id(self, userid):
obj = Users.query.first()
return obj