第一次小尝试-Flask登录注册验证系统
项目结构
your_project/
│
├── app.py # 主应用文件
├── users.db # SQLite数据库文件(运行后生成)
├── templates/ # 模板文件夹
│ ├── register.html # 注册页面模板
│ └── login.html # 登录页面模板
└── __pycache__/ # Python缓存文件夹(运行后生成)
主要文件说明:
app.py
- 包含 Flask 应用的核心逻辑,包括路由、用户模型和数据库操作users.db
- SQLite 数据库文件,存储用户信息templates/register.html
- 注册页面的 HTML 模板templates/login.html
- 登录页面的 HTML 模板
运行应用前,确保安装了必要的依赖:
pip install flask flask-sqlalchemy werkzeug
相关代码
app.py
from flask import Flask, render_template, request, redirect, url_for, session
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
import os
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(120), nullable=False)
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.route('/')
def index():
if 'username' in session:
return f'欢迎, {session["username"]}! <a href="/logout">退出</a>'
return '你尚未登录 <a href="/login">登录</a> 或 <a href="/register">注册</a>'
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if User.query.filter_by(username=username).first():
return '用户名已存在,请选择其他用户名。'
new_user = User(username=username)
new_user.set_password(password)
db.session.add(new_user)
db.session.commit()
return redirect(url_for('login'))
return render_template('register.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
session['username'] = user.username
return redirect(url_for('index'))
else:
return '用户名或密码错误'
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
login.html
<!DOCTYPE html>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required><br>
<button type="submit">登录</button>
</form>
</body>
</html>
register.html
<!DOCTYPE html>
<html>
<head>
<title>注册</title>
</head>
<body>
<h1>注册</h1>
<form method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required><br>
<button type="submit">注册</button>
</form>
</body>
</html>
效果
首页
注册
127.0.0.1 - - [10/May/2025 20:42:37] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:42:38] "GET /login HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:42:46] "GET /register HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:42:51] "POST /register HTTP/1.1" 302 -
127.0.0.1 - - [10/May/2025 20:42:51] "GET /login HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:42:54] "POST /login HTTP/1.1" 302 -
127.0.0.1 - - [10/May/2025 20:42:54] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:42:57] "GET /logout HTTP/1.1" 302 -
127.0.0.1 - - [10/May/2025 20:42:57] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:42:59] "GET /login HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:43:01] "POST /login HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:43:03] "GET /login HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:49:25] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:49:57] "GET /register HTTP/1.1" 200 -
127.0.0.1 - - [10/May/2025 20:50:18] "POST /register HTTP/1.1" 302 -
127.0.0.1 - - [10/May/2025 20:50:18] "GET /login HTTP/1.1" 200 -
自动跳转登录
完美!!!
文章作者:Administrator
文章链接:https://hvril.cn/archives/Fv7MTGbZ
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!
评论