Flask-WTF's documentation states that:
Flask-WTF provides you a FileField to handle file uploading, it will automatically draw data from flask.request.files if the form is posted. The data attribute of FileField will be an instance of Werkzeug FileStorage.
但是,当我使用时FileField,data发布后的属性不是FileStorage对象.相反,它是None(如果我enctype="multipart/form-data"按照文档中的建议定义我的表单)或文件名作为字符串(如果我没有定义enctype).
这是相关的Jinja2模板:
{% from "_form.html" import render_field %}
{% block body %}
<section class="page-width-container" id="offset-content">
<div id="utility-box">
<h1 class="utility-header">Settings</h1>
{{ message }}
<form action="/settings" method="post" enctype="multipart/form-data">
{{ render_field(form.photo) }}
<input type="submit" …Run Code Online (Sandbox Code Playgroud) 我有一个带有TextField,FileField的表单,我想添加一个RadioField.
我想要一个有两个选项的无线电领域,用户只能选择一个.我正在关注前两个有效的形式示例.
我的forms.py看起来像这样
from flask import Flask, request
from werkzeug import secure_filename
from flask.ext.wtf import Form, TextField, BooleanField, FileField, file_required, RadioField
from flask.ext.wtf import Required
class ImageForm(Form):
name = TextField('name', validators = [Required()])
fileName = FileField('fileName', validators=[file_required()])
certification = RadioField('certification', choices = ['option1', 'option2'])
Run Code Online (Sandbox Code Playgroud)
在我的views.py文件中
form = myForm()
if form.validate_on_submit():
name = form.name.data
fileName = secure_filename(form.fileName.file.filename)
certification = form.certification.data
Run Code Online (Sandbox Code Playgroud)
在我的.html文件中
{% block content %}
<h1>Simple Form</h1>
<form action="" method="post" name="simple" enctype="multipart/form-data">
{{form.hidden_tag()}}
<p>
Name:
{{form.name(size=80)}}
</p>
<p>
Upload a file …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用烧瓶形式填充sqlalchemy请求结果的选择字段.
这是代码:
def possible_book():
return Book.query.with_entities(Book.id).all()
class AuthorForm(Form):
familyname = TextField('familyname', [validators.Required()])
firstname = TextField('firstname', [validators.Required()])
book_list = QuerySelectField('book_list',query_factory=possible_book,get_label='title',allow_blank=True)
Run Code Online (Sandbox Code Playgroud)
这是模板:
<form action="" method="post" name="edit_author" enctype="multipart/form-data">
{{form.hidden_tag()}}
<p>Veuillez donner son prénom (obligatoire) : {{form.firstname(value=author.firstname)}}</p>
<p>Nom de famille (obligatoire) : {{form.familyname(value=author.familyname)}}</p>
<p>Livre : {{form.book_list}}</p>
<p><input type="submit" value="Envoyer"></p>
</form>
Run Code Online (Sandbox Code Playgroud)
查看:
@app.route('/edit_author/<number>', methods = ['GET', 'POST'])
def edit_author(number):
if number == 'new':
author = []
else:
author = Author.query.filter_by(id = number).first()
form = AuthorForm()
if form.validate_on_submit():
a = Author(firstname= form.firstname.data, familyname= form.familyname.data)
a.books = …Run Code Online (Sandbox Code Playgroud) 我正在使用普通烧瓶网+烧瓶 - 安静.所以我需要针对Web的CSRF保护,而不是REST.
那一刻我让CsrfProtect(app)的flask-wtf,我所有的职位单元测试flask-restful返回400.
有没有办法为REST服务禁用CSRF保护,因为它们来自移动手机,无论如何都没有会话处理,因此CSRF没有多大意义.
这是我测试它的方式:
rv = self.client.post('api/v1.0/verify-email', environ_base={'REMOTE_ADDR': '127.0.0.1'}, headers={'Content-Type':'application/json'}, data=json.dumps(data))
self.check_content_type(rv.headers)
eq_(rv.status_code, 412)
Run Code Online (Sandbox Code Playgroud) 我有一个webapp,允许用户创建自己的字段,以便稍后在表单中呈现.
我有一个模型Formfield如下:
class Formfield(db.Model):
id = db.Column(db.Integer, primary_key = True)
form_id = db.Column(db.Integer, db.ForeignKey('formbooking.id'))
label = db.Column(db.String(80))
placeholder_text = db.Column(db.String(80))
help_text = db.Column(db.String(500))
box_checked = db.Column(db.Boolean, nullable = True, default = False)
options = db.Column(db.String) # JSON goes here?
answer = db.Column(db.String)
required = db.Column(db.Boolean, nullable = False, default = False)
order = db.Column(db.Integer)
fieldtype = db.Column(db.Integer)
Run Code Online (Sandbox Code Playgroud)
我用来表示一个字段,无论种类如何(复选框,输入,以后更多).
如您所见,每个字段都有一个Form_id的FK.
我正在尝试为给定的form_id生成动态表单.问题是我需要确定要为每个Formfield呈现的字段类型.所以我还需要在某个时候处理字段类型.
我想解决方案是以某种方式将form_id传递给我的Form类中的函数.
我不知道如何做到这一点或在哪里寻找解决方案.
任何帮助将非常感谢!
据我所知,Flask应该创建一个线程和第二个线程来运行它,但我看到的是总是有两个进程,而不是线程,正在运行.即使是最简单的应用程序.
from flask import Flask
from flask import render_template, request, flash, session, redirect
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
app.run(host="192.168.21.73", port=5000, debug=True)
Run Code Online (Sandbox Code Playgroud)
您可以看到两个进程正在运行:
ps -x
5026 ttyO0 S+ 0:01 /usr/bin/python ./test_flask.py
5031 ttyO0 Sl+ 0:45 /usr/bin/python ./test_flask.py
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我正在使用Flask开发Web应用程序.我原来是手动编写HTML表单,然后切换到使用WTForms(这是一个教育项目,所以我展示了构建项目的每一步).
尝试添加HTML5表单字段时,我有点困惑,比如EmailField.我搜索了WTForms文档,并在线搜索,我无法找到如何使用HTML5 EmailField创建WTForm.
然后我安装了这个模块https://pypi.python.org/pypi/wtforms-html5,允许它,一切正常.但是我对添加额外的依赖感到不满意,特别是因为它似乎没有积极开发(https://github.com/brutus/wtforms-html5).
然后我结束了WTForms github页面,发现实际上支持所有新的HTML5字段,但默认情况下不会导入这些字段.https://github.com/wtforms/wtforms/blob/master/wtforms/fields/html5.py因此,而不是使用
from WTForms import EmailField
Run Code Online (Sandbox Code Playgroud)
正如人们所推断的那样
from WTForms import TextField
Run Code Online (Sandbox Code Playgroud)
一个人必须使用
from wtforms.fields.html5 import EmailField
Run Code Online (Sandbox Code Playgroud)
我以前使用wtforms-html5模块如下
from wtforms_html5 import EmailField
Run Code Online (Sandbox Code Playgroud)
因此,我更改了所有出现的内容wtforms_html5,wtforms.fields.html5并且我的应用程序完全按预期工作.
好的,感谢您阅读所有背景资料.现在提问:
为什么WTForms文档中没有提到任何html5字段(EmailField,DateField等)?
为什么这些字段默认情况下不会像其他字段一样导入WTForms
这些字段是否稳定/打算使用?
从WTForms导入字段的最佳做法是什么?
对于Text字段,我可以使用以下任何一种方法:
from wtforms import TextField
from wtforms.fields import TextField
from wtforms.fields.simple import TextField
Run Code Online (Sandbox Code Playgroud)
但对于EmailField,我必须使用
from wtforms.fields.html5 import EmailField
Run Code Online (Sandbox Code Playgroud)
我想要:
from wtforms.fields import TextField
from wtforms.fields import EmailField
Run Code Online (Sandbox Code Playgroud)
但是这需要在fields [__init__][1]文件中添加一行,我不愿意这样做,因为它是一个教育项目,这只会让学习者感到困惑.
我在寻找
我有一个字段,用户要求输入一年.我的HTML看起来像这样
<div class="form-group {% if form_search2.year_search.errors %} error {% endif %}" style="padding: 0px;">
<label class="col-xs-3 col-sm-2 control-label">{{ form_search2.year_search.label }}</label>
<div class="col-xs-6" style="max-width:320px;display: inline;">
{{ form_search2.year_search(class='form-control', style="max-width: 300px;", placeholder="e.g. 1996-2001", autocomplete="on", type="text") }}
</div>
<div class="col-xs-3" style="display: inline;">
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
形式定义为
year_search = TextField("Year:")
Run Code Online (Sandbox Code Playgroud)
当我在浏览器(Chrome)中查看此表单时,我收到了消息
Automatic credit card filling is disabled because this form does not use a secure connection
Run Code Online (Sandbox Code Playgroud)
我怎么能摆脱这个?我有其他字段,这些字段在相同的原因中定义,但它们记住之前输入的内容,并通过建议旧输入来帮助用户.
我需要做一个自定义验证WTForms当输入为:数量:数量 -例如,2:1
match1 = StringField('Russia-Saudi Arabia', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是-如何创建这种验证器?
我已经查看了http://wtforms.readthedocs.io/en/latest/validators.html上的文档,但是在这种情况下(对我来说)不是很有帮助。
提前致谢
我正在尝试找出一种方法来检查是否有任何内置 Form 方法会在表单已在Flask/WTForms中修改时返回 true
我知道在Django Forms中,我们可以灵活地使用form.has_changed()完全符合我要求的方法。
我正在尝试检查表单是否已被修改,如果是,我会进行一些数据库更新。
如果有人有任何想法,请让我知道这一点或建议正确的开始方法。
flask-wtforms ×10
flask ×9
python ×9
wtforms ×4
python-2.7 ×2
forms ×1
html ×1
html5 ×1
rest ×1
sqlalchemy ×1
validation ×1