首页 > 其他分享 >两天学会flask(六)---模板-上下文环境(3)(20分钟)

两天学会flask(六)---模板-上下文环境(3)(20分钟)

时间:2023-04-27 10:00:35浏览次数:32  
标签:__ index 20 render flask app --- template login

flask模板---上下文环境

在前面的示例中,想要在模板里显示数据,只能通过在render_template函数里传参数来解决。但对于flask的上下文变量和自定义上下文变量,则不必如此,你可以直接在模板里使用他们。

1. request

请求对象request,携带了大量有关请求的信息,比如请求的path,url,参数,你可以在模板里直接使用他们,新建index.html文件。

新建request.py文件:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/index')
def index():
    return render_template("index.html")

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

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flask</title>
</head>
<body>
    {{ "你请求的path:" + request.path }}
</body>
</html>

2. session

会话对象session保存当前会话的状态,同样可以在模板里使用

from flask import Flask, render_template, session

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/index')
def index():
    session['username'] = 'liang'
    return render_template("index.html")

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

session.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flask</title>
</head>
<body>
    {{ "你请求的path:" + request.path }}  <br>
    {{ "用户名:" + session.username }}
</body>
</html>

3. g

flask的全局变量g,一般用于保存请求中会用到的全局对象

from flask import Flask, render_template, session, g

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/g')
def index():
    g.user = 'admin'
    return render_template("g.html")

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

g.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ "当前对象:" + g.user }}
</body>
</html>

4. url_for

url_for被用来构建url,某一天,你修改了一个视图所处理的url后,url_for可以让你无需修改任何前端代码。

from flask import Flask, render_template, session, g

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/index')
def index():
    return render_template("index.html")


@app.route('/login')
def login():
    return 'login'

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

url_for.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{{ url_for('login') }}">login</a>
</body>
</html>

我增加了一个login视图,用来处理path为/login的视图,在前端模板里,我放置一个连接

<a href="{{ url_for('login') }}">login</a>

注意,url_for函数里的login指向的是函数login。如果某天,你修改了登录用的path

@app.route('/user/login')
def login():
    return 'login'

那么前端a标签里的href属性也会随之修改,url_for是通过与视图函数关联来投建url地址的。

5. get_flashed_messages

get_flashed_messages 用于获取后端flash的消息用于展示,它也可以在模板里使用

from flask import Flask, render_template, session, g, flash

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/index')
def index():
    flash("登录成功")
    return render_template("index.html")


@app.route('/login')
def login():
    return 'login'

if __name__ == '__main__':
    app.run(debug=True)
get_flashed_messages.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% for message in get_flashed_messages() %}
        <div class=flash>{{ message }}</div>
    {% endfor %}
<a href="{{ url_for('login') }}">login</a>
</body>
</html>

6. 自定义上下文变量

使用context_processor装饰器,可以自定义上下文变量

from flask import Flask, render_template, session, g, flash

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/index')
def index():
    flash("登录成功")
    return render_template("自定义上下文变量.html")

@app.context_processor
def info():
    return dict(appname='coolpython')

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

在模板里使用时,和函数无关,关键要求是被装饰的函数返回一个字典,在模板里,直接使用字典的key就可以获得对应的value

自定义上下文变量.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>{{ "appname: " + appname}}</p>
</body>
</html>

7.自定义上下文函数

原理和变量一样,只是返回的字典里,value是函数

from datetime import datetime

from flask import Flask, render_template, session, g, flash

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/index')
def index():
    flash("登录成功")
    return render_template("自定义上下文函数.html")

@app.context_processor
def info():
    def show_time(format="%Y-%m-%d %H:%M:%S"):
        return datetime.now().strftime(format)
    return dict(show_time=show_time)

if __name__ == '__main__':
    app.run(debug=True)
自定义上下文函数.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p><p>{{ "当前时间: " + show_time()}}</p></p>
</body>
</html>

 

 

标签:__,index,20,render,flask,app,---,template,login
From: https://www.cnblogs.com/joyware/p/17358104.html

相关文章

  • 无界微前端方案官方示例,main-vue 项目打包之后 访问index.html页面空包,控制台报资源错
    报错信息: 修改方案: publicPath:“./”修改为如上配置即可。......
  • WPF教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介WPF(WindowsPresentationFoundation)是微软推出的基于Windows的用户界面框架,属于.NETFramework的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。WPF初入门教程-从简单的步骤了......
  • python+playwright 学习-58 Jenkins上使用 Pipeline 运行 playwright 自动化脚本
    前言Dockerfile.focal可用于在Docker环境中运行Playwright脚本。这些镜像包括在Docker容器中运行浏览器所需的所有依赖项,还包括浏览器本身。playwright在linux系统上目前只支持Ubuntu系统的部分版本,centos和debian系统上是没法运行的。jenkins环境准备需安装2个跟d......
  • 界面控件DevExpress Blazor UI v22.2 - 支持.NET 7
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具,该组件拥有众多新产品和数十个具有高影响力的功能,可为桌面、Web和移动应用提供直观的解决方案,全面解决各种使用场......
  • Using base64 encoding and decoding for file transfer in AX 2012
    Base64BinDataIfyouwanttotransfersmallfiledatausingAXanddonotwanttomakeuseofsharedfoldersorfileuploading,sendingyourfiledirectlyinsideyourXMLmessageasbase64encodedstringisagoodoption.Base64givesyouthepossibil......
  • Qt音视频开发41-文件推流(支持网页和播放器播放并切换进度)
    一、前言本功能最初也是有一些人提过类似的需求,就是能不能将本地的音视频文件,通过纯Qt程序推流出去,然后用户可以直接在网页上播放,也可以用各种播放器播放,然后还可以任意切换播放进度,其实说白了就是个文件服务器,用户通过网络地址访问以后,告诉对方当前是媒体文件就会自动播放,是其他......
  • 产品原型20-20230426
              ......
  • 递归比较两个字典差异-python dict different
    deffindDiff(d1,d2,path=""):forkind1:if(knotind2):print(path,":")print(k+"askeynotind2","\n")else:iftype(d1[k])isdict:......
  • EBS: APP-PER-50022: ORACLE 人力资源管理系统无法检索用户类型配置文件选项的值
    在PO模块设置的人员,点击“人员”功能菜单时,提示: APP-PER-50022。。。。。的错误。路径:PO》》设置》》人员。APP-PER-50022:ORACLE人力资源管理系统无法检索用户类型配置文件选项的值。请确保为您的责任正确设置此值。尝试解决方式(失败了):  PROFILE |     ......
  • 计算机网络----网络层
    《网络层概述》 来看一群网络,如果只是网络独立各自通信,那么只要实现物理层和数据链路层即可(一朵云中的多个节点通过交换机实现通信)如果想要实现这群网络之间的通信,则是网络层干的事情了(各个云之间通过路由器实现通信)《网络层需要解决的问题》  1.网络层提供两......