在开发Web应用时,用户登录功能是不可或缺的一部分。Flask作为Python中一个轻量级的Web框架,非常适合用于构建简单的登录系统。本文将手把手教你如何搭建一个完整的Flask登录功能框架,从用户注册到认证的全过程。
一、环境准备
在开始之前,请确保你的系统中已经安装了Python和Flask。以下是一个简单的安装步骤:
- 安装Python:从官网下载Python安装包,并按照提示进行安装。
- 安装Flask:在命令行中运行以下命令安装Flask:
pip install Flask
二、创建项目结构
创建一个名为flask_login的目录,并在其中创建以下文件:
app.py:主应用文件。templates/:存放HTML模板的目录。static/:存放静态资源的目录。models.py:定义数据库模型。forms.py:定义表单类。
三、定义数据库模型
在models.py中,使用Flask-SQLAlchemy来定义用户模型:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), 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)
四、定义表单类
在forms.py中,使用Flask-WTF来定义注册和登录表单:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, EqualTo
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Register')
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
五、配置Flask应用
在app.py中,配置Flask应用:
from flask import Flask, render_template, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from forms import RegistrationForm, LoginForm
from models import db, User
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db.init_app(app)
bcrypt = Bcrypt(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/')
def home():
return render_template('home.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user = User(username=form.username.data, email=form.email.data, password_hash=hashed_password)
db.session.add(user)
db.session.commit()
flash('Your account has been created! You are now able to log in', '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 bcrypt.check_password_hash(user.password_hash, form.password.data):
login_user(user)
return redirect(url_for('home'))
else:
flash('Login Unsuccessful. Please check username and password', 'danger')
return render_template('login.html', form=form)
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
六、创建HTML模板
在templates/目录下创建以下HTML模板:
base.html:基础模板,包含导航栏和页脚。home.html:首页模板。register.html:注册页面模板。login.html:登录页面模板。
七、运行应用
在命令行中运行以下命令启动Flask应用:
python app.py
打开浏览器,访问http://127.0.0.1:5000/,你将看到一个简单的登录功能框架。
总结
本文详细介绍了如何使用Flask搭建一个从注册到认证的登录功能框架。通过本文的学习,你将能够掌握Flask的基本用法,并能够将所学知识应用到实际项目中。祝你学习愉快!
