在我的表单中,我试图创建一个带有选择的自定义数组字段.
自定义表单字段:
class CustomField(Field):
widget = TextInput()
def _value(self):
if self.data:
return u', '.join(self.data)
else:
return u''
def process_formdata(self, valuelist):
if valuelist:
self.data = [x.strip() for x in valuelist[0].split(',')]
else:
self.data = []
Run Code Online (Sandbox Code Playgroud)
实际表单调用自定义表单字段
class PostForm(Form):
status = CustomField()
Run Code Online (Sandbox Code Playgroud)
每当我发布的数据PostForm,它调用自定义字段,但在任何不通过valuelist到process_formatdata.自定义字段始终返回空列表.
我在这里遗漏了什么.
我有一个包含姓名和图片的表格
MyForm的:
name = TextField(
u'name',
validators=[
validators.DataRequired(),
validators.Length(min=1, max=25)
]
)
pictures = FileField(
u'pictures',
validators=[
FileRequired(),
FileAllowed(['jpg', 'png'], 'Images only!')
]
)
Run Code Online (Sandbox Code Playgroud)
Jinja2模板:
{% from "_form_helpers.tpl" import render_field %}
<form method="post" action="" enctype="multipart/form-data">
<dl>
{{ render_field(form.name) }}
{{ render_field(form.pictures) }}
</dl>
<p>{{ form.submit }}
</form>
Run Code Online (Sandbox Code Playgroud)
我想在一个字段中上传一个或多个图片(多选).
这该怎么做?
谢谢..
我刚刚开始使用Flask进行编码,我想在我的应用程序中的小表单上设置CSRF.我正在关注此http://wtforms.readthedocs.org/en/2.0.2/csrf.html以进行基于会话的实施.我在网上浏览了一段时间以找到类似问题的解决方案,但我没有成功,如果这是一个重复的问题,请道歉.
这段代码的问题:
当我在虚拟环境中运行它时,我得到以下堆栈跟踪AttributeError: 'Request' object has no attribute 'POST'-
目标:在wtform实例上实现csrf
环境:wtf版本2.02,烧瓶0.10,venv与python 2.7
from flask import session, request
from flask.ext.wtf import Form
from wtforms import TextField, validators, SubmitField
from wtforms.validators import Required, Length
from wtforms.csrf.session import SessionCSRF
from datetime import timedelta
import config # my config file
# create super class
class MyForm(Form):
class Meta:
csrf = True
csrf_class = SessionCSRF
csrf_secret = config.secret_key
csrf_time_limit = timedelta(minutes=20)
@property
def csrf_context(self):
return request.session
# create a …Run Code Online (Sandbox Code Playgroud) 我可以使用WTForms和Flask向我的数据库添加一个新条目,我也可以编辑,问题是我需要以编辑形式显示数据库中已有的信息.
我有以下代码:
class editPostForm(Form):
postTitle = TextField('postTitle', validators.Required()])
postSubtitle = TextField('postSubtitle', validators.Required()])
Run Code Online (Sandbox Code Playgroud)
@app.route('/editpost/<postId>', methods = ['GET','POST'])
def editpost_page(postId):
try:
form = editPostForm(form)
if request.method == "POST" and form.validate():
postTitle = form.postTitle.data
postSubtitle = form.postSubtitle.data
c, conn = connection()
query = c.execute("SELECT * FROM posts WHERE post_id = (%s)",
[noinjection(postId)])
c.execute("UPDATE posts SET post_title=%s, post_subtitle=%s WHERE post_id = %s",
[
noinjection(postTitle),
noinjection(postSubtitle),
noinjection(postId)
])
conn.commit()
flash("Post Edited", 'success')
c.close()
conn.close()
gc.collect()
return redirect(url_for('posts'))
return render_template("editpost.html", form = form, POST_ID …Run Code Online (Sandbox Code Playgroud) 我正在使用wtforms我的帖子请求处理数据.一个特定的发布请求发送包括布尔值的各种数据.
我的表单看起来像这样:
class EditFileForm(Form):
title = StringField('title')
shared = BooleanField('shared')
fileID = IntegerField('fileID')
userID = IntegerField('userID')
Run Code Online (Sandbox Code Playgroud)
我可以看到,当我收到请求时,数据如下所示:
data = MultiDict(mapping=request.json)
print(data)
>>MultiDict([(u'shared', False), (u'title', u'File5'), (u'userID', 1), (u'fileID', 16)])
Run Code Online (Sandbox Code Playgroud)
您可以看到布尔字段为"false",并且打印原始数据也显示出来但是,当我打印实际的表单字段时,我得到了真实.
print(form.shared.raw_data)
[False]
print(form.shared.data)
True
Run Code Online (Sandbox Code Playgroud)
我读到WTForms可能不知道如何处理错误的布尔值.这样做的正确方法是什么?用一个IntegerField代替?
我有另一个表单,其中booleanfield正在处理来自postgres数据库的错误布尔值.
在我的项目中__init__.py我有这个:
app = Flask(__name__)
app.config.from_object('config')
CsrfProtect(app)
db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)
我的开发配置文件如下所示:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
DEBUG = True
WTF_CSRF_ENABLED = True
SECRET_KEY = 'supersecretkey'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'project.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
Run Code Online (Sandbox Code Playgroud)
在我的unittest setUp中我有这个:
from project import app, db
class ExampleTest(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
self.app = app.test_client()
db.create_all()
Run Code Online (Sandbox Code Playgroud)
理论上,在这里将WTF_CSRF_ENABLED设置为False应该可以防止单元测试的CSRF,但是如果我在单元测试时进行POST,我仍然会遇到CSRF错误.我认为这是因为我已经调用了CsrfProtect(app)而WTF_CSRF_ENABLED为True(当我导入app时,它被调用).如果我在配置文件中设置WTF_CSRF_ENABLED = False,它将按预期工作.
无论如何我可以在启用后禁用CSRF吗?或者我在这里咆哮错误的树?
当我尝试在Jinja2模板中从wtforms写入错误时,它将返回未解码的报价。我该如何解决?
{% if registrationForm.errors %}
<script>swal("Error!", "{{ registrationForm.errors['password'] }}", "error")</script>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
误差等于
{'email': ['This field is required.'], 'username': ['This field is required.'], 'acceptTOS': ['This field is required.'], 'csrf_token': ['CSRF token missing'], 'password': ['This field is required.']}
Run Code Online (Sandbox Code Playgroud) 我在使用WTF-Forms获取HTML5 Datepicker以在Flask中为表单提供值时遇到问题.如果我将HTML5 DateField删除到普通的旧vanilla WTF-Forms DateField,那么相同的表单将按预期工作.
对于好奇:版本:Python 3.5.2,Flask:0.11.1,Flask-WTF:0.12
相关代码将是:
模型:
class Order(db.Model):
__tablename__ = 'orders'
paid_date = db.Column(db.DateTime, nullable=True)
Run Code Online (Sandbox Code Playgroud)
表格不应该有所作为,但为了完整性,这里是order-update.html的片段:
<div class="form-group">
{{ form.paid_date.label }}
{% if form.paid_date.errors %}
{% for error in form.paid_date.errors %}
<p class="error-message">{{ error }}</p>
{% endfor %}
{% endif %}
{{ form.paid_date }}
</div>
Run Code Online (Sandbox Code Playgroud)
最小控制器:
@app.route('/orders/update/<int:order_number>', methods=['GET', 'POST'])
def update_order(order_number):
order = Order.query.get(order_number)
if request.method == 'POST':
if not form.validate():
return render_template('update-order.html', form=form, order=order)
else:
form.populate_obj(order)
db.session.commit()
return redirect(url_for('user')
elif request.method == 'GET':
return render_template('update-order.html', form=form, …Run Code Online (Sandbox Code Playgroud) 当给定的日期时间格式不正确时,我想收到自定义错误消息。
表格类:
class NewShift(Form):
start_date = DateTimeField(u'start-date', validators=[DataRequired("Start must be specified")], format='%d.%m.%Y %H.%M')
end_date = DateTimeField(u'end-date', validators=[DataRequired("End must be specified")], format='%d.%m.%Y %H.%M') # ...
Run Code Online (Sandbox Code Playgroud)
风景:
def new_shift():
form = NewShift(request.form)
if request.method == "POST":
if not form.validate():
print(form.errors)
return render_template("add_shift.html", form=form, success=False)
else:
return render_template("add_shift.html", form=form, success=True)
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果DateTimeField()包含不正确的日期时间格式,我会从函数中收到错误消息DataRequired()。如何针对这种情况指定自定义错误消息?
我开发了一个网络应用程序,其中包含用户登录和注册的功能。我已经按照文档和教程完成了所有操作,并且 Flask 服务器一切正常。
问题是:我使用gunicorn并启动一个Web服务器,(localhost:8000)在几种不同的浏览器(Linux上的Brave和Firefox,以及Android上的Brave)上打开地址,我只能从一个客户端登录(单个或多个不同的用户)。当我尝试从另一个请求执行此操作时,它会抛出 400 Bad Request(CSRF 会话令牌丢失或 CSRF 会话令牌不匹配)。
现在,使用 Flasks Server 时不会发生这种情况。它只发生在使用gunicorn时。
我已将应用程序部署到 Heroku(使用免费计划),并且我希望多个用户同时登录。我的应用程序拥有的所有其他表单都会发生这种情况。
所有环境变量、密钥均已正确配置,使用 Flask Server 时一切都按预期运行。除此以外,使用 Gunicorn 不会导致任何其他问题。有时,从单个客户端登录也不起作用。
任何帮助,将不胜感激。我已经查看了其他相关的线程/问题,但他们没有提到我遇到的问题
flask-wtforms ×10
flask ×8
python ×5
wtforms ×4
jinja2 ×2
python-3.x ×2
datepicker ×1
datetime ×1
forms ×1
gunicorn ×1
html5 ×1
json ×1