标签: flask-wtforms

在 SelectField 和 HiddenField 之间动态更改 WTForms 字段类型

我有一个 WTForms 字段(value_currency),我希望有时是 SelectField,有时是 HiddenField。我对创建新项目和编辑现有项目的页面使用相同的视图和模板。如果我加载页面来创建一个新项目,我希望这个字段是一个 SelectField,如果我加载页面来编辑一个现有项目,我希望这个字段是一个 HiddenField,因为它是一个不可编辑的字段。

这是我到目前为止所拥有的:

形式

class PromoForm(Form):
    value = StringField('value')
    currencies = Currency.query.order_by(Currency.id).all()
    currency_choices = []
    for currency in currencies:
        currency_choice = (currency.id, currency.name)
        currency_choices.append(currency_choice)
    value_currency = SelectField('value_currency', choices=currency_choices)
Run Code Online (Sandbox Code Playgroud)

看法

@app.route('/promo/<id>', methods=['GET', 'POST'])
@login_required
def promo(id):
    form = PromoForm()
    # Existing promo will pass in its id
    # id = 0 if a new promo is to be created
    if id != str(0):
        # Load existing promo
        promo = Promo.query.get(id)
        # display value in decimal format …
Run Code Online (Sandbox Code Playgroud)

python flask flask-wtforms

5
推荐指数
1
解决办法
2796
查看次数

Flask-Bootstrap Quick_form 认为从 render_template 传入的表单未定义

我正在尝试使用 Flask-Bootstrap 渲染 WTF 表单quick_formform但是,即使我将其传递给 ,我也会收到未定义的错误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)

python jinja2 flask flask-wtforms

5
推荐指数
1
解决办法
2215
查看次数

Flask WTForm CsrfProtect 与 Nginx/Gunicorn:推荐人检查失败 - 来源不匹配

我正在将 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)

python nginx csrf flask flask-wtforms

5
推荐指数
0
解决办法
1206
查看次数

Jinja、Flask 和 WTForms:如何在字段中传递参数?

我正在关注本教程http://flask.pocoo.org/docs/0.10/patterns/wtforms/

这是一个带有宏的 _formhelpers.html 模板示例:

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

这里的 register.html 模板利用了 _formhelpers.html 模板:

{% from "_formhelpers.html" import render_field %}
<form method=post action="/register">
  <dl>
    {{ render_field(form.username) }}
    {{ render_field(form.email) }}
    {{ render_field(form.password) }}
    {{ render_field(form.confirm) }}
    {{ render_field(form.accept_tos) }}
  </dl>
  <p><input type=submit value=Register>
</form>
Run Code Online (Sandbox Code Playgroud)

它最终生成了一个序列:

<dt><label for="email">Email Address</label> …
Run Code Online (Sandbox Code Playgroud)

python jinja2 flask wtforms flask-wtforms

5
推荐指数
1
解决办法
7270
查看次数

提交前验证 WTForm

是否可以在离开字段后提交之前验证 WTForm 字段?例如,输入用户名后,会验证该字段以查看其是否可用并显示复选标记,然后用户单击“提交”。

python jinja2 flask flask-wtforms

5
推荐指数
1
解决办法
2260
查看次数

在 Flask 中获取当前用户 ID

我对 Python 还是很陌生(老实说,一般来说,编程)。我目前正在制定一种待办事项清单,我需要它来将待办事项放入适当的课程中(这都与教育相关)。所以,问题很简单。我将此作为 Flask 驱动的路线:

@app.route('/add_course', methods=('GET', 'POST'))
@login_required
def course():
    form = forms.CourseForm()
    if form.validate_on_submit():
        models.Course.create(teacher=g.user._get_current_object(),
                             name=form.name.data.strip(),
                             difficulty=form.level.data.strip(),
                             description=form.description.data.strip())
        flash("Course successfully created!", "success")
        return redirect(url_for('index'))
    return render_template('add_course.html', form=form)
Run Code Online (Sandbox Code Playgroud)

然后我把这个放在forms.py. 你可以看到我用聪明的标记来表明我的问题在哪里。它说THE_PROBLEM

def courses():
    try:
        courses = models.Course.select(models.Course.id,
                                   models.Course.name,
                                   models.Course.difficulty).where(THE_PROBLEM)
        course_list = []
        for course in courses:
            course_list.append((str(course.id), course.name + ' - ' + course.difficulty.title()))
        return course_list
    except models.DoesNotExist:
        return [('', 'No courses')]


class ToDoForm(FlaskForm):
    name = StringField("What's up?", validators=[
    DataRequired()
    ])
    due_date = DateTimeField('When?', format='%Y-%m-%d %H-%M')
    course …
Run Code Online (Sandbox Code Playgroud)

python flask flask-login flask-wtforms

5
推荐指数
1
解决办法
7169
查看次数

Flask-wtform 大小写敏感问题

我有一个带有用户登录系统的烧瓶应用程序。我现在注意到一些与用于注册和登录网站的电子邮件地址区分大小写相关的问题。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 flask-sqlalchemy flask-wtforms

5
推荐指数
1
解决办法
1727
查看次数

使用gunicorn和Flask时出现CSRF令牌错误

我开发了一个网络应用程序,其中包含用户登录和注册的功能。我已经按照文档和教程完成了所有操作,并且 Flask 服务器一切正常。

问题是:我使用gunicorn并启动一个Web服务器,(localhost:8000)在几种不同的浏览器(Linux上的Brave和Firefox,以及Android上的Brave)上打开地址,我只能从一个客户端登录(单个或多个不同的用户)。当我尝试从另一个请求执行此操作时,它会抛出 400 Bad Request(CSRF 会话令牌丢失或 CSRF 会话令牌不匹配)。

现在,使用 Flasks Server 时不会发生这种情况。它只发生在使用gunicorn时。

我已将应用程序部署到 Heroku(使用免费计划),并且我希望多个用户同时登录。我的应用程序拥有的所有其他表单都会发生这种情况。

所有环境变量、密钥均已正确配置,使用 Flask Server 时一切都按预期运行。除此以外,使用 Gunicorn 不会导致任何其他问题。有时,从单个客户端登录也不起作用。

任何帮助,将不胜感激。我已经查看了其他相关的线程/问题,但他们没有提到我遇到的问题

flask gunicorn flask-wtforms

5
推荐指数
1
解决办法
1006
查看次数

如何使用 Flask-Marshmallow 处理文件上传验证?

我工作Flask-Marshmallow了验证request,并response在架构Flask app。我能为做简单的验证request.formrequest.args当有简单的领域,如IntStrFloat等。

我有一个案例,我需要使用表单字段上传文件 - file_field。它应该包含文件内容。

如何验证此字段是否存在以及文件格式是什么等。

是否有任何这样的领域Marshmallow,我可以使用喜欢fields.Int()fields.Str()

我已经浏览了此处的文档但没有找到任何此类字段。

python forms flask flask-wtforms flask-marshmallow

5
推荐指数
1
解决办法
1320
查看次数

WTForms 2.3.0 重大更改 - ImportError:无法从“wtforms.widgets”导入名称“HTMLString”

WTForms已更新为2.3.0具有重大更改。我尝试过调整其他要求,例如werkzeug.1.0.0但还没有成功。有人找到解决办法了吗?

这是堆栈跟踪:

Traceback (most recent call last):
   File "/usr/local/bin/celery", line 8, in <module>
     sys.exit(main())
   File "/usr/local/lib/python3.8/site-packages/celery/__main__.py", line 16, in main
     _main()
   File "/usr/local/lib/python3.8/site-packages/celery/bin/celery.py", line 322, in main
     cmd.execute_from_commandline(argv)
   File "/usr/local/lib/python3.8/site-packages/celery/bin/celery.py", line 495, in execute_from_commandline
     super(CeleryCommand, self).execute_from_commandline(argv)))
   File "/usr/local/lib/python3.8/site-packages/celery/bin/base.py", line 289, in execute_from_commandline
     argv = self.setup_app_from_commandline(argv)
   File "/usr/local/lib/python3.8/site-packages/celery/bin/base.py", line 509, in setup_app_from_commandline
     self.app = self.find_app(app)
   File "/usr/local/lib/python3.8/site-packages/celery/bin/base.py", line 531, in find_app
     return find_app(app, symbol_by_name=self.symbol_by_name)
   File "/usr/local/lib/python3.8/site-packages/celery/app/utils.py", line 373, in find_app
     sym = symbol_by_name(app, imp=imp)
   File "/usr/local/lib/python3.8/site-packages/celery/bin/base.py", …
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-wtforms

5
推荐指数
1
解决办法
3564
查看次数