模板继承
在模板中,可能会遇到以下情况:
-
多个模板具有完全相同的顶部和底部内容
-
多个模板中具有相同的模板代码内容,但是内容中部分值不一样
-
多个模板中具有完全相同的 html 代码块内容
像遇到这种情况,可以使用 JinJa2 模板中的 继承 来进行实现
模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
-
标签定义的内容
{% block top %} {% endblock %}
-
相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
-
子模板使用 extends 指令声明这个模板继承自哪个模板
-
父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
父模板代码:
base.html
{% block top %} 顶部菜单 {% endblock top %} {% block content %} {% endblock content %} {% block bottom %} 底部 {% endblock bottom %}
子模板代码:
-
extends指令声明这个模板继承自哪
{% extends 'base.html' %} {% block content %} 需要填充的内容 {% endblock content %}
模板继承使用时注意点:
-
不支持多继承,但是支持多层继承
-
为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。
-
不能在一个模板文件中定义多个相同名字的block标签。
-
当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。
在 Flask 项目中解决 CSRF 攻击
flask-wtf 和wtforms组件,类似django的Forms组件
pip install flask_wtf
在 Flask 中, Flask-wtf 扩展有一套完善的 csrf 防护体系,对于我们开发者来说,使用起来非常简单
-
设置应用程序的 secret_key,用于加密生成的 csrf_token 的值
# session加密的时候已经配置过了.如果没有在配置项中设置,则如下: app.secret_key = "#此处可以写随机字符串#"
-
导入 flask_wtf.csrf 中的 CSRFProtect 类,进行初始化,并在初始化的时候关联 app
from flask_wtf import CSRFProtect CSRFProtect(app)
-
在表单中使用 CSRF 令牌:
<form method="post" action="/"> <input type="hidden" name="csrf_token" value="{ { csrf_token() }}" /> </form>
数据库操作
ORM
ORM 全拼Object-Relation Mapping
,中文意为 对象-关系映射。主要实现模型对象到关系数据库数据的映射
优点 :
-
只需要面向对象编程, 不需要面向数据库编写代码.
-
对数据库的操作都转化成对类属性和方法的操作.
-
不用编写各种数据库的
sql语句
.
-
-
实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
-
不再需要关注当前项目使用的是哪种数据库。
-
通过简单的配置就可以轻松更换数据库, 而不需要修改代码.
-
缺点 :
-
相比较直接使用SQL语句操作数据库,有性能损失.
-
根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.
Flask-SQLAlchemy
flask默认提供模型操作,但是并没有提供ORM,所以一般开发的时候我们会采用flask-SQLAlchemy模块来实现ORM操作。
SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。
SQLAlchemy: https://www.sqlalchemy.org/
安装 flask-sqlalchemy
pip install flask-sqlalchemy
如果连接的是 mysql 数据库,需要安装 mysqldb 驱动
pip install flask-mysqldb
安装flask-mysqldb时,注意
安装 flask-mysqldb的时候,python底层依赖于一个底层的模块 mysql-client模块 如果没有这个模块,则会报错如下: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-21hysnd4/mysqlclient/
解决方案:
apt-get install libmysqlclient-dev python3-dev 运行上面的安装命令如果报错: dpkg 被中断,您必须手工运行 ‘sudo dpkg --configure -a’ 解决此问题。 则根据提示执行命令以下命令,再次安装mysqlclient sudo dpkg --configure -a sudo apt-get install libmysqlclient-dev python3-dev 解决了mysqlclient问题以后,重新安装 flask-mysqldb即可。 pip install flask-mysqldb
数据库连接设置
-
在 Flask-SQLAlchemy 中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的 SQLALCHEMY_DATABASE_URI 键中
config.py,配置文件代码:
class Config(object): DEBUG = True SECRET_KEY = "*(%#4sxcz(^(#$#8423" # 数据库链接配置: #数据类型://登录账号:登录密码@数据库主机IP:数据库访问端口/数据库名称 SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flask_students"
-
其他设置:
# 动态追踪修改设置,如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS = True #查询时会显示原始SQL语句 SQLALCHEMY_ECHO = True
-
配置完成需要去 MySQL 中创建项目所使用的数据库
$ mysql -uroot -p123 mysql > create database flask_students charset=utf8mb4;
常用的SQLAlchemy字段类型
类型名 | python中类型 | 说明 |
---|---|---|
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是16位 |
BigInteger | int或long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 普通数值,一般是32位 |
String | str | 变长字符串 |
Text | str | 变长字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长Unicode字符串 |
UnicodeText | unicode | 变长Unicode字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 日期 |
Time | datetime.datetime |