我是网络开发的新手,这就是我尝试过的:
@app.route('/login', methods=['GET', 'POST'])
def login():
attempt = 0
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID="%s", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
attempt += 1
flash('Attempt(s)="%d"' % attempt)
return render_template('login.html',
title='Sign In',
form=form)
输出始终是Attempt(s)="1"
,而我希望每次form.validate_on_submit()
失败时数字会增加1。
我发现当我按Sign In
按钮时,login
页面会刷新。但是,我在文本字段中输入的所有文本都保留在那里,所以我认为form = LoginForm()
没有被执行。(如果创建了一个全新的LoginForm
,那么这些文本怎么仍然存在?)因此我将语句attempt = 0
置于form = LoginForm()
之上,希望每次按Sign In
时都不执行,但显然这不起作用。
我认为问题在于,当我按下Sign In
时,我不知道发生了什么。是否再次调用函数login
?如果是这样,它由谁调用?
以下是login.html
的内容:
{% extends "base.html" %}
{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
答案 0 :(得分:4)
网络是无国籍的。每次按下提交按钮,浏览器都会调用与该表单关联的URL;该URL将路由到您的login()
处理函数,该函数从一开始就运行。该函数本身没有以前调用的内存(您也不希望它,否则您站点的所有用户将获得相同的登录计数)。表单将从提交请求中发送的数据填充,该数据由flask-wtf库自动发送到表单。
您需要在两次通话之间存储该计数。一个好的地方就是用饼干; Flask包含sessions API以使这更简单。
答案 1 :(得分:2)
我已经尝试过并且有效
@app.route('/',methods=['GET'])
def home():
session['attempt'] = 5
@app.route('/login')
def login():
username = request.form.get('username')
session['username'] = username
password = request.form.get('password')
if username and password and username in users and users[username] == password:
session['logged_in'] = True
return redirect(url_for('index'))
attempt= session.get('attempt')
attempt -= 1
session['attempt']=attempt
#print(attempt,flush=True)
if attempt==1:
client_ip= session.get('client_ip')
flash('This is your last attempt, %s will be blocked for 24hr, Attempt %d of 5' % (client_ip,attempt), 'error')
else:
flash('Invalid login credentials, Attempts %d of 5' % attempt, 'error')
return redirect(url_for('login'))