Flask登陆后登陆状态及密码的修改和处理

news2024/11/15 21:35:28

web/templates/common 是统一布局

登录成功 后flask框架服务器默认由login.html进入仪表盘页面index.html('/'),该页面的设置在  (web/controllers/user/index.py),如果想在 该仪表盘页面用户信息 展示出来,就得想办法先获取到 当前用户的 登陆状态

问题1: 登录成功后,在仪表盘index.html中如何获取到  当前用户的 登陆状态

首先,想法首先得先想到拦截器登录状态没有则拦截器依旧会对该页面进行拦截,因为服务器并没有获得这个页面登录状态信息, 别说对这个仪表盘index.html有啥操作了,想看该页面都看不到,拦截器在前面着呢,去web/interceptors/Authinterceptor.py中写入代码:

@app.before_request
def before_request():

....,


    user_info = check_login()
    g.current_user = None


    if user_info:
        g.current_user = user_info

添加g变量后,通过拦截器使用g变量?import g以后 就可以到仪表盘页面index.html中使用g变量

web/controllers/user/index.py

from flask import Blueprint, render_template, g
route_index = Blueprint('index_page', __name__)

@route_index.route('/')
def index():
    current_user = g.current_user
    return render_template("index/index.html", current_user = current_user)

问题2: 拦截器是通过auth.cookie获得auth_cookie后,根据有无正确的auth_cookie值进行拦截的,那为何不直接用auth.cookie来当作用户登陆状态,反而溜达一圈使用g变量呢?这部多此一举吗?  

g变量是从user_info赋值的,而user_info又是由auth_cookie.split(#)获得的,使用g变量反而变得轻巧了许多,不用反复对auth_cookie反复split(#)。

另一方面,在拦截器中,我们还对auth.cookie.split(#)所赋值的auth_info 进行了一系列判断

【比如说

1: 是否user_iinfo在我们的数据库模型User中,如果不在则返回False; 

2auth_info[0]授权码是否  符合  我们在 flask框架 中定义的 授权码UserService.geneAuthCode(user_info)进行判断,如果 不符合 则 返回 False

由此观之,并不是说拦截器拦截了我们想要的用户登陆状态信息,而是拦截器已经阻拦了 我们让它阻拦的,没让它阻拦的 它没阻拦,就好比我们的用户登陆状态信息,已经通过拦截器了,是我们没用让 用户登陆状态信息显露出来,这就又回到了我们的文章的起点,如何将用户登陆状态信息 展示


接下来,就继续看看编程浪子是怎么样在index.html使用登录状态吧!

问题3: 但我发现他并没有第一时间跑到index.html中修改部署current_user信息,为什么呢?

{% extends "common/layout_main.html" %}
{% block content %}
<div class="wrapper wrapper-content">
            <div class="row">
                <div class="col-lg-3">
                    <div class="ibox float-e-margins">
                        <div class="ibox-title">
                            <span class="label label-primary pull-right">日统计</span>
                            <h5>营收概况</h5>
                        </div>
                        <div class="ibox-content">
                            <h1 class="no-margins">1005.00</h1>
                            <small>近30日:31177.00</small>
                        </div>
                    </div>
                </div>
                <div class="col-lg-3">
                    <div class="ibox float-e-margins">
                        <div class="ibox-title">
                            <span class="label label-primary pull-right">日统计</span>
                            <h5>订单</h5>
                        </div>
                        <div class="ibox-content">
                            <h1 class="no-margins">988</h1>
                            <small>近30日:29383</small>
                        </div>
                    </div>
                </div>
                <div class="col-lg-3">
                    <div class="ibox float-e-margins">
                        <div class="ibox-title">
                            <span class="label label-primary pull-right">日统计</span>
                            <h5>会员</h5>
                        </div>
                        <div class="ibox-content">
                            <h1 class="no-margins">358</h1>
                            <small>今日新增:77</small>
                            <small>近30日新增:2454</small>
                        </div>
                    </div>
                </div>
                <div class="col-lg-3">
                    <div class="ibox float-e-margins">
                        <div class="ibox-title">
                            <span class="label label-primary pull-right">日统计</span>
                            <h5>分享</h5>
                        </div>
                        <div class="ibox-content">
                            <h1 class="no-margins">1250</h1>
                            <small>近30日:45980</small>
                        </div>
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-lg-12" id="member_order" style="height: 400px;border: 1px solid #e6e6e6;padding-top: 20px;">
                    使用highchart画图
                </div>
                <div class="col-lg-12" id="finance" style="height: 400px;border: 1px solid #e6e6e6;padding-top: 20px;">
                    使用highchart画图
                </div>
            </div>
        </div>
{% endblock %}

如index.html开始所示:

{% extends "common/layout_main.html" %}
{% block content %}

他跑layout_main.html编辑了,这也是他为什么跑layout_main.html进行编辑的原因。

layout   n, 布局、版面设计

web/templates/common/layout_main.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>管理后台</title>
    <link href="{{ buildStaticUrl('/bootstrap/bootstrap.min.css') }}" rel="stylesheet">
    <link href="{{ buildStaticUrl('/font-awesome/css/font-awesome.min.css') }}" rel="stylesheet">
    <link href="{{ buildStaticUrl('/css/style.css') }}" rel="stylesheet">
    {%block css %}{% endblock %}
<body>
<div id="wrapper">
    <nav class="navbar-default navbar-static-side" role="navigation">
        <div class="sidebar-collapse">
            <ul class="nav metismenu" id="side-menu">
                <li class="nav-header">
                    <div class="profile-element text-center">
                        <img alt="image" class="img-circle" src="{{ buildStaticUrl('/images/common/logo.png') }}"/>
                        <p class="text-muted">编程浪子</p>
                    </div>
                    <div class="logo-element">
                        <img alt="image" class="img-circle" src="{{ buildStaticUrl('/images/common/logo.png') }}"/>
                    </div>
                </li>
                <li class="default">
                    <a href="{{ buildUrl('/') }}"><i class="fa fa-dashboard fa-lg"></i>
                        <span class="nav-label">仪表盘</span></a>
                </li>
                <li class="account">
                    <a href="{{ buildUrl('/account/index') }}"><i class="fa fa-user fa-lg"></i> <span
                            class="nav-label">账号管理</span></a>
                </li>
                <li class="food">
                    <a href="{{ buildUrl('/food/index') }}"><i class="fa fa-book fa-lg"></i> <span
                            class="nav-label">美餐管理</span></a>
                </li>
                <li class="member">
                    <a href="{{ buildUrl('/member/index') }}"><i class="fa fa-group fa-lg"></i> <span
                            class="nav-label">会员列表</span></a>
                </li>
                <li class="finance">
                    <a href="{{ buildUrl('/finance/index') }}"><i class="fa fa-rmb fa-lg"></i> <span
                            class="nav-label">财务管理</span></a>
                </li>
                <li class="stat">
                    <a href="{{ buildUrl('/stat/index') }}"><i class="fa fa-bar-chart fa-lg"></i> <span
                            class="nav-label">统计管理</span></a>
                </li>
            </ul>

        </div>
    </nav>

    <div id="page-wrapper" class="gray-bg" style="background-color: #ffffff;">
        <div class="row border-bottom">
            <nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
                <div class="navbar-header">
                    <a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="javascript:void(0);"><i class="fa fa-bars"></i> </a>
                </div>
                <ul class="nav navbar-top-links navbar-right">
                    <li>
						<span class="m-r-sm text-muted welcome-message">
                            欢迎使用编程浪子订餐管理管理后台
                        </span>
                    </li>
                    <li class="dropdown user_info">
                        <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">
                            <img alt="image" class="img-circle" src="{{ buildStaticUrl('/images/common/avatar.png') }}"/>
                        </a>
                        <ul class="dropdown-menu dropdown-messages">
                            <li>
                                <div class="dropdown-messages-box">
                                    姓名:{{ current_user.nickname }} <a href="{{ buildUrl('/user/edit') }}" class="pull-right">编辑</a>
                                </div>
                            </li>
                            <li class="divider"></li>
                            <li>
                                <div class="dropdown-messages-box">
                                    手机号码: {{ current_user.mobile }}
                                </div>
                            </li>
                            <li class="divider"></li>
                            <li>
                                <div class="link-block text-center">
                                    <a class="pull-left" href="{{ buildUrl('/user/reset-pwd') }}">
                                        <i class="fa fa-lock"></i> 修改密码
                                    </a>
                                    <a class="pull-right" href="{{ buildUrl('/user/logout') }}">
                                        <i class="fa fa-sign-out"></i> 退出
                                    </a>
                                </div>
                            </li>
                        </ul>
                    </li>

                </ul>

            </nav>
        </div>
        {% block content %}{% endblock %}
    </div>
</div>

<script src="{{ buildStaticUrl('/plugins/jquery-2.1.1.js') }}"></script>
<script src="{{ buildStaticUrl('/bootstrap/bootstrap.min.js') }}"></script>
<script src="{{ buildStaticUrl('/plugins/layer/layer.js') }}"></script>
<script src="{{ buildStaticUrl('/js/common.js') }}"></script>
{%block js %}{% endblock %}
</body>
</html>

通过在父模板layout_main.html 中通过{{ current_user.nickname }} 和 {{ current_user.mobile }}获取到了登录状态信息

值得一提的是,在current在flask框架index.py中return时,

from flask import Blueprint, render_template, g
route_index = Blueprint('index_page', __name__)

@route_index.route('/')
def index():
    current_user = g.current_user
    return render_template("index/index.html", current_user = current_user)

他只是在子模版中return了一下current_user的值。 这样用户登陆状态信息就成功地在index.html页面展示出来了!


伴随着学习的进步,更多的问题就浮现出来了。index.html页面可以展示用户登陆状态信息,但是其他的页面edit、food 等页面还没有展示用户登陆状态信息,这就需要去一一展示用户登录状态信息。就是因为嫌弃一一展示麻烦,所以当然可以统一写一下代码整体展示用户登陆状态信息

接下来就是编程浪子老师教 如何将统一布局里面的变量g 通过统一传递的方式而不需要每个controller里进行操作。

在web/controllers/user/User.py 中 index 和edit这些return里都有render_templater()方法进行渲染页面:

route_user = Blueprint('user_page', __name__)

@route_user.route('/login', methods = ['GET', 'POST'])
def login():
    if request.method =="GET":
        if g.current_user:
            return  redirect( UrlManager.buildUrl("/") )
        return render_template("user/login.html")
       
    ...,

    return response

@route_user.route('/edit')
def edit():
    return render_template('user/edit.html')

@route_user.route('/reset.pwd')
def resetPwd():
    return render_template('user/reset_pwd.html')

如果将统一渲染模板的这个render_template()方法统一包装一层,然后将这个统一的g变量传进去,不就可以展示了吗?

common/libs/user/Helper.py

ops 表示  惊讶!
 

from flask import g

'''
统一渲染方法
'''
def ops_render( template,context = {} ):
    if 'current_user' in g:
        context['current_user'] = g.current_user
    return render_template( template,**context )

这段Flask代码是一个用于 统一渲染模板 的方法。它接受两个参数:template和context。其中,template是 要渲染的模板文件名 context上下文是一个 字典,包含要传递给模板的数据。

在方法内部,首先判断 当前用户 是否 存在 于 全局变量g中。如果存在,将当前用户添加到context字典中的current_user键中。

然后,使用render_template方法来渲染模板。render_template方法是Flask框架提供的一个函数,用于渲染模板文件并返回渲染后的HTML内容。它接受两个参数:模板文件名  和  要传递给模板的数据。在这里,我们使用  **context  来将  context字典  中的 所有键值对  作为  参数  传递给render_template方法。

最后,将渲染后的HTML内容作为方法的返回值。

这段代码的作用是将当前用户添加到模板上下文中,并渲染指定的模板文件。通过这个方法,我们可以在 多个视图函数 中使用 同样的 渲染逻辑 ,避免 重复的 代码。

设置完ops_render()方法后,就是使用ops_render()方法来实现我们所谓的模板渲染+当前用户信息的双重功能了

返回Flask服务器框架web/controllers/user/User.py

from common.libs.Helper import ops_render

route_user = Blueprint('user_page', __name__)

@route_user.route('/edit')
def edit():
    return ops_render('user/edit.html')

@route_user.route('/reset.pwd')
def resetPwd():
    return ops_render('user/reset_pwd.html')

总结一下ops_render()就是一个大套娃=1个小套娃+1个小工具


使用Pycharm的Ctrl+r统一替换 将render_template 替换为ops_render

Thansks for your time!

Thanks for your watching!

Best Wishs!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11、基于LunarLander登陆器的A2C强化学习(含PYTHON工程)

11、基于LunarLander登陆器的A2C强化学习&#xff08;含PYTHON工程&#xff09; LunarLander复现&#xff1a; 07、基于LunarLander登陆器的DQN强化学习案例&#xff08;含PYTHON工程&#xff09; 08、基于LunarLander登陆器的DDQN强化学习&#xff08;含PYTHON工程&#xff…

thinkcmf 文件包含 x1.6.0-x2.2.3 已亲自复现

thinkcmf 文件包含 x1.6.0-x2.2.3 CVE-2019-16278 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议总结 漏洞名称 漏洞描述 ThinkCMF是一款基于PHPMYSQL开发的中文内容管理框架&#xff0c;底层采用ThinkPHP3.2.3构建。ThinkCMF提出灵活的应用机制&a…

Elasticsearch中复制一个索引数据到新的索引中

问题 我有时候&#xff0c;需要调试一个已经存在的ES索引&#xff0c;需要从已有的索引复制数据到新的索引中去。 解决 这里我借助一个GUI工具&#xff0c;来解决这个问题&#xff0c;底层它是使用Reindex的API实现索引数据复制的。利用Reindex API搞不定这个事情&#xff0…

高德地图_公共交通路径规划API,获取两地点之间的驾车里程和时间

import pandas as pd import requests import jsondef get_dis_tm(origin, destination,city,cityd):url https://restapi.amap.com/v3/direction/transit/integrated?key xxx #这里就是需要去高德开放平台去申请key,请在xxxx位置填写,web服务APIlink {}origin{}&desti…

Laravel的知识点

1.{{ }} 是在 HTML 中内嵌 PHP 的 Blade 语法标识符&#xff0c;表示包含在该区块内的代码都将使用 PHP 来编译运行。 2.两种写法 3.return void 在这段注释中&#xff0c;"return void" 表示该函数或方法没有返回值。这意味着它执行某些操作或任务&#xff0c;但…

基于Java SSM框架实现县小吃门店连锁点餐订餐系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现县小吃门店连锁点餐订餐系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 沙县小吃点餐系统&#xff0c;主要的模块包括实现管理员&#xff1b;个人中心、用户管…

根据commitID删除某一次提交

1.查看提交历史 git log --prettyoneline2.找到需要删除的那个commit,然后找到上次提交的commitID 比如想要删除下面这一条 我们找到上次提交的commitID 3.执行rebase git rebase -i efa11da0a684977bf8ac047ebb803e2ded2063a4 进入编辑状态显示如下 将需要删除的那个提交前…

基于Elemnet-plus 封装的功能表格,基本囊括element-plus 官网表格的所有使用场景

前言 这是一个多用途的基于element-plus 封装的表格组件&#xff0c;基本上elemnet-plus 官网涉及到的使用场景&#xff0c;都可以&#xff0c;而且使用上来说会简单许多&#xff0c;配置上类似与vxe-table 的使用&#xff0c;下面逐一展示各种场景的使用方式&#xff0c;基本上…

<JavaEE> TCP 的通信机制(三) -- 滑动窗口

目录 TCP的通信机制的核心特性 四、滑动窗口 1&#xff09;什么是滑动窗口&#xff1f; 2&#xff09;滑动窗口的作用是什么&#xff1f; 3&#xff09;批量传输出现丢包如何处理&#xff1f; 1> 接收端ACK丢包 2> 发送端数据包丢包 4&#xff09;适用性 TCP的通…

主动学习如何解决数据标注的难题?主动学习和弱监督学习有何区别?

机器学习的成功与否取决于数据标注的质量和数量。利用主动学习的机器学习技术能加快模型训练的进度和减少数据获取的资金投入。依靠主动学习来得到有价值的数据&#xff0c;以便机器模型从中学习。如果一个模型被具有价值的数据加以训练&#xff0c;它将以较少的人工标注和更短…

安防视频监控系统EasyCVR实现H.265视频在3秒内起播的注意事项

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

ZETA落地合肥、宜城南方水泥,纵行科技携手中才邦业助力水泥企业数智化管理

近日&#xff0c;合肥南方水泥、宜城南方水泥落地ZETA预测性维护方案&#xff0c;通过在水泥厂内搭建ZETA网络&#xff0c;并在B类及C类主辅机设备上安装ZETA系列端智能传感器&#xff0c;进行数据采集和监测设备运行状态、以及早期故障警报和诊断&#xff0c;实现水泥生产设备…

PHP的Laravel加一个小页面出现问题(whereRaw的用法)

1.权限更新问题 因为是已经有样例了所以html和php页面很快写出来了 然后就是页面写完了路由不知道在哪写&#xff0c;后来想起来之前有要开权限来着&#xff0c;试了一下&#xff0c;还是不行&#xff0c;不过方向是对了 这是加的路由&#xff0c;不过需要在更新一下权限 这…

零基础刷代码随想录【Day1】|| 二分查找,移除元素

我的个人主页&#xff1a;☆光之梦☆的博客_CSDN博客-C语言基础语法&#xff08;超详细&#xff09;领域博主 欢迎各位 &#x1f44d;点赞 ⭐收藏 &#x1f4dd;评论 我的专栏&#xff1a;C语言基础语法&#xff08;超详细&#xff09;_☆光之梦☆的博客-CSDN博客&#xff08;这…

Ubuntu安装K8S(1.28版本,基于containrd)

原文网址&#xff1a;Ubuntu安装K8S(1.28版本&#xff0c;基于containrd&#xff09;-CSDN博客 简介 本文介绍Ubuntu安装K8S的方法。 官网文档&#xff1a;这里 1.安装K8S 1.让apt支持SSL传输 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certi…

【算法与数据结构】860、LeetCode柠檬水找零

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题的思路比较简单&#xff0c;首先要保存收到的零钱&#xff0c;其次计算找零&#xff0c;最后分解找…

git的常用命令以及在可视化工具中的使用方法

一.引言 想当初在刚进公司的时候&#xff0c;对于git的使用非常不熟悉&#xff0c;特别是分支的概念&#xff0c;导致开发效率变低&#xff0c;故通过此文章&#xff0c;总结git的使用经验 二.Git 常用命令详解 2.1 git clone [url]: 克隆远程仓库到本地 刚开始时&#xff0c…

Anaconda 环境中安装OpenCV (cv2)

1、使用Anaconda 的对应环境&#xff0c;查看环境中的Python版本号 (1)使用Anaconda 查看存在的环境&#xff1a;conda info --env (2)激活环境&#xff1a;conda activate XXX 2、根据版本号&#xff0c;下载对应的 python-opencv 包 &#xff08;1&#xff09;选择国内源的…

K8S网络类型

k8s的网络类型 k8s的通信模式 1 pod内部之间容器与容器之间的通信&#xff0c;在同一个pod中容器是共享资源和网络&#xff0c;使用同一个网络命名空间&#xff0c;可以直接通信 2 同一个node节点之内&#xff0c;不同pod之间的通信&#xff0c;每个pod都有一个全局的真实ip地…

RabbitMQ 报错:Failed to declare queue(s):[QD, QA, QB]

实在没想到会犯这种低级错误。 回顾整理一下吧&#xff1a; 原因&#xff1a;SpringBoot主配置类默认只会扫描自己所在的包及其子包下面的组件。其他位置的配置不会被扫描。 如果非要使用其他位置&#xff0c;就需要在启动类上面指定新的扫描位置。注意新的扫描位置会覆盖默…