繁体   English   中英

Flask-AttributeError:“ _ AppCtxGlobals”对象没有属性“ db”

[英]Flask - AttributeError: '_AppCtxGlobals' object has no attribute 'db'

我正在开发应用程序并做了注册页面,连接到数据库并添加了新用户。 使用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')]
    )

最后,如果有帮助,我如何制作数据库:

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_db是一个独立的函数,并返回连接本身。 因此,您的代码必须是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM