搭建一个安全的登录系统是Web应用开发中必不可少的一环。在这个教程中,我们将一步步教你如何使用Python的Flask框架来搭建一个基本的登录系统,实现用户认证与权限管理。
环境准备
在开始之前,请确保你已经安装了以下工具:
- Python 3.x
- Flask
- Flask-Login
- SQLAlchemy
- Flask-SQLAlchemy
你可以使用以下命令来安装这些依赖:
pip install Flask Flask-Login SQLAlchemy Flask-SQLAlchemy
创建项目结构
首先,创建一个项目文件夹,并在其中创建以下文件:
/project/
/app/
__init__.py
models.py
forms.py
routes.py
config.py
初始化Flask应用
在/app/__init__.py中,初始化Flask应用和数据库:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SECRET_KEY'] = 'your_secret_key'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
from app import routes
配置数据库
在/app/config.py中,配置数据库:
import os
class Config:
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///site.db'
SECRET_KEY = os.environ.get('SECRET_KEY') or 'your_secret_key'
定义用户模型
在/app/models.py中,定义用户模型:
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from . import db, login_manager
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128))
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
定义表单类
在/app/forms.py中,定义用户表单类:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import InputRequired, Length, Email, EqualTo, ValidationError
from .models import User
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[InputRequired(), Length(min=4, max=20)])
email = StringField('Email', validators=[InputRequired(), Email(message='Invalid email'), Length(max=120)])
password = PasswordField('Password', validators=[InputRequired(), Length(min=8)])
confirm_password = PasswordField('Confirm Password', validators=[InputRequired(), EqualTo('password')])
submit = SubmitField('Register')
def validate_username(self, username):
user = User.query.filter_by(username=username.data).first()
if user:
raise ValidationError('Username already exists.')
def validate_email(self, email):
user = User.query.filter_by(email=email.data).first()
if user:
raise ValidationError('Email already registered.')
class LoginForm(FlaskForm):
username = StringField('Username', validators=[InputRequired(), Length(min=4, max=20)])
password = PasswordField('Password', validators=[InputRequired()])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
定义路由
在/app/routes.py中,定义登录、注册和用户注销的路由:
from flask import render_template, flash, redirect, url_for
from flask_login import login_user, logout_user, login_required, current_user
from . import app, db
from .forms import RegistrationForm, LoginForm
from .models import User
@app.route('/')
def home():
return render_template('home.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email=form.email.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
flash('Congratulations, you are now a registered user!', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and user.check_password(form.password.data):
login_user(user, remember=form.remember.data)
return redirect(url_for('profile'))
else:
flash('Invalid username or password', 'danger')
return render_template('login.html', form=form)
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('home'))
@app.route('/profile')
@login_required
def profile():
return render_template('profile.html', user=current_user)
创建模板
创建以下HTML模板文件:
/templates/home.html/templates/register.html/templates/login.html/templates/profile.html
在模板文件中,添加相应的表单和内容。
运行应用
在项目根目录下,运行以下命令启动应用:
flask run
现在,你可以在浏览器中访问 http://127.0.0.1:5000/ 来查看登录和注册页面。
总结
在这个教程中,我们使用Flask框架和Flask-Login扩展实现了用户认证和权限管理。通过创建用户模型、表单类、路由和模板,我们构建了一个基本的登录系统。希望这个教程能帮助你入门Flask开发,并为你提供一个安全、可靠的登录机制。
