使用flask做一个简洁的登录注册页面

  • Post author:
  • Post category:其他


使用python的flask编写一个登录注册的页面,且携带轻量化数据库sqlite


Flask是一个轻量级的Python Web框架,它可以帮助开发者快速搭建Web应用程序。Flask的设计目的是保持简单和灵活,同时提供必要的功能以构建Web应用。它被广泛用于构建基于RESTful API的后端服务、网站和博客等应用。Flask提供了很多扩展库和工具,支持与各种数据库进行交互,同时也支持自定义插件或中间件的开发。与Django相比,Flask更加轻量级,更适合小型Web应用或API的开发。

先简单来一个flask例子

from flask import Flask, render_template

app = app = Flask(__name__)

@app.route("/home",methods="GET")
def home():
    render_template("index.html")

不了解的可以查看

https://blog.csdn.net/asd529735325/article/details/103011940

,其中详细的介绍了flask的环境部署与搭建

接下来开始我们的登录注册页面。

import sqlite3
import re
from flask import session, request, render_template, redirect, url_for, g, Blueprint
from flask_bcrypt import generate_password_hash

首先先使用sqlite创建数据库将用户的数据放入sqlite

create_table_sql = '''
CREATE TABLE IF NOT EXISTS user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username VARCHAR(40) UNIQUE NOT NULL,
    password VARCHAR(120) NOT NULL,
);
'''

为了使应用在上下文中初始化数据库的连接:

DATABASE = '数据库的名'

def get_db():
    db = gettar(g,'_database',None)
    if db is None:
        db = g._database = sqilte3.connect(DATABASE)
    return db

接下来编写注册页面来添加用户到sqlite中

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>注册账户</title>
 </head>
  <body>
    <form action="{{ url_for('user.register') }}" method="post">
      <h1>注册账户</h1>
      <label for="username">用户名:</label>
      <input type="text" id="username" name="username" required />
      <label for="password">密码:</label>
      <input type="password" id="password" name="password" required />
      <label for="birthdate">出生年月日:</label>
      <input type="date" id="birthdate" name="birthdate" required /><br>
      <input type="submit" value="注册" />
      {% if error %}
        <p class="error">{{ error }}</p>
      {% endif %}
      <p>已有账户?<a href="{{ url_for('user.login') }}">立即登录</a></p>
      {{x}}
    </form>
  </body>
</html>

这是一个简便的html文件

@appp.route('/register', methods=['GET', 'POST'], endpoint='register')
def register():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        birthdate = request.form.get('birthdate')

        # 密码强度校验
        if not re.search(r'[a-z]', password) or not re.search(r'[A-Z]', password) or not re.search(r'[0-9]', password):
            return '密码必须包含大小写字母和数字'
        hashed_password = generate_password_hash(password, 12)
        # 添加用户数据
        db = get_db()
        try:
            insert_user_sql = '''
            INSERT INTO user (username, password, birthdate)
            VALUES (?, ?, ?);
            '''
            db.execute(insert_user_sql, (username, password, birthdate))
            db.commit()
            x = f'{username}注册成功'
        except:
            db.rollback()
            error = '注册失败,请检查用户是否已经存在'
            return  render_template('register.html',error=error)
        return render_template('login.html', x=x)
    else:
        return render_template('register.html')

然后是登录界面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    {% if error %}
        <p>{{ error }}</p>
    {% endif %}
    <form method="POST" action="{{ url_for('login') }}">
        <label>用户名:</label>
        <input type="text" name="username"><br>
        <label>密码:</label>
        <input type="password" name="password"><br>
        <input type="hidden" name="hashed_password" value="{{ hashed_password }}">
        <input type="submit" value="登录">
        <div style="text-align: center; margin-top: 10px;">
            <small>如果没有账户,点此<a href="{{url_for('user.register')}}">注册</a></small>
        </div>
    </form>
</body>
</html>

这是一个简单的登录html文件

# 登录函数,用来验证用户身份
@app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')

        # 查询用户数据
        query_user_sql = '''
        SELECT COUNT(*)
        FROM user
        WHERE username = ?
        AND password = ?
        '''
        db = get_db()
        result = db.execute(query_user_sql, (username, password)).fetchone()
        count = result[0]

        # 返回验证结果
        if count == 0:
            return redirect(url_for('user.register'))
        elif count == 1:
            session['username'] = username
            return render_template('home.html')
        else:
            return render_template('login.html', error='用户名或密码错误')
    else:
        return render_template('login.html')
@app.route('/', endpoint='home_page')
def home():
    # 获取当前登录用户的用户名
    username = session.get("username")

    if username:
        # 如果用户已登录,则渲染主页模板,并传递用户名参数
        return render_template("home.html", username=username)
    else:
        # 如果用户未登录,则重定向到登录页面
        return redirect("/login")


@app.route("/logout", endpoint='logout')
def logout():
    # 删除 Session 中保存的用户名
    session.pop("username", None)

    # 重定向到登录页面
    return redirect("/login")

登录完成后,应该关闭数据库的连接来保护数据库的安全

# 关闭数据库连接
@user_bp.teardown_request
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

第一次写自己的文章,有何不妥,请大家指出问题,一起改善

谢谢!



版权声明:本文为m0_73421142原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。