簡體   English   中英

關鍵錯誤:<weakref at 0x7f37bb9587c0; to 'flask' 0x7f37be04ef20></weakref>

[英]KeyError: <weakref at 0x7f37bb9587c0; to 'Flask' at 0x7f37be04ef20>

我創建了一個 Flask 應用程序,使用 SQLite、SQLAlchemy 和 WTForms。 我的目標是創建分類類別樹以供站點用戶使用 HTML forms 喜歡:1 類別 1 子類別 2 子類別.... 2 類別....

我在表單中遇到 WTForms QuerySelectField問題 (forma.validate_on_submit():)。 打開表單頁面后,報錯:KeyError : <weakref at 0x7f37bb9587c0; 到 0x7f37be04ef20 處的“燒瓶”>

詳細3個文件: mainrun.py

from flask import Flask, render_template, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import formsrun
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

app = Flask(__name__)
app.config['SECRET_KEY'] = 'xxxxx'
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///todobudjet34.db"
db = SQLAlchemy(app)

class CategoryGroup(db.Model):
    __tablename__ = "category_group"
    id = db.Column(db.Integer, primary_key=True)
    category_group = db.Column(db.String(200), unique= True)
    category_add = db.relationship("MyCategory")

class MyCategory(db.Model):
    __tablename__ = "mycategory"
    id = db.Column(db.Integer, primary_key=True)
    cat_gr_id = db.Column(db.Integer, db.ForeignKey('category_group.id'))
    my_category_name = db.Column(db.String(200), unique = True)
    my_sub_category_add = db.relationship("SubCategory")
    my_sub_directory_cat_add = db.relationship("SubDirectoryCat")

with app.app_context():
    db.create_all()

@app.route("/")
def index():
    return render_template("index.html")

@app.route("/categories")
def categories():
    try:
        categories = MyCategory.query.all()
    except:
        categories = []
    return render_template("categories.html", categories=categories)

@app.route("/newcategory", methods=["GET", "POST"])
def newcategory():
    db.create_all()
    forma = formsrun.CategoryForm()
    if forma.validate_on_submit():
        category = MyCategory(cat_gr_id=forma.category_group_source.data.id, my_category_name=forma.my_categ.data)
        db.session.add(category)
        db.session.commit()
        return redirect(url_for('categories'))

    return render_template("newcategory.html", form=forma)

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8050, debug=True) 

形式運行.py

from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, SubmitField, SelectField, FloatField
from wtforms.validators import DataRequired, Email, InputRequired
from wtforms_sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField
import mainrun

def get_pk(obj):
    return str(obj)
def category_group_query():
    return mainrun.CategoryGroup.query

def category_query():
    return mainrun.MyCategory.query

class CategoryGroupForm(FlaskForm):
    my_category_group = StringField('My category group name', [DataRequired ()])
    submit = SubmitField("Enter")

class CategoryForm(FlaskForm):
    category_group_source = QuerySelectField(query_factory=category_group_query, get_label="category_group", get_pk=get_pk)
    my_categ = StringField('My category name', [DataRequired()])
    submit = SubmitField("Enter")

新類別.html

{% extends "base.html" %} {% block content %}

<form method="post" action="#">
  {{ form.hidden_tag() }}
  <div class="form-group">
    {{ form.category_group_source.label(class="form-control-label") }} {{
    form.category_group_source(class="form-control") }}
  </div>
  <div class="form-group">
    {{ form.my_category.label(class="form-control-label") }} {{
    form.my_category(class="form-control") }}
  </div>
  {{ form.submit }}
</form>
{% endblock %}

我知道問題出在這里:mainrun.py 中的 category = MyCategory(cat_gr_id=forma.category_group_source.data.id, my_category_name= forma.my_categ.data ) 和 formsrun.py 中的query_factory

但無法解決此問題,請幫助解決此問題:)

看起來你升級到 SQLAlchemy 3 但你正在使用 SQLAlchemy 2 的 init 例程。

參見https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/api/

在 3.0 版更改:引擎是在調用 init_app 時創建的,而不是在第一次訪問時創建的。

您需要調用db.init_app(app)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM