Flask 模板语言,装饰器
Jinja2模板语言
- # -*- coding: utf-8 -*-
- from flask import Flask, render_template, request, redirect, Markup
- app = Flask(__name__)
- STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}
- STUDENT_LIST = [
- {'name': 'Old', 'age': 38, 'gender': '中'},
- {'name': 'Boy', 'age': 73, 'gender': '男'},
- {'name': 'EDU', 'age': 84, 'gender': '女'}
- ]
- STUDENT_DICT = {
- 1: {'name': 'Old', 'age': 38, 'gender': '中'},
- 2: {'name': 'Boy', 'age': 73, 'gender': '男'},
- 3: {'name': 'EDU', 'age': 84, 'gender': '女'},
- }
- # 返回标签
- tag = '<input type="text", name="username">'
- tag = Markup(tag) # 安全标签字符串
- # 传入函数, 全局可以使用
- @app.template_global()
- def func(a, b):
- return a + b
- @app.template_filter()
- def fil(a, b, c):
- return a + b + c
- @app.route('/')
- def index():
- return render_template('index.html', stu=STUDENT,
- stu_list=STUDENT_LIST,
- stu_dic=STUDENT_DICT,
- tagtag=tag) # 传递参数给前端
- @app.route('/login', methods=['POST', 'GET'])
- def login():
- if request.method == 'GET':
- return render_template('login.html')
- if request.form.get('username') == 'root' or request.form.get('password') == 'root':
- return redirect('/')
- app.run(host='0.0.0.0', debug=True)
前端展示:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>首页</title>
- </head>
- <body>
- {{ tag }} {# 后端传入标签 #}
- {{ func(1, 2) }} {# 函数调用 #}
- {{ func(1, 2) | fil(1, 2) }} {# 将 | 前面当成第一个参数传入 #}
- {% macro create_drf(na, ty) %} {# 声明函数 叫宏#}
- {# {{ na }}: {{ ty }} <input name="{{ na }}", type="{{ ty }}">#}
- {{ na + ty }}
- {% endmacro %}
- {# 调用 macro #}
- {#{{ create_drf('username', 'text') }}#}
- {{ create_drf(1, 2) }}
- <br>
- 学生信息{{ stu }}
- <table border="2px">
- <tr>
- <td>{{ stu.name }}</td> {# 三种取值的方式 #}
- <td>{{ stu.get('age' )}}</td>
- <td>{{ stu['gender'] }}</td>
- </tr>
- </table>
- {{ stu_list }}
- <table border="2px">
- {% for stu in stu_list %} {# 遍历列表 #}
- <tr>
- <td>{{ stu.name }}</td>
- <td>{{ stu.get('age')}}</td>
- <td>
- {% if stu['gender'] == '中' %} {# for循环 #}
- 男
- {% else %}
- {{ stu['gender'] }}
- {% endif %}
- </td>
- </tr>
- {% endfor %}
- </table>
- {{ stu_dic }}
- <table border="2px">
- {% for id, info in stu_dic.items() %} {# 遍历字典 keys. vals #}
- <tr>
- <td>{{ id }}</td>
- <td>{{ info.name }}</td>
- <td>{{ info.get('age') }}</td>
- <td>{{ info['gender'] }}</td>
- </tr>
- {% endfor %}
- </table>
- </body>
- </html>
Session
- # -*- coding: utf-8 -*-
- from flask import Flask, session, render_template, request, redirect
- app = Flask(__name__)
- app.secret_key = 'ujyujyunyun#yurefrefr' # 加密字符串
- @app.route('/')
- def index():
- if not session.get('user'):
- return redirect('/login')
- return render_template('index2.html')
- @app.route('/login', methods=['POST', 'GET'])
- def login():
- if request.method == 'GET':
- return render_template('login.html')
- if request.form.get('username') == 'root':
- session['user'] = 'peach' # 设置session,存放在了客户端(我们映像中session是存在服务端的)
- # 因为,flask 为了精简自己,不往自己和内存中添加,就是通过secret_key 加密放在客户端浏览器
- # 因此,引入的第三方组件 flask-session,相对安全解决了session存放在浏览器问题
- return redirect('/')
- app.run(host='0.0.0.0', debug=True)
装饰器
通用装饰器
- # 装饰器
- def waibu(func):
- def neibu(*args, **kwargs):
- ret = func(*args, **kwargs)
- return ret
- return neibu
- def f(a, b):
- return a + b
- # print(waibu(f)) # <function waibu.<locals>.neibu at 0x7fb86dffe2f0> 得到一个内部函数neibu
- ni = waibu(f)
- pint(ni(1, 2))
多个装饰器装饰的时候该如何添加
- # 添加装饰器
- def wai(func):
- def neibu(*args, **kwargs):
- if session.get('user'):
- ret = func(*args, **kwargs)
- return ret
- else:
- redirect('/login')
- return neibu
- @app.route('/')
- @wai
- def index():
- if not session.get('user'):
- return redirect('/login')
- return render_template('index2.html')
- 我们应该是添加在靠近函数那里,如上图
- 因为wai 等价于ni = neibu(index)
- Neibu() 函数传入的是index, 先执行玩视图,在执行外面的路由
装饰器装饰多个函数的时候,出现太多

因为装饰器装饰完后返回的都是ni,两个装饰的都是ni,所有出问题,这里跟函数名相同的情况下,报错的原因一摸一样

- 因此我们有两种方案解决
- 第一种:
- 装饰器返回的是内存地址,<function waibu.<locals>.neibu at 0x7fb86dffe2f0> 得到一个内部函数neibu
- 我们保留内部原始数据,就引入了functools

- 第二种:
- 是flask内部的 endpoint

- Endpoint的作用相当于url_for,反相获取到路由地址 / /index
- 这两种都可以解决 装饰器问题
Flask 模板语言,装饰器的更多相关文章
- flask模板语言,装饰器,路由及配置
1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...
- Flask - 模板语言jinja2 和render_template高级用法
目录 Flask - 模板语言jinja2 和render_template高级用法 一. 字典传递至前端 二. 列表传入前端Jinja2 模板的操作: 三. 大字典传入前端 Jinja2 模板 四. ...
- flask模板语言 jinja2 以及render_template 深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- flask session,蓝图,装饰器,路由和对象配置
1.Flask 中的路由 *endpoint - url_for 反向地址 *endpoint 默认是视图函数名 *methods 指定视图函数的请求方式,默认GET defaults={& ...
- flask模板语言
由于Django的模板引擎和Flask中的Jinja2模板引擎有很多一样的地方,所以我将一样的地方总结到了独立的文章中 https://www.cnblogs.com/kuxingseng95/art ...
- python flask route中装饰器的使用
问题:route中的装饰器为什么感觉和平时使用的不太一样,装饰器带参数和不太参数有什么区别?被修饰的函数带参数和不带参数有什么区别? 测试1:装饰器不带参数,被修饰的函数也不带参数. def log( ...
- flask --- 03 .特殊装饰器, CBV , redis ,三方组件
一.特殊装饰器(中间件) 1.before_request 在请求进入视图函数之前 @app.before_request def look(): 2. after_request 在结束视图函数之后 ...
- Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...
- flask(1.1)装饰器装饰多个视图函数出现的问题
目录 1.装饰器装饰多个视图函数出现的问题 2.使用装饰器修复技术解决该问题 1.装饰器装饰多个视图函数出现的问题 代码实例: from flask import Flask, request, re ...
随机推荐
- 2019-2020-1 20199304《Linux内核原理与分析》第二周作业
计算机工作原理 存储程序计算机模型 冯·诺依曼体系结构 冯·诺依曼体系结构如图所示: 冯·诺依曼体系结构包含五大部分 运算器:在控制器的统一控制下,负责对数据进行加工.完成各种运算,如算术运算.逻辑运 ...
- 一文了解Nuget的使用
Nuget介绍 官网定义:NuGet是.NET的软件包管理器(免费).NuGet客户端工具提供了生成和使用软件包的能力.NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库. ...
- 设计模式GOF23(行为型模式)
场景: – 公司里面,报销个单据需要经过流程: • 申请人填单申请,申请给经理 • 小于1000,经理审查. • 超过1000,交给总经理审批. • 总经理审批通过 – 公司里面,请假条的审批过程: ...
- MongoDB的第二天(更新,删除,查询,索引)
Mongodb的更新方式有三种 update函数,操作符更新,save函数 update: 语法格式:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选) ...
- Python字符串学习
Python字符串(不可变的): 一.相关的运算: 1.字符串的拼接: str = str1 + str2 2.字符串的重复: print(str * 3) 3.下标访问字符串某个字符: str[1] ...
- 第4节:Java基础 - 必知必会(中)
第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...
- 2017 CCPC杭州 题解
2017CCPC杭州题目PDF Problem A. Super-palindrome 题解: 给你一个字符串,每一步可以将一个字符替换为另一个字符,问你最少多少步可以使得,该字符串任意奇数子串为回文 ...
- 10分钟搞定nginx实现负载均衡
10.1 负载均衡的概念 对用户请求的数据进行调度的作用 对用户访问的请求网站可以进行压力的分担 10.2 常见的代理方式 10.2.1 正向代理 10.2.2 反向代理 10.3 负载均衡的部署环节 ...
- [golang] nats的消息传递模型介绍
目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...
- 模拟摄像头解码模块最新测试 TVP5150模块 FPGA+SDRAM+TVP5150+VGA 实现PAL AV输入 VGA视频输出
模拟摄像头解码模块最新测试 TVP5150模块 FPGA+SDRAM+TVP5150+VGA 实现PAL AV输入 VGA视频输出 测试使用电视机顶盒的AV模拟信号输入,VGA显示器输出测试,效 ...