我正在使用flask_login登录并注销应用程序,但重定向回到上一页似乎不起作用.我使用flask.views和login_required作为需要用户登录的视图的装饰器.但是,当我尝试访问需要登录的/ path时,它会重定向到/ login而不是/ login?next =/path这意味着request.get.args("next")是None.
我在我的蓝图中使用登录需要的烧瓶视图,如下所示:
from flask import Blueprint, render_template, request, redirect, url_for
from flask.views import MethodView
from models import Post
from flask.ext.mongoengine.wtf import model_form
from flask.ext.login import login_required
posts_app = Blueprint('posts_app', __name__, template_folder='templates', static_folder='static', static_url_path='/static')
class ListView(MethodView):
decorators = [login_required]
def get(self):
posts = Post.objects.all()
print posts
return render_template('posts/list.html', posts=posts)
posts_app.add_url_rule('/', view_func=ListView.as_view('list'))
Run Code Online (Sandbox Code Playgroud)
在一个单独的蓝图中,我正在实现身份验证:
from flask import Blueprint, render_template, request, current_app, flash, redirect, url_for
from forms import LoginForm, RegisterForm, ForgotForm
from libs.User import User
from flask.ext.login import login_user, login_required, …Run Code Online (Sandbox Code Playgroud) 如何手动填写表格然后进行验证?
class TestForm(Form):
name = StringField('name', validators=[InputRequired()])
age = IntegerField('age', validators=[InputRequired()])
Run Code Online (Sandbox Code Playgroud)
我尝试使用任意数据构建表单并验证:
data = {'name': 'bob', 'age': 33}
tform = TestForm(name=data['name'], age=data['age'])
if tform.validate():
print 'success!'
else:
print tform.errors
Run Code Online (Sandbox Code Playgroud)
结果打印出错误:
{'age': [u'This field is required.']}
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为name即使我将他们都提供给了我的朋友,也没有抱怨TestForm。我究竟做错了什么?
我正在尝试为烧瓶wtforms中的字符串字段设置默认值。以下是我的代码,它不起作用。
码:
from flask.ext.wtf import Form
from wtforms import StringField
class TestForm(Form):
test = StringField('Test field')
@app.route('display/')
def display():
dynamicvalue = getdynamicvalue()
return render_template('test.html', form = form, defname = dynamicvalue)
Run Code Online (Sandbox Code Playgroud)
test.html:
<div class="controls">
{{ form.test(size=80, readonly="readonly", value={{defname}} }}
</div>
Run Code Online (Sandbox Code Playgroud)
我该如何纠正?
以下是错误
{{form.test(size=80, readonly= "readonly", value={{defname}} }}
TemplateSyntaxError: expected token ':', got '}'
Run Code Online (Sandbox Code Playgroud) 在我的项目中__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) 我正在尝试使用 Flask-WTF 的扩展添加 CSRF 令牌保护CSRFProtect。除了此 CSRF 保护之外,该应用程序不使用 WTForms。
我遵循了文档,但收到“400 Bad Request The CSRF token is Missing”。
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
Run Code Online (Sandbox Code Playgroud)
我将以下内容放入模板中(带表单或不带表单),但出现相同的错误。
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
Run Code Online (Sandbox Code Playgroud) TL;DR 我需要保护我的表单免受 CSRF 攻击,我想在前端使用 ReactJS,在后端使用 Flask/Flask-WTF。
我正在重构一个使用 Python、Flask 和 Flask-WTF 构建的用于表单的网站,我想将 React 用于前端,而不是通过 PyPugjs 使用 Jinja2。我正在使用 Flask-WTF 来呈现表单,它负责处理 CSRF 令牌等。我知道如何使用 React 制作表单,但如何获得 CSRF 保护?
现在我的表单渲染看起来像这样:(使用 Pug)
mixin render_form(form, id='', action='Submit')
form(method='POST', action='', id=id)
=form.csrf_token
each field in form
fieldset
if field.errors
each error in field.errors
.notification.error
#{error}
#{field(placeholder=field.label.text)}
button(type='submit') #{action}
Run Code Online (Sandbox Code Playgroud) 将“禁用”html 属性分配给 WTForms 中 SelectField 中的选项之一的最简单方法是什么?
这是我之前的代码
<select class="form-control" name="division" data-error="Required!" required>
<option value="default" disabled selected>Select something</option>
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
</select>
Run Code Online (Sandbox Code Playgroud)
如您所见,我只想将“禁用”设置为第一个选项。
我这个任务的代码是:
next(form.division.__iter__())(**{'disabled':'true'})
Run Code Online (Sandbox Code Playgroud)
在控制台中使用打印功能我可以看到正确的输出:
<option disabled="true" selected value="default">Select something</option>
Run Code Online (Sandbox Code Playgroud)
该行正在工作,但不知何故此输出未传递给模板。相反,这是通过的:
<option selected value="default">Select something</option>
Run Code Online (Sandbox Code Playgroud)
请有人说清楚。
我使用Flask-WTForms在Flask中制作了一个简单的表单,父母可以在其中注册自己和他的孩子。父母可以通过单击“添加孩子”按钮来注册任意数量的孩子。WTForms通过使用FieldList功能使此操作非常容易实现。
但是,单击“添加子项”按钮后,页面会自动刷新,因为它向服务器发出了请求。我想使用AJAX请求添加子表单,因此页面不会刷新。
我知道如何执行AJAX请求,发送回响应并将此响应添加到html页面。但是,我不知道如何将条目追加到表单对象并返回页面本身(以某种方式)以及更新后的表单对象。那有可能吗?
我的表格:
class ChildForm(FlaskForm):
name = StringField(label='Name child')
age = IntegerField(label='Age child')
class Meta:
# No need for csrf token in this child form
csrf = False
class ParentForm(FlaskForm):
name = StringField(label='Name parent')
children = FieldList(FormField(ChildForm), label='Children')
add_child = SubmitField(label='Add child')
submit = SubmitField()
Run Code Online (Sandbox Code Playgroud)
我的路线:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = ParentForm()
if form.add_child.data:
form.children.append_entry()
return render_template('register.html', form=form)
if form.validate_on_submit():
# do something with data
return render_template('register.html', form=form)
Run Code Online (Sandbox Code Playgroud)
register.html:
<form action="{{ url_for('register') }}" method="post" id="parentForm">
{{ form.hidden_tag() …Run Code Online (Sandbox Code Playgroud) 使用quick_form Flask-Bootstrap生成的形式对我来说是非常方便的,但是,我不能在他们找到的文档的方式,我可以额外类添加到label所要求的我的模板主题。
我的 forms.py 类如下所示:
from flask_wtf import Form
from wtforms import StringField,PasswordField,TextField,SubmitField
from wtforms.validators import InputRequired,EqualTo,Email,ValidationError
class Building_Form(Form):
BuildingName = TextField('Building Name')
BuildingType = TextField('Building Type')
FloorNums = TextField('Numers of Floor')
BuildUnits = TextField('Units in Building')
BuildSize = TextField('Building Size')
BuiltYear = TextField('Built in (year)')
BuildOpeningTime = TextField('Open Time')
BuildClosingTime = TextField('Close Time')
Run Code Online (Sandbox Code Playgroud)
我的routes.py如下所示:
from app.import_core import *
from flask_wtf import FlaskForm
from wtforms import Form, BooleanField, StringField, PasswordField, validators
from …Run Code Online (Sandbox Code Playgroud) flask-wtforms ×10
flask ×8
python ×6
jinja2 ×2
ajax ×1
flask-login ×1
javascript ×1
jquery ×1
python-2.7 ×1
python-3.x ×1
reactjs ×1