69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
import re
|
|
from datetime import datetime
|
|
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
|
from werkzeug.security import generate_password_hash
|
|
from models import db, User
|
|
|
|
register_bp = Blueprint('register', __name__, url_prefix='/register')
|
|
|
|
@register_bp.route('/', methods=['GET', 'POST'])
|
|
def register():
|
|
username = ''
|
|
password = ''
|
|
confirm_password = ''
|
|
username_err = ''
|
|
password_err = ''
|
|
confirm_password_err = ''
|
|
|
|
if request.method == 'POST':
|
|
username = request.form.get('username', '').strip()
|
|
password = request.form.get('password', '').strip()
|
|
confirm_password = request.form.get('confirm_password', '').strip()
|
|
|
|
# Validate username
|
|
if not username:
|
|
username_err = "Please enter a username."
|
|
elif not re.match(r'^[a-zA-Z0-9_]+$', username):
|
|
username_err = "Username can only contain letters, numbers, and underscores."
|
|
else:
|
|
# Check if username already exists
|
|
if User.query.filter_by(username=username).first():
|
|
username_err = "This username is already taken."
|
|
|
|
# Validate password
|
|
if not password:
|
|
password_err = "Please enter a password."
|
|
elif len(password) < 6:
|
|
password_err = "Password must have at least 6 characters."
|
|
|
|
# Validate confirm password
|
|
if not confirm_password:
|
|
confirm_password_err = "Please confirm password."
|
|
elif password != confirm_password:
|
|
confirm_password_err = "Password did not match."
|
|
|
|
# If no errors, insert new user
|
|
if not username_err and not password_err and not confirm_password_err:
|
|
hashed_password = generate_password_hash(password)
|
|
new_user = User(
|
|
username=username,
|
|
password=hashed_password,
|
|
register_time=datetime.utcnow()
|
|
)
|
|
try:
|
|
db.session.add(new_user)
|
|
db.session.commit()
|
|
flash("Registration successful! Please login.", "success")
|
|
return redirect(url_for('login.login'))
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
flash("Oops! Something went wrong. Please try again.", "danger")
|
|
|
|
return render_template('register.html',
|
|
username=username,
|
|
password=password,
|
|
confirm_password=confirm_password,
|
|
username_err=username_err,
|
|
password_err=password_err,
|
|
confirm_password_err=confirm_password_err)
|