sqlalchemy.exc.InterfaceError: <unprintable InterfaceError object>我正在尝试 Flask,但在提交 wtforms 时遇到错误。模型类是:
class Post(db.Model):
__tablename__ = 'blog_posts'
id = db.Column(db.Integer, unique=True, primary_key=True)
title = db.Column(db.String(50), unique=False)
content = db.Column(db.Text, unique=False)
user_id = db.Column(db.String, db.ForeignKey('users.username'))
@staticmethod
def post_new_entry(title, content, user_id):
""" Post new entry to database """
new_post = Post(title=title, content=content, user_id=user_id)
db.session.add(new_post)
db.session.commit()
return new_post
def __repr__(self):
return 'PostID {}: {} by {}'.format(self.id, self.title, self.user_id)
Run Code Online (Sandbox Code Playgroud)
对于我的表格,我有以下内容:
class PostForm(Form):
title = StringField('Title', validators=[DataRequired(), Length(10, 65)])
post_content = TextAreaField('Content', validators=[DataRequired(), Length(50, 500)])
submit = SubmitField('Publish Post') …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Flask-Bootstrap 渲染 WTF 表单quick_form。form但是,即使我将其传递给 ,我也会收到未定义的错误render_template。为什么这不起作用?
File "/home/eron/anaconda/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/wtf.html", line 190, in template
{{ form.hidden_tag() }}
File "/home/eron/anaconda/lib/python2.7/site-packages/jinja2/environment.py", line 397, in getattr
return getattr(obj, attribute)
UndefinedError: 'form' is undefined
Run Code Online (Sandbox Code Playgroud)
from flask.ext.wtf import Form
class NameForm(Form):
name = StringField('Login', validators=[Required()])
submit = SubmitField('Submit')
@app.route('/base', methods=['GET','POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
session['name'] = form.name.data
return redirect(url_for('base'))
return render_template('base.html', form=form)
Run Code Online (Sandbox Code Playgroud)
File "/home/eron/anaconda/lib/python2.7/site-packages/flask_bootstrap/templates/bootstrap/wtf.html", line 190, in template
{{ form.hidden_tag() }}
File …Run Code Online (Sandbox Code Playgroud) 我正在将 Django 应用程序移植到 Flask,但在最后一步中遇到了此错误:将其配置为在 nginx/gunicorn 后面运行。在 Django 中,这会引发类似的错误消息。要消除 Django 中的此错误,您只需添加ALLOWED_HOSTS到设置中,但我在 Flask_wtf.csrf 的源代码中找不到任何类似的内容
当我填写POST表格并提交时,它失败并显示Bad Request Referrer checking failed - origin does not match.。
flask_wtf.csrf.CsrfProtect 谷歌搜索该字符串,我找到了here的源代码。这是referrer针对进行检查host。自己手动执行该代码,我可以看到它将我的 nginx 的主机:端口与我的 Gunicorn 的主机:端口进行比较,并且它失败了,因为我的 Gunicorn 端口与 nginx 位于不同的端口上。
这是该文件中的相关源代码,其中有我的注释作为注释
# Presumably, good_referrer is Gunicorn, request.referrer is Nginx
# In Django's csrf source code, there is a list of ALLOWED_HOSTS to check against, instead
def protect(self):
#...
# If I change WTF_CSRF_SSL_STRICT to false, it doesn't …Run Code Online (Sandbox Code Playgroud) 是否可以在离开字段后提交之前验证 WTForm 字段?例如,输入用户名后,会验证该字段以查看其是否可用并显示复选标记,然后用户单击“提交”。
当给定的日期时间格式不正确时,我想收到自定义错误消息。
表格类:
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-wtforms创建一个文本区域。
body = TextAreaField('body')
Run Code Online (Sandbox Code Playgroud)
我想更改文本区域的值,您可以像这样在 html 中执行此操作。
<textarea>other value then default</textarea>
Run Code Online (Sandbox Code Playgroud)
如何将其与 Flask-wtforms 集成?
我的模板如下所示:
{{ form.body(rows="20") }} <!--texarea -->
Run Code Online (Sandbox Code Playgroud)
通过一个简单的输入字段,我可以做这样的事情:
{{ form.body(value="other value then default") }} <!-- input field -->
Run Code Online (Sandbox Code Playgroud)
我需要在模板本身中设置默认值。因为它将包含该页面所涉及的文章的信息。
csv.DictReader我目前正在尝试读取通过 Flask-WTF(orms) 提供的 CSV 文件,并且在尝试通过or加载它时仍然遇到问题pandas。
该文件(一个FileStorage对象)实际上并未上传到任何地方,我正在尝试获取 CSV 中的数据以在我的代码中使用。
这就是我现在尝试使用的方式来获取它pandas
f = form.upload.data
data = pandas.read_csv(f.stream)
logger.debug(data)
Run Code Online (Sandbox Code Playgroud)
然而这返回了错误pandas.errors.EmptyDataError: No columns to parse from file
当我尝试通过这种方式抓住它时csv.reader:
reader = csv.reader(f.read(), delimeter=',')
for row in reader:
logger.debug(row)
Run Code Online (Sandbox Code Playgroud)
我得到了这个错误:_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
我在尝试时csv.DictReader也收到了类似的错误。
有没有人尝试过做类似的事情,或者知道这是否可以在不上传文件的情况下实现?我环顾四周,但似乎找不到合适的解决方案。
作为参考,我的 CSV 文件有一个非常基本的格式:
C1,C2
Data,Data
Run Code Online (Sandbox Code Playgroud)
谢谢!
使用 Flask-wtf 时应该如何实现日期选择器?
已尝试使用网络上的各种示例,但似乎没有一个起作用。
请参阅代码以了解最新尝试。
from flask import Flask, render_template, session, redirect, url_for, flash
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_wtf import FlaskForm, Form
from wtforms.fields.html5 import DateField
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
from wtforms.fields import DateField
from flask_datepicker import datepicker
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
bootstrap = Bootstrap(app)
moment = Moment(app)
class LoginForm(FlaskForm):
entrydate = DateField('entrydate')
submit = SubmitField('Submit')
@app.route('/date', methods=['GET', 'POST'])
def datep():
form = LoginForm()
if …Run Code Online (Sandbox Code Playgroud) 我有一个带有用户登录系统的烧瓶应用程序。我现在注意到一些与用于注册和登录网站的电子邮件地址区分大小写相关的问题。TL;DR 问题:如何使用 Flask 表单的小写字母来评估用户是否存在于我的数据库中?
例子
假设用户 John Smith 在该网站上注册了一个帐户。他使用 John.Smith@gmail.com 进行注册,然后使用 John.smith@gmail.com 进行登录。截至目前,该网站将把他们视为两个不同的用户。我希望这被视为同一用户。
在Python(我的强项)中,我只需获取str(form.email.data).lower()注册表单,然后将其写入数据库中的用户表。然后当有人尝试登录时我会做同样的事情。换句话说,我总是会考虑使用小写字母进行注册和登录。
但我很难在 Jinja 中实现这一点,尽管它与 Python 相似。
register.html 的电子邮件部分:
<div class="form-group">
{{ form.email.label(class="form-control-label") }}
{% if form.email.errors %}
{{ form.email(class="form-control form-control-lg is-invalid") }}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{ form.email(class="form-control form-control-lg") }}
{% endif %}
</div>
Run Code Online (Sandbox Code Playgroud)
routes.py中的注册代码:
@app.route("/register", methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('home'))
form = RegistrationForm()
admins = ['admin@admin.com', …Run Code Online (Sandbox Code Playgroud) 我开发了一个网络应用程序,其中包含用户登录和注册的功能。我已经按照文档和教程完成了所有操作,并且 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 ×9
python ×6
python-3.x ×3
jinja2 ×2
csrf ×1
csv ×1
datetime ×1
forms ×1
gunicorn ×1
html ×1
nginx ×1
python-2.7 ×1
wtforms ×1