flask框架下数据库models不能注册到应用(app)

在使用Flask框架时,遇到数据库models无法注册到应用的问题,表现为运行程序后,模型对应的数据库表未生成。经过调试发现,原先在__init__.py中创建app并在models.py中导入并初始化db的方式无效。解决方法是将db的创建移到models.py中,然后在__init__.py中导入db并使用db.init_app(app)进行初始化,这样能成功创建数据库表。
摘要由CSDN通过智能技术生成

1.问题

使用flask创建数据模型后,运行程序,发现没有生成模型对应的数据库表

2.分析

经过多次测试以及调试,发现程序没有执行创建数据库表的操作

3.解决

第一开始的实现为在__init__.py文件下创建app,然后在models.py文件中,import app,创建db的时候,传入app参数,执行多次,发现此方法没有作用,没有执行创建数据库表的操作:

__init__.py文件:

models.py文件:

 

修改后的方式为在models.py中创建db,然后在__init__.py文件中import db,然后使用db.init_app(app)方法,实验证明此方法有效

__init__.py文件:

models.py文件如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Flask框架数据库的带有用户登陆注册功能的Web应用示例: 1. 创建虚拟环境并安装必要的依赖,比如FlaskFlask-WTF、Flask-Login和Flask-SQLAlchemy: ``` $ python3 -m venv myappenv $ source myappenv/bin/activate $ pip install flask flask-wtf flask-login flask-sqlalchemy ``` 2. 创建一个app.py文件,并设置数据库连接和应用配置,比如密钥和数据库URI: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager app = Flask(__name__) app.config['SECRET_KEY'] = 'the secret key' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myapp.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) login_manager = LoginManager(app) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) password = db.Column(db.String(60), nullable=False) def __repr__(self): return f"User('{self.username}', '{self.email}')" if __name__ == '__main__': app.run(debug=True) ``` 3. 创建一个forms.py文件,并定义注册和登陆表单: ```python from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError from models import User class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)]) email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Sign Up') def validate_username(self, username): user = User.query.filter_by(username=username.data).first() if user: raise ValidationError('That username is taken. Please choose a different one.') def validate_email(self, email): user = User.query.filter_by(email=email.data).first() if user: raise ValidationError('That email is taken. Please choose a different one.') class LoginForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) remember = BooleanField('Remember Me') submit = SubmitField('Login') ``` 4. 创建一个routes.py文件,并定义注册和登陆路由: ```python from flask import render_template, redirect, url_for, flash from flask_login import login_user, logout_user, current_user from app import app, db from forms import RegistrationForm, LoginForm from models import User @app.route('/') def home(): return render_template('home.html') @app.route('/register', methods=['GET', 'POST']) def register(): if current_user.is_authenticated: return redirect(url_for('home')) form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data, password=form.password.data) db.session.add(user) db.session.commit() flash('Your account has been created! You are now able to log in', 'success') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form) @app.route('/login', methods=['GET', 'POST']) def login(): if current_user.is_authenticated: return redirect(url_for('home')) form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email=form.email.data).first() if user and user.password == form.password.data: login_user(user, remember=form.remember.data) return redirect(url_for('home')) else: flash('Login unsuccessful. Please check email and password', 'danger') return render_template('login.html', title='Login', form=form) @app.route('/logout') def logout(): logout_user() return redirect(url_for('home')) ``` 5. 创建html模板文件home.html、register.html和login.html,并使用Jinja2模板语言渲染表单和用户信息。 6. 运行应用并通过localhost:5000浏览器访问应用,在注册和登陆页面进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值