我有一个动态网页,应该处理两种形式:登录表单和注册表单。我正在使用WTForms来处理这两种形式,但是我在使它工作时遇到了一些麻烦,因为两种形式都被渲染到同一页面。实际上,我已经为注册,登录和主页创建了3个不同的页面。
#!/usr/bin/env python2.7
from flask import Flask, render_template, flash, request, url_for, redirect , session
from wtforms import Form, BooleanField, TextField, PasswordField, validators
from passlib.hash import sha256_crypt
from MySQLdb import escape_string as thwart
import gc
from connection import connection
from functools import wraps
class RegistrationForm(Form):
email = TextField('email', [validators.Length(min=6, max=50)])
password = PasswordField('password', [
validators.Required(),
validators.EqualTo('confirm', message='Passwords must match')
])
confirm = PasswordField('Repeat Password')
accept_tos = BooleanField('I accept the Terms of Service and Privacy Notice (updated Jan 22, 2015)', [validators.Required()])
app = Flask(__name__)
app.secret_key = 'mysecretkey'
@app.route('/')
def homepage():
try:
return render_template("index.html")
except Exception as e:
return(str(e))
@app.route('/login/', methods=["GET","POST"])
def login_page():
error = ''
try:
c, conn = connection()
if request.method == "POST":
data = c.execute("SELECT * FROM users WHERE email = (%s)",
(thwart(request.form['email']),))
data = c.fetchone()[2]
if sha256_crypt.verify(request.form['password'], data):
session['logged_in'] = True
session['email'] = request.form['email']
flash("You are now logged in")
return redirect(url_for('homepage'))
else:
error = "Invalid credentials. Try Again."
gc.collect()
return render_template("sign-in.html", error = error)
except Exception as e:
flash(e)
error = "Invalid credentials. Try Again!"
return render_template("sign-in.html", error = error)
@app.route('/register/', methods=["GET","POST"])
def register_page():
try:
form = RegistrationForm(request.form)
if request.method == "POST" and form.validate():
email = form.email.data
password = sha256_crypt.encrypt((str(form.password.data)))
c, conn = connection()
x = c.execute("SELECT * FROM users WHERE email = (%s)",
(email,))
if int(x) > 0:
flash("That email adress is already in use.")
return render_template('register.html', form=form)
else:
c.execute("INSERT INTO users (email, password) VALUES (%s, %s)",
(thwart(email), thwart(password)))
conn.commit()
flash("Thanks for registering!")
c.close()
conn.close()
gc.collect()
session['logged_in'] = True
session['email'] = email
return redirect(url_for('homepage'))
return render_template("sign-up.html", form=form)
except Exception as e:
return(str(e))
这是我的登录HTML: {%block body%}
<div class="container">
<br>
<h4>Please Login:</h4>
<br>
<form action="" class="form-inline" method="post">
<input type="text" class="form-control" placeholder="Email" name="email" value="{{request.form.email}}">
<input type="password" class="form-control" placeholder="Password" name="password" value="{{request.form.password}}">
<input class="btn btn-default" type="submit" value="Login">
</form>
</div>
{% endblock %}
</body>
这是我的register.html: {%block body%}
<div class="container">
<h4>Register</h4>
<br>
{% from "_formhelpers.html" import render_field %}
<form method="post" action="http://lapatrat.pythonanywhere.com/register/">
<dl>
{{render_field(form.First_Name)}}
{{render_field(form.Second_Name)}}
{{render_field(form.Grade)}}
{{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"></p>
</form>
{% if error %}
<p class="error"><strong>Error:</strong>{{error}}</p>
{% endif %}
</div>
{% endblock %}