Flask实现用户登录注册(附前后端源码)

效果展示:

登录

注册

主页面

项目结构

项目结构如下:

项目采用蓝图进行视图函数的管理,每个功能被放在一个小的app中。登录和注册功能放在了app_login文件夹中。

后端Python代码

app/login中的__init__.py创建了一个蓝图,内容如下:

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/8 23:19

"""登录视图的蓝图"""
from flask import Blueprint

login = Blueprint("login", __name__)
from . import view

models.py创建了一个数据模型User,对应数据库中的用户表,内容如下:

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/4 20:00

"""登录需要的数据库模型(用户表)"""
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db


class User(UserMixin, db.Model):
    # 第一个参数指定字段类型,后面设置属性
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    count = db.Column(db.String(128), nullable=False)
    password = db.Column(db.String(128), nullable=False)

    def __init__(self, count, password):
        self.count = count
        self.password = password

    def set_password(self, password):
        self.password = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password, password)


if __name__ == '__main__':
    user = User(count='0101', password=2021)
    db.session.add(user)
    db.session.commit()

viesw.py存放登录、注册的视图函数,内容如下:

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/6 11:39

"""登录的视图函数"""
from flask import request, render_template, redirect, url_for, flash
from flask_login import login_required, login_user
from . import login
from .models import User
from app import login_manager


@login_manager.user_loader
def load_user(user_id):  # 创建用户加载回调函数,接受用户 ID 作为参数
    user = User.query.get(int(user_id))  # 用 ID 作为 User 模型的主键查询对应的用户
    return user  # 返回用户对象


@login.route('/index', methods=['GET', 'POST'])
@login_required
def index():
    if request.method == "GET":
        return render_template('index.html')


@login.route('/register', methods=['GET', 'POST'])
def register():
    # 如果请求为post
    if request.method == 'POST':
        count = request.form.get('count')
        password = request.form.get('password')
        repassword = request.form.get('repassword')
        print(count, password)
        from app import db
        if password == repassword:
            user = User(count, password)
            user.set_password(password)
            db.session.add(user)
            db.session.commit()
            return '注册成功'
        else:
            return '两次密码不一致'
    # 请求为get
    return render_template('register.html')


@login.route('/', methods=['GET', 'POST'])
@login.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        count = request.form['count']
        password = request.form['password']
        print(password)
        if not count or not password:
            flash('Invalid input.')
            return redirect(url_for('login'))
        user = User.query.filter_by(count=count).first()
        if not user:
            flash("用户不存在")
            return redirect(url_for('login.login'))
        if count == user.count and user.check_password(password):
            login_user(user)  # 登入用户
            flash('Login success.')
            print("登录成功")
            return redirect(url_for('login.index'))  # 重定向到主页

        flash('Invalid username or password.')  # 如果验证失败,显示错误消息
        return redirect(url_for('templates.login'))  # 重定向回登录页面
    return render_template('login.html')

配置文件config.py

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/3 15:08

"""各种配置类"""


class BaseConfig(object):
    """所有配置类的基类"""
    SECRET_KEY = "LOVE"
    DEBUG = True
    TESTING = False
    VISIT_TIME = 0  # 网站访问次数
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:自己的MySql密码@localhost/personalwebsite"
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 是否追踪数据库的修改


class ProductionConfig(BaseConfig):
    """生产环境下的配置类"""
    DEBUG = False


class DevelopmentConfig(BaseConfig):
    """开发模式下的配置类"""
    DEBUG = True
    TESTING = True

app/__init__.py

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/3 1:54

"""构建app,注册蓝图"""

from flask import Flask
from config import BaseConfig
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy

login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'login'
db = SQLAlchemy()


def register_bp(app):
    """
    注册蓝图
    :param app:
    :return:
    """
    from .app_login import login as login_blueprint
    app.register_blueprint(login_blueprint)

def database(app, db):
    """
    初始化数据库
    :param app:
    :return:
    """
    db.init_app(app)
    db.create_all()
    db.session.commit()


def create_app():
    my_app = Flask(__name__)
    with my_app.app_context():
        # app注册蓝图
        register_bp(my_app)
        # app加载配置
        my_app.config.from_object(BaseConfig)
        # 数据库管理对象
        database(my_app, db)
        # 用于登录验证
        login_manager.init_app(my_app)
        login_manager.login_view = 'login.login'
    return my_app

启动文件manager.py

# coding:   utf-8
# 作者(@Author):   Messimeimei
# 创建时间(@Created_time): 2023/1/3 13:50

"""启动文件"""
from app import create_app
from flask import render_template, session

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

前端代码(没有使用bootstrap)

html部分

登录login.html页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <link rel="stylesheet" type="text/css" href="../static/css/login.css"/>
    <script src="../static/js/register.js" type="text/javascript"></script>

</head>
<body>

<div class="login-box">
    <h2>入口</h2>
    <form action="/login" method="post">
        <div class="login-field">
            <span style="color: aqua; size: 12px">账号</span>
            <input type="text" name="count" required=""/>
        </div>
        <div class="login-field">
            <spqn style="color: aqua; size: 12px">密码</spqn>
            <input type="password" name="password" required=""/>
        </div>
        <input type="submit" value="点击进入" id="myloginlabel">
        <p style="color: #101113">没有账号?<a href="./register" style="color: rgba(22,180,166,0.58)" onclick="topggleForm();">注册</a></p>
    </form>
</div>
</body>
</html>

注册register.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="../static/css/login.css"/>
    <script src="../static/js/register.js" type="text/javascript"></script>

</head>
<body>
<div class="login-box">
    <h2>注册</h2>
    <form action="/register" method="post">
        <div class="login-field">
            <span style="color: aqua; size: 12px">账号</span>
            <input type="text" name="count" required=""/>
        </div>
        <div class="login-field">
            <spqn style="color: aqua; size: 12px">密码</spqn>
            <input type="password" name="password" required=""/>
        </div>
        <div class="login-field">
            <spqn style="color: aqua; size: 12px">确认密码</spqn>
            <input type="password" name="repassword" required=""/>
        </div>
        <input type="submit" value="提交" id="myloginlabel">
        <p style="color: #101113">已有账号?<a href="./login" style="color: rgba(22,180,166,0.58)" onclick="topggleForm();">登录</a></p>
    </form>
</div>
</body>
</html>

主页面index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <link rel="stylesheet" type="text/css" href="../static/css/index.css"/>

</head>
<body>


</body>
</html>

css部分

login.css

body {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
    background-size: cover;


    background: url(../images/bg.jpg) no-repeat fixed center 0;
    -webkit-background-size: cover;
    -o-background-size: cover;
    -moz-background-size: cover;
    -ms-background-size: cover;

}

.login-box {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 400px;
    padding: 40px;
    background: rgba(16, 17, 19, 0.58);
    box-sizing: border-box;
    box-shadow: 0 10px 25px rgb(16, 17, 19);
    border-radius: 10px;
}

.login-box h2 {
    margin: 0 0 30px;
    padding: 0;
    text-align: center;
    color: #ffffff;
}

.login-box .login-field {
    position: relative;
}

.login-box .login-field input {
    width: 100%;
    padding: 10px 0;
    font-size: 16px;
    color: #ffffff;
    margin-bottom: 30px;
    border: none;
    border-bottom: 1px solid #ffffff;
    outline: none;
    background: transparent;
}

.login-box .login-field label {
    position: absolute;
    top: 0;
    left: 0;
    letter-spacing: 1px;
    padding: 10px 0;
    font-size: 16px;
    color: #ffffff;
    pointer-events: none;
    transition: .5s;
}

.login-box .login-field input:focus ~ label,
.login-box .login-field input:valid ~ label {
    top: -23px;
    left: 0;
    color: aqua;
    font-size: 12px;
}

.login-box button {
    border: none;
    outline: none;
    color: #fff;
    background: #03a9f4;
    padding: 10px 20px;
    cursor: pointer;
    border-radius: 5px;

}

#myloginlabel{
        position: relative;

        background-color: rgb(3, 168, 243);
        border: 1px solid rgb(190, 225, 255);
        width: 100px;
        height: 30px;
        font-size: 12px;
        color: rgb(255, 255, 255);
        font-weight: 200;
        margin-top: 10px;
        text-align: center;
        border-radius: 20px;
        padding: 10px;
}

index.css

body {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
    background-size: cover;


    background: url(../images/index.jpg) no-repeat fixed center 0;
    -webkit-background-size: cover;
    -o-background-size: cover;
    -moz-background-size: cover;
    -ms-background-size: cover;

}

js部分

register.js

function topggleForm() {
    var container = document.querySelector('.container');
    container.classList.toggle('active');
}

两张背景图片(有需求自取,当然也可以换自己喜欢的,推荐一个网站https://pixabay.com/zh/

  • 43
    点赞
  • 226
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论
### 回答1: 可以使用 Flask-WTF 扩展来创建登录注册页面。首先需要安装 Flask-WTF 扩展,然后创建一个表单类来定义登录和注册表单的字段和验证规则。接着在 Flask 应用中创建路由来处理表单提交和渲染模板。最后在模板中使用表单类来渲染表单,并添加必要的 HTML 和 CSS 样式来美化页面。 ### 回答2: Flask是一个轻量级的Web框架,可以用来开发简单的登录注册页面。下面是一个用Flask实现的基本登录注册页面的示例: 首先,我们需要导入Flask和相关的模块: from flask import Flask, render_template, request, redirect, url_for from werkzeug.security import generate_password_hash, check_password_hash 接下来,创建一个Flask应用和一个列表来存储用户的信息: app = Flask(__name__) users = [] 然后,创建两个路由函数来处理登录和注册的请求: @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] for user in users: if user['username'] == username and check_password_hash(user['password'], password): return redirect(url_for('welcome', username=username)) return render_template('login.html', message='Invalid username or password.') return render_template('login.html', message='') @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] confirm_password = request.form['confirm_password'] if password != confirm_password: return render_template('register.html', message='Passwords do not match.') hashed_password = generate_password_hash(password) users.append({'username': username, 'password': hashed_password}) return redirect(url_for('login')) return render_template('register.html', message='') 在登录路由函数中,我们首先获取用户提交的用户名和密码,并使用check_password_hash函数来检查密码是否匹配。如果验证通过,我们使用redirect函数来重定向到欢迎页面;否则,我们返回登录页面并显示一个错误消息。 在注册路由函数中,我们获取用户提交的用户名和密码。如果两次输入的密码不匹配,我们返回注册页面并显示一个错误消息。如果输入正确,我们使用generate_password_hash函数来生成密码的哈希值,并将用户名和哈希值存储到用户列表中。然后,我们重定向到登录页面。 最后,我们需要创建两个HTML模板文件:login.html和register.html,分别用来显示登录和注册页面的表单。 在login.html中,我们使用Flask提供的表单处理函数和模板语法来创建一个带有用户名、密码和提交按钮的登录表单。 在register.html中,我们也使用类似的方式来创建一个带有用户名、密码、确认密码和提交按钮的注册表单。 以上就是一个基本的Flask登录注册页面的实现。当用户在登录页面输入正确的用户名和密码后,会被重定向到欢迎页面;当用户在注册页面输入正确的用户名和密码后,会被重定向到登录页面。 ### 回答3: Flask 是一个使用 Python 编写的 Web 框架,可用于快速创建登录注册页面。在 Flask 中,我们可以使用默认的 WTForms 扩展来处理表单验证和字段。 对于登录和注册页面,我们可以创建两个不同的路由以及相应的模板。首先,我们需要导入 Flask 和 WTForms 相关的模块,创建 Flask 应用程序实例,并初始化一个用于表单验证的 Secret Key。接下来,我们需要创建用于登录和注册的表单类,并定义相应的字段。 对于登录页面,我们可以使用一个简单的表单类,包含用户名和密码字段。在验证表单时,我们可以通过查询数据库中是否存在相应的用户来进行身份验证。如果验证通过,我们可以将用户信息存储在 session 中,并重定向到主页。 对于注册页面,我们需要一个包含用户名、密码和确认密码字段的表单类。在验证表单时,我们需要检查用户名是否已经存在,并确保密码和确认密码字段的值相同。如果验证通过,我们可以将新用户的信息保存在数据库中,并返回登录页面。 在模板文件中,我们可以使用 Flask 提供的模板语法来渲染表单和相应的错误信息。可以通过使用 Flask 提供的表单对象和字段属性,来生成表单元素和验证错误信息。 总的来说,使用 Flask 创建登录注册页面可以分为以下几个步骤: 1. 导入必要的模块和创建 Flask 应用程序实例。 2. 创建用于登录和注册的表单类,定义相应的字段和验证逻辑。 3. 创建登录和注册的路由,处理 GET 和 POST 请求。 4. 在模板文件中使用模板语法渲染表单和错误信息。 这只是一个简单的示例,实际创建登录注册页面时,可能还需要处理其他方面的逻辑,比如密码加密、邮箱验证等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺坎普的风间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值