第一次小尝试-Flask登录注册验证系统

May 10, 2025 / Administrator / 6阅读 / 0评论 / 分类:

项目结构

your_project/
│
├── app.py                  # 主应用文件
├── users.db                # SQLite数据库文件(运行后生成)
├── templates/              # 模板文件夹
│   ├── register.html       # 注册页面模板
│   └── login.html          # 登录页面模板
└── __pycache__/            # Python缓存文件夹(运行后生成)

主要文件说明:

  1. app.py - 包含 Flask 应用的核心逻辑,包括路由、用户模型和数据库操作

  2. users.db - SQLite 数据库文件,存储用户信息

  3. templates/register.html - 注册页面的 HTML 模板

  4. 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 许可协议,转载请注明出处!


评论