📅  最后修改于: 2023-12-03 15:15:05.870000             🧑  作者: Mango
Flask-WTF 是一个用于表单处理的 Flask 扩展,它可以轻松地集成 WTForms 表单库并提供 CSRF 保护。
在 Flask 中,从数据库中选择字段可能是一个常见的任务。Flask-WTF 提供了一个 QuerySelectField
字段类型,允许从数据库中选择一个查询结果集。该字段类型的定义如下:
class QuerySelectField(SelectFieldBase):
"""
A SelectField that allows you to lazily (efficiently) populate the\
choices for the field from a database.
"""
def __init__(self, label=None, validators=None, query=None, get_label=None,
allow_blank=False, blank_text='', **kwargs):
"""
`label` is the label for the field. Use either this or `description`.
`validators` is a list of validators to call when `validate` is called.
They are called in the order they are provided.
`query` is the query that's executed for the available options.
`get_label` is a callable that returns the text to show for each option;
it's passed the model object passed to the constructor.
`allow_blank` determines if an empty value is added to the list
of available options.
`blank_text` is the text to show for the empty value if `allow_blank`
is True. By default, this is an empty string.
"""
super(QuerySelectField, self).__init__(label, validators, **kwargs)
self.query = query
self.get_label = get_label
self.allow_blank = allow_blank
self.blank_text = blank_text
其中,query
参数是一个查询结果集,get_label
参数是一个返回该字段选项的文本值的函数。
接下来,我们将演示如何从数据库中选择一个文件,该文件存储在 SQLite 数据库中。首先,我们需要安装所需的依赖项:
$ pip install Flask Flask-WTF SQLAlchemy
然后,我们可以创建一个简单的 SQLite 数据库并添加文件记录:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.ext.sqlalchemy.fields import QuerySelectField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.sqlite'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'mysecret'
db = SQLAlchemy(app)
class File(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
@app.route('/', methods=['GET', 'POST'])
def index():
class FileSelectForm(FlaskForm):
file = QuerySelectField('File', query=File.query, allow_blank=True)
form = FileSelectForm()
if form.validate_on_submit():
return 'Selected file: {}'.format(form.file.data.name)
return form.as_p()
if __name__ == '__main__':
app.run(debug=True)
这里我们定义了一个 File
类,该类使用 SQLAlchemy 进行映射。我们还定义了一个 FileSelectForm
类,该类包含一个 QuerySelectField
字段,它从数据库中选择文件记录。如果用户提交表单,则在服务器上打印所选文件的名称。最后,我们使用 Flask 的 as_p
方法将表单呈现为 HTML。
现在,我们可以运行该应用程序并访问 http://localhost:5000/
来尝试选择一个文件。如果我们将鼠标悬停在选择框上,我们可以看到它包含名为 “File 1” 和 “File 2” 的两个文件选项:
在提交表单后,我们将看到所选文件的名称:
$ flask run
...
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
...
$ curl -XPOST -F'file=1' http://localhost:5000/
Selected file: File 1
这就是 Flask-WTF 从数据库中选择字段的基础知识。使用 QuerySelectField
和 SQLAlchemy,您可以轻松地从 Flask 应用程序中的数据库中选择结果集。