天天看點

Flask項目實戰十三之使用藍圖遇到的坑(一)

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