在 SQLAlchemy 中将列与表绑定

问题描述 投票:0回答:1

我一直在尝试使用 Flask 构建一个网页。我目前在登录表单上:

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.app_context().push()
app.secret_key = 'hello'
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///users.sqlite3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False

db = SQLAlchemy(app)
counter = 1

class users(db.Model):
   id = db.Column('id',db.Integer,primary_key=True)
   name = db.Column('name',db.String(100))
   password = db.Column('password',db.String(100))
   role = db.Column('role',db.String(100))

   def __init__(self,id:int,name:str,password:str,role:str):
      self.name = name
      self.password = password
      self.id = counter
      self.role = role

usr = users(0,'Samantha (Root) Groves','password','Grey-hat')
db.session.add(usr)

@app.route('/',methods=['POST','GET'])
def frontPage():
   if request.method=='POST':
      user = request.form['Username']
      password = request.form['Password']
      found_user = users.query.filter_by(name=user,password=password).first()

      #if found_user:
         #return 'Hello',found_user['name']

      return "Hi"
   else:
      return render_template('mywebsite.html')

这是我的 HTML 网页:

<html>
<style>
  button {
    font-family: Verdana, Geneva, Tahoma, sans-serif;
    font-size: medium;
    color: black;
    background-color: aliceblue;
    border-style: hidden;
    shape-outside: border-box;
    cursor: default;
    height: 36px;
    width: 144px;
    border-radius: 9px;
    top: 500px;
    left: 680px;
    position: absolute;
  }
  
  button:hover {
    background-color: orangered;
  }
</style>

<head>
  <title>Sign in/Sign up</title>
</head>

<body background="backColorWebsite.png">
  <form action="#" method="post">
    <label id="UsernameLabel" style="font-family: Verdana, Geneva, Tahoma, sans-serif; background-color: aliceblue;position:absolute; top: 250px;left:600px; width: 144px; height: 18px; border-radius:9px; text-align: center; font-size: medium; ">Username:</label>
    <input type="text" name="Username" style="font-family:Verdana, Geneva, Tahoma, sans-serif; background-color: aliceblue; position: absolute; top:250px;left:760px; width:144px; height:27px; border-radius: 9px;" maxlength="10"></input>
    <label id="PasswordLabel" style="font-family: Verdana, Geneva, Tahoma, sans-serif; background-color: aliceblue;position:absolute; top: 350px;left:600px; width: 144px; height: 18px; border-radius:9px; text-align: center; font-size: medium;">Password:</label>
    <input type="password" name="Password" style="font-family:Verdana, Geneva, Tahoma, sans-serif; background-color: aliceblue; position: absolute; top:350px;left:760px; width:144px; height:27px; border-radius: 9px;"></input>
    <button value="submit">Sign in</button>
  </form>
</body>

</html>

当我在 cmd 上运行它时,它会打印出以下错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users
[SQL: SELECT users.id AS users_id, users.name AS users_name, users.password AS users_password, users.role AS users_role
FROM users
WHERE users.name = ? AND users.password = ?
 LIMIT ? OFFSET ?]
[parameters: ('', '', 1, 0)]
(Background on this error at: https://sqlalche.me/e/20/e3q8)
127.0.0.1 - - [17/Nov/2023 01:36:40] "POST / HTTP/1.1" 500 -

很明显没有与列关联的表,但是我们如何将表绑定到列?

db.create_all()
方法将其绑定到一个键,除此之外我没有看到可以提供我想要的功能的函数。

db.Table
但我正在关注以 this 开头的一系列视频,但它 说不需要你,所以我有点困惑。

python flask flask-sqlalchemy web-testing python-webbrowser
1个回答
0
投票

查看 Flask-SQLAlchemy 文档,了解创建表

定义完所有模型和表后,调用SQLAlchemy.create_all()在数据库中创建表模式。这需要应用程序上下文。由于您此时尚未收到请求,因此请手动创建一个请求。

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

如果您在其他模块中定义模型,则必须在调用create_all之前导入它们,否则SQLAlchemy将不知道它们。

因此您将需要执行

db.create_all()
来创建表用户。

© www.soinside.com 2019 - 2024. All rights reserved.