flask day 03
文章目录
一.模板
1.模板变量的基本使用
代码demo
py文件:
from flask import Flask, render_template
app = Flask(__name__)
class Person:
type = 'vip'
def is_login(self):
return True
@app.route('/')
def index():
name = 'zs'
info_dict = {"name": "zs", "age": 20}
height_list = [1.7, 1.8]
p = Person()
return render_template("jiaoben.html", name=name, info_dict=info_dict, height_list=height_list, p=p)
if __name__ == '__main__':
app.run(debug=True)
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ name }}<br/>
{{ info_dict }}<br/>
{{ info_dict["age"] }}<br/>
{# 支持点语法进行取值 #}
{{ info_dict.age }}<br/>
{{ height_list }}<br/>
{{ height_list[0] }}<br/>
{{ height_list.0 }}
{# 支持自定义类型 #}
{{ p.type }}<br/>
{# 支持自定义的方法和函数的调用 #}
{{ p.is_login() }}<br/>
</body>
</html>
3.结果
zs
{'name': 'zs', 'age': 20}
20
20
[1.7, 1.8]
1.7
1.7 vip
True
2.过滤器
1.基本要点
过滤器:对模板变量进行格式转换
支持链式调用
部分过滤器可以设置参数
jiaja2模板会对html字符进行自动专业,使用safe过滤器可以取消自动转义
过滤代码块,对代码块里的内容全部格式转换
过滤器本质:函数
- 必须定义形参来接收模板变量的值
- 格式转化后必须将结果return
2.自定义过滤器(重点):
1.定义过滤器函数
2.应用添加
3.代码demo
1.py文件
# 过滤器:对模板变量进行格式转换
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
name = "hello"
height_list = [1.7, 1.8]
info_list = [{"name": "zs", "age": 20}, {"name": "lisi", "age": 34}]
h1_tag = "<h1>大标题</h1>"
return render_template("jiaoben02.html", name=name, height_list=height_list, info_list=info_list, h1_tag=h1_tag)
# 过滤器本质:函数
# 1. 必须定义形参来接收模板变量的值
# 2. 格式转化后必须将结果return
# 1.定义过滤器函数
def do_list_reverse(s, is_copy=False): # 此时s = height_list
if is_copy is True:
# 生成新列表,新列表反转
new_s = s[::-1]
print(s)
return new_s
else:
s.reverse()
# 原列表直接反转
return s
# 2.应用添加
app.add_template_filter(do_list_reverse, "li_reverse")
if __name__ == '__main__':
app.run(debug=True)
2.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ name|upper }}<br/>
{{ name|upper|reverse }}<br/> {# 支持链式调用 #}
{{ height_list|sum }}<br/> {# 部分过滤器可以设置参数 #}
{{ h1_tag|safe }}
{# jiaja2模板会对html字符进行自动专业,使用safe过滤器可以取消自动 #}
{# 过滤代码块,对代码块里的内容全部格式转换 #}
{% filter upper %}
hello<br/>
world<br/>
{% endfilter %}
{#自定义过滤器的使用#}
{{ height_list|li_reverse(is_copy = True) }}
</body>
</html>
3.结果
浏览器:
HELLO
OLLEH
3.5
大标题
HELLO
WORLD
[1.8, 1.7]
pycharm:
[1.7, 1.8]
3.控制代码块(重点)
1代码demo
1.py文件
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
# 条件:只显示4行数据,背景颜色依次为:黄,绿,红,紫
my_list = [
{"id": 1,
"value": "我爱工作"},
{"id": 2,
"value": "工作使人快乐"},
{"id": 3,
"value": "沉迷于工作无法自拔"},
{"id": 4,
"value": "日渐消瘦"},
{"id": 5,
"value": "以梦为马,越骑越傻"}
]
return render_template("jiaoben03.html", my_list=my_list)
if __name__ == '__main__':
app.run(debug=True)
2.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>03</title>
</head>
<body>
<ul>
{% for item in my_list if item.id < 5 %}
{# loop变量记录了和循环有关的数据, 只能在循环中使用 #}
{% if loop.index==1 %}
<li style="background-color: orange">{{ item.value }}</li>
{% elif loop.index==2 %}
<li style="background-color: green">{{ item.value }}</li>
{% elif loop.index==3 %}
<li style="background-color: red">{{ item.value }}</li>
{% else %}
<li style="background-color: purple">{{ item.value }}</li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>
2.结果
4.前后端渲染(了解)
1.要点
后端渲染:在服务端
使用正则表达式直接
进行内容替换
优点:有利于SEO(搜索引擎优化)
缺点:开发时前后端不分离,开发效率低
前端渲染:在前端
使用js动态修改
html内容
优点:
- 开发时前后端分离,
- 可以通过json实现动态加载,实现局部刷新
缺点:
一般前端发起ajax
请求,后端返回json数据,js动态修改
标签
5.模板继承(重点)
1.要点
- 作用:对
html中重复的内容进行抽取
,减少代码的冗余 - 父类文件
- 将共同的内容抽取到父类文件中
- 在出现差异的位置,
定义代码块
- 子类文件
- 继承父类内容
- 重写代码块,实现自定义效果
2.代码demo
1.py文件
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template("demo4_index.html")
@app.route('/detail')
def detail():
return render_template('demo4_detail.html')
if __name__ == '__main__':
app.run(debug=True)
2.html文件
2.1
{#base.html#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>顶部内容</h2> {#将共同的内容抽取到父类文件中#}
{% block content_block %} {#- 在出现差异的位置,`定义代码块`#}
父类内容...
{% endblock %}
<h2>底部内容</h2>
</body>
</html>
2.2
{# detail.html #}
{# 继承父类文件中的内容 #}
{% extends "demo4_base.html" %}
{# `重写代码块`, 实现自定义的效果 #}
{% block content_block %}
<h3>恒指创收盘历史新高 沪指创逾2个月来新高 房地产板块集体爆发</h3>
<p>港股方面今天表现强劲,开年以来的上涨势头仍然延续,恒指收涨1.8%创下收盘新高。此前恒指的峰值是在2007年10月份盘中触及的31958点。</p>
<p>今天恒指51支成份股中,42支上涨,7支下跌,对恒指贡献最大的个股包括建设银行上涨3.7%,腾讯控股上涨2.5%,香港交易所上涨5.9%,工商银行上涨3.3%,中国平安上涨2.8%。</p>
<p>2018年的前15日,恒生指数已经上涨了4.75%,恒生国企指数上涨了6.50%。</p>
<p>兴业证券张忆东在最新报告中表示,港股作为全球估值洼地,不论是分红率高的价值股还是业绩确定的成长股都受益于新一年中资和海外机构资金的重新布局。他维持2016年以来对“港股牛市”的判断,认为2018年港股市场会出现核心资产驱动的慢牛、长牛行情。他还预计今年下半年港股将迎来牛市主升浪。</p>
<p>与A股交相呼应,港股内房股今天也是集体爆发的行情。万科企业涨9.2%,融创中国涨3.7%,碧桂园涨3%,中国恒大涨1.6%。</p>
{% endblock %}
2.3
{# index.html #}
{% extends "demo4_base.html" %}
{% block content_block %}
<li>势如破竹!人民币再度连闯四道关口 在岸、离岸双双升破6.42</li>
<li>凛冬已至,还有多少银行人在假装干银行</li>
<li>人民日报:部分城市楼市放松限制引关注,楼市调控不会“拉抽屉”</li>
<hr/> {#分割横线#}
{# 使用被重写的父类内容 #}
{{ super() }}
{% endblock %}
3.结果
url:index
顶部内容
势如破竹!人民币再度连闯四道关口 在岸、离岸双双升破6.42
凛冬已至,还有多少银行人在假装干银行
人民日报:部分城市楼市放松限制引关注,楼市调控不会“拉抽屉”
父类内容...
底部内容
url:detail
顶部内容
恒指创收盘历史新高 沪指创逾2个月来新高 房地产板块集体爆发
港股方面今天表现强劲,开年以来的上涨势头仍然延续,恒指收涨1.8%创下收盘新高。此前恒指的峰值是在2007年10月份盘中触及的31958点。
今天恒指51支成份股中,42支上涨,7支下跌,对恒指贡献最大的个股包括建设银行上涨3.7%,腾讯控股上涨2.5%,香港交易所上涨5.9%,工商银行上涨3.3%,中国平安上涨2.8%。
2018年的前15日,恒生指数已经上涨了4.75%,恒生国企指数上涨了6.50%。
兴业证券张忆东在最新报告中表示,港股作为全球估值洼地,不论是分红率高的价值股还是业绩确定的成长股都受益于新一年中资和海外机构资金的重新布局。他维持2016年以来对“港股牛市”的判断,认为2018年港股市场会出现核心资产驱动的慢牛、长牛行情。他还预计今年下半年港股将迎来牛市主升浪。
与A股交相呼应,港股内房股今天也是集体爆发的行情。万科企业涨9.2%,融创中国涨3.7%,碧桂园涨3%,中国恒大涨1.6%。
底部内容
6.模板中可以直接使用的变量/函数
1.要点
变量request session g
函数url_for get_flash_message
get_flash_message
:获取所有的闪现消息(一般用于状态提示,如弹窗)
二.CSRF
1.CSRF攻击过程
CSRF:跨站请求伪造
攻击方式:利用状态保持
机制,盗用用户身份,发起非法请求
2.CSRF保护(理解)
访问转账页面时转账路由生成随机令牌发给用户,记录,保存到表单和cookie或session中;
随后校验表单中令牌和cookie中的令牌是否一致。
Flask中的CSRF保护(重点)
-flask组件 flask-wtf
封装了CSRF保护机制
1
app = Flask(__name__)
app.secret_key = "test"
# 开启CSRF保护 (会对每个post请求进行csrf校验, 校验表单和session中csrf_token字段的令牌是否一致, 不一致则拒绝访问)
CSRFProtect(app)
2
{# csrf_token()函数内部会先生成一个随机令牌, 然后保存到session中, 最后将令牌设置为返回值 #}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
三 .flask-sqlalchemy
1.ORM
flask-sqlalchemy: 让flask框架可以集成sqlalchemy框架
sqlalchemy: python中最著名的ORM
框架
ORM: 对象关系映射, 可以允许开发者使用原生代码
的方式来操作数据库
- 优点:
开发者不用写SQL语句
, 而且也不需要学习其他数据库的SQL语法
-缺点: 存在一定的性能缺失
2.配置和连接
-
需要安装
flask-sqlalchemy
和flask-mysqldb
如果不能连接flask-mysqldb
,可改用pymysql
-
连接数据库
设置数据库的连接地址 app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@127.0.0.1:3306/py24"
3.构建表
demo
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 设置数据库的连接地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:root@127.0.0.1:3306/py24"
# 设置是否追踪数据库变化 (一般不开启, 影响性能)
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 设置是否在控制台显示底层执行的SQL语句
app.config['SQLALCHEMY_ECHO'] = False
# 创建数据库连接对象
db = SQLAlchemy(app)
# 类->表 类属性->字段 实例对象->记录
class User(db.Model):
__tablename__ = "t_user" # 设置表名 默认为类名的小写
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(40), unique=True, nullable=False) # 值唯一, 且不能为空
age = db.Column(db.Integer)
@app.route('/')
def index():
return "index"
if __name__ == '__main__':
# 删除所有继承自db.Model的表
db.drop_all()
# 创建所有继承自db.Model的表
db.create_all()
app.run(debug=True)