【Python】Flask系列-模板笔记
Jinja2模板
Jinja2模板传参
- 如何渲染模板:
- 模板放在
templates文件夹下 - 从
flask中导入render_template函数。 - 在视图函数中,使用
render_template函数,渲染模板。注意:只需要填写模板的名字,不需要填写templates这个文件夹的路径。
- 模板放在
- 模板传参:
- 如果只有一个或者少量参数,直接在
render_template函数中添加关键字参数就可以了。 - 如果有多个参数的时候,那么可以先把所有的参数放在字典中,然后在
render_template中,
使用两个星号,把字典转换成关键参数传递进去,这样的代码更方便管理和使用。
- 如果只有一个或者少量参数,直接在
- 在模板中,如果要使用一个变量,语法是:
{{params}} - 访问模型中的属性或者是字典,可以通过
{{params.property}}的形式,或者是使用{{params['age']}}.
示例代码
06template01 .py
#encoding: utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
# 类
class Person(object):
name = u'p17bdw'
age = 18
p = Person()
context = {
'username': u'c17bdw',
'gender': u'男',
'age': 17,
'person': p, # 声明
'websites': {
'baidu': 'www.baidu.com',
'google': 'www.google.com'
}
}
return render_template('anthoer/index.html',**context)
if __name__ == '__main__':
app.run(debug=True)
anthoer/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
这是HTML文件中出现的文字
<p>用户名:{{ username }}</p>
<p>性别:{{ gender }}</p>
<p>年龄:{{ age }}</p>
<hr>
<p>名字:{{ person['name'] }}</p>
<p>年龄:{{ person.age }}</p>
<hr>
<p>百度:{{ websites['baidu'] }}</p>
<p>谷歌:{{ websites['google'] }}</p>
</body>
</html>
if判断
语法:
{% if xxx %} {% else %} {% endif %}if的使用,可以和python中相差无几。
示例代码
07if_statement .py
# 输入 http://127.0.0.1:5000/1/ 为登录状态,否则为未登录状态。
#encoding: utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/<is_login>/')
def index(is_login):
if is_login == '1':
user = {
'username': u'17bdw',
'age':20
}
return render_template('index.html',user=user)
else:
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{% if user and user.age > 18 %}
<a href="#">{{ user.username }}</a>
<a href="#">注销</a>
{% else %}
<a href="#">登录</a>
<a href="#">注册</a>
{% endif %}
</body>
</html>
for循环遍历列表和字典
- 字典的遍历,语法和
python一样,可以使用items()、keys()、values()、iteritems()、iterkeys()、itervalues()
{% for k,v in user.items() %} <p>{{ k }}:{{ v }}</p> {% endfor %} - 列表的遍历:语法和
python一样。
{% for website in websites %} <p>{{ website }}</p> {% endfor %}
示例代码
08for_statement .py
#encoding: utf-8
from flask import Flask,render_template
app = Flask(__name__)
# for遍历字典
@app.route('/')
def index():
books = [
{
'name': u'西游记',
'author': u'吴承恩',
'price': 109
},
{
'name': u'红楼梦',
'author': u'曹雪芹',
'price': 200
},
{
'name': u'三国演义',
'author': u'罗贯中',
'price': 120
},
{
'name': u'水浒传',
'author': u'施耐庵',
'price': 130
}
]
return render_template('index.html',books=books)
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table>
<thead>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
过滤器
- 介绍和语法:
- 介绍:过滤器可以处理变量,把原始的变量经过处理后再展示出来。作用的对象是变量。
- 语法:
{{ avatar|default('xxx') }}
- default过滤器:如果当前变量不存在,这时候可以指定默认值。
- length过滤器:求列表或者字符串或者字典或者元组的长度。
常用的过滤器:
abs(value):返回一个数值的绝对值。示例:-1|abs
default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。示例:name|default('xiaotuo')——如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。
escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。示例:content|escape或content|e。
first(value):返回一个序列的第一个元素。示例:names|first
format(value,*arags,**kwargs):格式化字符串。比如:{{ "%s" - "%s"|format('Hello?',"Foo!") }}
将输出:Helloo? - Foo!
last(value):返回一个序列的最后一个元素。示例:names|last。length(value):返回一个序列或者字典的长度。示例:names|length。
join(value,d=u''):将一个序列用d这个参数的值拼接成字符串。
safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe。
int(value):将值转换为int类型。
float(value):将值转换为float类型。
lower(value):将字符串转换为小写。
upper(value):将字符串转换为小写。
replace(value,old,new): 替换将old替换为new的字符串。
truncate(value,length=255,killwords=False):截取length长度的字符串。
striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。
trim:截取字符串前面和后面的空白字符。
string(value):将变量转换成字符串。
wordcount(s):计算一个长字符串中单词的个数。
示例代码
09filter_demo .py
#encoding: utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
comments = [
{
'user': u'admin',
'content': 'xxxx'
},
{
'user': u'tesr',
'content': 'xxxx'
}
]
return render_template('index.html',comments=comments)
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器</title>
</head>
<body>
# 如果avatar这个变量不存在,就使用default过滤器提供的值
<img src="{{ avatar|default('http://avatar.csdn.net/1/D/B/3_hmzkekek41.jpg') }}" alt="">
<hr>
# length 计算长度
<p>评论数:({{ comments|length }})</p>
<ul>
{% for comment in comments %}
<li>
<a href="#">{{ comment.user }}</a>
<p>{{ comment.content }}</p>
</li>
{% endfor %}
</ul>
</body>
</html>
继承和block
- 继承作用和语法:
- 作用:可以把一些公共的代码放在父模板中,避免每个模板写同样的代码。
- 语法:
{% extends 'base.html' %}
- block实现:
- 作用:可以让子模板实现一些自己的需求。父模板需要提前定义好。
- 注意点:字模板中的代码,必须放在block块中。
示例代码
app.py
#encoding: utf-8
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login/')
def login():
return render_template('login.html')
if __name__ == '__main__':
app.run(debug=True)
index.html
# 基础页面
{% extends 'base.html' %}
{% block head %}
<style>
</style>
<link rel="stylesheet" href="">
<script></script>
{% endblock %}
{% block title %}
首页
{% endblock %}
{% block main %}
<h1>这是首页</h1>
{% endblock %}
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
<style>
.nav{
background: #3a3a3a;
height: 65px;
}
ul{
overflow: hidden;
}
ul li{
float: left;
list-style: none;
padding: 0 10px;
line-height: 65px;
}
ul li a{
color: #fff;
}
</style>
{% block head %}{% endblock %}
</head>
<body>
<div class="nav">
<ul>
<li><a href="/">首页</a></li>
<li><a href="/login">发布问答</a></li>
</ul>
</div>
{% block main %}{% endblock %}
</body>
</html>
login.html
{% extends 'base.html' %}
{% block title %}
登录
{% endblock %}
{% block main %}
<h1>这是登录页面</h1>
{% endblock %}
url链接
使用url_for(视图函数名称)可以反转成url。
加载静态文件
- 语法:
url_for('static',filename='路径') - 静态文件,flask会从
static文件夹中开始寻找,所以不需要再写static这个路径了。 - 可以加载
css文件,可以加载js文件,还有image文件。
第一个:加载css文件 <link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}"> 第二个:加载js文件 <script src="{{ url_for('static',filename='js/index.js') }}"></script> 第三个:加载图片文件 <img src="{{ url_for('static',filename='images/zhiliao.png') }}" alt="">
【Python】Flask系列-模板笔记的更多相关文章
- 知了课堂 Python Flask零基础 笔记整理
目录 起步 安装Python2.7: Python虚拟环境介绍与安装: pip安装flask: 认识url: URL详解 web服务器和应用服务器以及web应用框架: Flask 第一个flask程序 ...
- 【Python】Flask系列-数据库笔记
MySQL-python中间件的介绍与安装: 1.如果是在类unix系统上,直接进入虚拟环境,输入sudo pip install mysql-python. 2.如果是在windows系统上,那么在 ...
- Python Flask Jinja2模板引擎
模板 简介 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道. 渲染 使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染.为了渲染模 ...
- [python][flask] Jinja 模板入门
Flask 和 Django 附带了强大的 Jinja 模板语言. 对于之前没有接触过模板语言的人来说,这类语言基本上就是包含一些变量,当准备渲染呈现 HTML 时,它们会被实际的值替换. 这些变量放 ...
- Python——Flask框架——模板
一.渲染模板 render_template 函数把Jinja2模板引擎集成到程序中 二.Jinja2变量过滤器 过滤器名 说明 safe 渲染值是不转义 capitalize 把值得首字母转换成大写 ...
- Python FLask Web 学习笔记:jinjia2的使用方法1
# coding:utf-8 from jinja2 import Template x = """ <p>大爷的孙子</p> <ul> ...
- Python Flask 开发学习笔记
Flask学习 安装pipenv虚拟环境 pip Install pipenv 运行pipenv pipenv --version 进入虚拟容器 pipenv install 安装flask pipe ...
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- [python][flask] Flask 图片上传与下载例子(支持漂亮的拖拽上传)
目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html ...
随机推荐
- 第二阶段团队冲刺——One
个人任务: 司宇航:处理第一次启动服务器500的问题. 季方:优化cookie第一次运行出错的问题. 王金萱:修改注册界面. 马佳慧:修改登录界面. 站立会议: 任务看板和燃尽图:
- 祝贺自己操作系统JAVA项目有进展!!
先公布研发过程的心得吧!!! ^_^ /** * 作者:范铭祥 * 内容及功能: 显示框创造1.0 * 我将在这个类里 一:面板1:用来先显示一副图表示顺序和处理中 * 二:面板2:类1:用来显示要处 ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- HUAS 2018暑假第一周比赛-题解
小朋友们有问题评论区 :) B. 子串计算 难度系数 : ☆ Main idea : 模拟 暴力 按照题目的要求一步一步来就行了 之所以可行的原因是从左往右扫,如果扫到一个子串,把它删除掉之后,假设当 ...
- 【设计模式】—— 备忘录模式Memento
前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...
- [代码]--GridControl使用技巧总结,更新中...
1如何禁用GridControl中单击列弹出右键菜单 设置Run Design->OptionsMenu->EnableColumnMenu 设置为:false 2如何定位到第一条数据/记 ...
- call/cc 总结 | Scheme
call/cc 总结 | Scheme 来源 https://www.sczyh30.com/posts/Functional-Programming/call-with-current-contin ...
- oracle clob blob dblink
Create global temporary table temp on commit preserve rows as select * from abc@xxx select * from te ...
- MT【174】凹凸无妨
已知函数$f(x)=|x^3+3x^2-ax-b|$,对任意$a,b\in R$存在$x\in[-3,0]$使得$f(x)\le m$成立,求$m$的范围.求 $\displaystyle\min_{ ...
- python里使用正则表达式的非贪婪模式
在正则表达式里,什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc"; Patter p="ab*c"; 贪婪匹配:正则表达式一般趋向 ...