Python 烧瓶-属性错误:'_AppCtxGlobals&x27;对象没有属性';db';

Python 烧瓶-属性错误:'_AppCtxGlobals&x27;对象没有属性';db';,python,flask,Python,Flask,我正在开发应用程序并完成注册页面,连接到数据库并添加新用户。使用SQL而不是SQLalchemy。现在,当我按下寄存器时,出现了一个错误 在视图中注册路由: import sqlite3 from functools import wraps from flask import Flask, flash, redirect, render_template, request, session, url_for, g from forms import AddTaskForm, Regist

我正在开发应用程序并完成注册页面,连接到数据库并添加新用户。使用SQL而不是SQLalchemy。现在,当我按下寄存器时,出现了一个错误

在视图中注册路由:

import sqlite3

from functools import wraps

from flask import Flask, flash, redirect, render_template, request, session, url_for, g

from forms import AddTaskForm, RegisterForm, LoginForm

# Config
app = Flask(__name__)
app.config.from_object("_config")


# Helper functions
def connect_db():
    return sqlite3.connect(app.config["DATABASE_PATH"])

@app.route("/register/", methods=["GET", "POST"])
def register():
    form = RegisterForm(request.form)

    if request.method == "POST" and form.validate_on_submit():

        name = request.form["name"]
        email = request.form["email"]
        password = request.form["password"]

        g.db.connect_db()
        g.db.execute("INSERT INTO users(name, email, password) VALUES (?,?,?)", (name, email, password))
        g.db.commit()
        g.db.close()
    return render_template("register.html", form=form)
配置:

import os

#Grab the folder where this script lives
basedir = os.path.abspath(os.path.dirname(__file__))

DATABASE = "flasktaskr.db"
WTF_CSRF_ENABLED = True
SECRET_KEY = "sjfdoifj948uf98jf9349f2kjiu78z7823"

# Define the full path for the database
DATABASE_PATH = os.path.join(basedir, DATABASE)
我的WTForms登记表如下所示:

from flask_wtf import Form 
from wtforms import StringField, DateField, IntegerField, SelectField, PasswordField
from wtforms.validators import DataRequired, Length, EqualTo

class RegisterForm(Form):
    name = StringField(
        'Username',
        validators=[DataRequired(), Length(min=4, max=25)]
    )
    email = StringField(
        'Email',
        validators=[DataRequired(), Length(min=6, max=40)]
    )
    password = PasswordField(
        'Password',
        validators=[DataRequired(), Length(min=6, max=40)])
    confirm = PasswordField(
        'Repeat Password',
        validators=[DataRequired(), EqualTo('password', message='Passwords must match')]
    )
最后,我是如何制作db的,如果这有帮助的话:

import sqlite3

from _config import DATABASE_PATH

with sqlite3.connect(DATABASE_PATH) as connection:

    c = connection.cursor()

    c.execute("""CREATE TABLE tasks(task_id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL, notes TEXT NOT NULL, due_date TEXT NOT NULL, priority INTEGER NOT NULL,
        status INTEGER NOT NULL)""")

    c.execute("""CREATE TABLE users(id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL UNIQUE, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL)""")
我希望我发布了足够的代码来查找错误: 同样,我得到的错误是:

AttributeError: '_AppCtxGlobals' object has no attribute 'db'
这对我来说很奇怪,因为其他功能,比如登录和向数据库添加任务,都可以正常工作。 谢谢你的帮助


谢谢

您根本没有做任何事情将您的数据库连接与全局
g
对象相关联
connect\u db
是一个独立函数,返回连接本身。因此,您的代码需要:

db = connect_db()
db.execute("INSERT INTO users(name, email, password) VALUES (?,?,?)", (name, email, password))
db.commit()
db.close()

哦,我明白了。好吧,我遵循RealyptonFlask课程,它使用的是g.db,我一直使用到现在,没有问题,但老实说,我从来没有理解它为什么会出现在那里。谢谢当然再次感谢。