模态注册和登录表单在同一页面上

时间:2015-11-04 15:52:23

标签: python flask wtforms

我有一个动态网页,应该处理两种形式:登录表单和注册表单。我正在使用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 %}

0 个答案:

没有答案