一、jsonify
jsonify 是flask的函数,可以将字典转换成json数据返回给浏览器
二、 钩子函数
@app.before_first_request:第一次请求调用,用于初始化数据
@app.before_request:每次请求调用
@app.after-request:每次请求后调用
@app.teardown_request:异常发生后调用
about(400):捕获异常,终止函数,返回状态码
@app.errorhandler(400):捕获异常,返回相应信息
三、模板语言中的过滤器:
用法:{{ param|capitalize }}
capitalize:首字母大写
upper:大写
lower:小写
reverse:反转
safe:告知浏览器变量中的内容是安全的
4.自定义过滤器:
1.在试图模块中定义过滤器函数
2.使用app.add_template_filter(过滤器函数名,'list_name')
3.用法:{{ param|list_name }}
四、配置文件相关内容
1 # 配置文件
2 class Config(object):
3 # debug模式配置
4 # DEBUG=True
5 LOG_LEVEL = logging.DEBUG
6 # mysql 配置
7 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:000000@127.0.0.1:3306/news'
8 SQLALCHEMY_TRACK_MODIFICATIONS = False
9 SQLALCHEMY_ECHO = True
10 # redis 配置信息
11 REDIS_HOST = '127.0.0.1'
12 REDIS_PORT = 6379
13 # session 配置
14 SESSION_TYPE = 'redis'
15 SESSION_USE_SIGNER = True
16 SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT,db=1)
17 PERMANENT_SESSION_LIFETIME = 3600
18 SECRET_KEY = 'KZtgoZECnZyp/hiU49YHotf2Nv4IGYqF5I7M6K3iClzvTWYtALha9E2i7wgIK78X'
配置
五、csrf_token设置
1 @app.after_request
2 def after_request(response):
3 from flask_wtf.csrf import generate_csrf
4 csrf_token = generate_csrf()
5 response.set_cookie('csrf_token', csrf_token)
6 return response
csrf_token
六、404页面
@app.errorhandler(404)
@user_login_data
def page_not_found(_):
user=g.user
data={'user_info':user.to_dict() if user else None}
return render_template('news/404.html',data=data)
404
七、orm
1.orm-select
1 from flask import Flask
2 from flask_sqlalchemy import SQLAlchemy
3
4 app=Flask(__name__)
5 # app.cofig['SQLALCHEMY_DATABASE_URI']=''
6 # 设置数据库的连接选项
7 # 语法形式: mysql://username:password@host:port/dbname
8 # mysql://root:mysql@127.0.0.1:3306/db_34
9 app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:mysql@127.0.0.1:3306/db')
10
11 # SQLALCHEMY_TRACK_MODIFICATIONS
12 # 是否设置跟踪模式,这个跟踪模式是需要消耗资源的 所以我们给它设置位False
13 # 默认值 位None,系统会发出一个警告
14 app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
15
16 # 让sql语句输出在控制台
17 app.config['SQLALCHEMY_ECHO']=False
18
19 #创建SQLAlchemy的实例对象
20 # app 参数: 就是 flask的实例对象
21 db = SQLAlchemy(app=app)
22
23
24 # 数据库中的一个表就需要对应我们的 一个模型
25 """
26 1.模型需要继承自 db.Model
27 2.定义字段(属性)
28 字段名: 不要使用python关键字 不要用mysql关键字
29 字段类型: 其实是和mysql类似的
30 字段选项:
31 primary_key :默认设置主键 会自动增长
32 unique
33 nullable
34 default
35 """
36 class BookInfo(db.Model):
37
38 #修改表明
39 __tablename__='bookinfo'
40
41 # 主键
42 id=db.Column(db.Integer,primary_key=True)
43
44 name=db.Column(db.String(20),unique=True,nullable=False)
45 #发布日期
46 pub_date=db.Column(db.Date,nullable=True)
47 #阅读量
48 readcount=db.Column(db.Integer,default=0)
49 #评论量
50 commentcount=db.Column(db.Integer,default=0)
51 #是否删除
52 is_delete=db.Column(db.Boolean,default=False)
53
54
55 class PeopleInfo(db.Model):
56 __tablename__ = 'peopleinfo'
57 id = db.Column(db.Integer,primary_key=True)
58 name = db.Column(db.String(20),unique=True)
59 password = db.Column(db.String(20),nullable=False)
60 email = db.Column(db.String(50),nullable=True)
61
62 #设置外键
63 book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id))
64 # book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id'))
65
66
67 def __repr__(self):
68 return '------%s------'%self.name
69 """
70 一本书中 有多个人物
71 id name readcount commentcount
72 1 西游记 100
73
74
75 id name password book_id
76 1 孙悟空 123 1
77 2 白骨精 321 1
78
79 """
80
81
82 @app.route('/')
83 def index():
84 return 'index'
85
86 if __name__ == '__main__':
87
88 # 删除表,删除 继承自 db.Model的类 的表
89 db.drop_all()
90
91 # db.create_all 就会给 继承自 db.Model的类 创建表
92 db.create_all()
93
94
95 #数据插入
96 # 第一种方式
97 book1=BookInfo(name='西游记',readcount=100)
98
99 #添加数据
100 """
101 事务 -- 就是保证数据操作的一致性
102
103 """
104 try:
105 db.session.add(book1)
106 db.session.commit()
107 except Exception as e:
108 db.session.rollback()
109
110 # 添加数据的第二种方式
111 book2=BookInfo()
112 book2.name='红楼梦'
113 book2.commentcount=1000
114
115
116 try:
117 #如果添加每天问题 则提交数据(类似于事务)
118 db.session.add(book2)
119 db.session.commit()
120 except Exception as e:
121 # 如果有问题 则数据回滚 不回添加成功
122 db.session.rollback()
123
124 p1 = PeopleInfo(name='wang', email='wang@163.com', password='123456', book_id=book1.id)
125 p2 = PeopleInfo(name='zhang', email='zhang@189.com', password='201512', book_id=book2.id)
126 p3 = PeopleInfo(name='chen', email='chen@126.com', password='987654', book_id=book2.id)
127 p4 = PeopleInfo(name='zhou', email='zhou@163.com', password='456789', book_id=book1.id)
128 p5 = PeopleInfo(name='tang', email='tang@itheima.com', password='158104', book_id=book2.id)
129 p6 = PeopleInfo(name='wu', email='wu@gmail.com', password='5623514', book_id=book2.id)
130 p7 = PeopleInfo(name='qian', email='qian@gmail.com', password='1543567', book_id=book1.id)
131 p8 = PeopleInfo(name='liu', email='liu@itheima.com', password='867322', book_id=book1.id)
132 p9 = PeopleInfo(name='li', email='li@163.com', password='4526342', book_id=book2.id)
133 p10 = PeopleInfo(name='sun', email='sun@163.com', password='235523', book_id=book2.id)
134
135 # 添加一个列表
136 db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10])
137 db.session.commit()
138
139
140
141
142
143 #########################查询#####################################
144 """
145 查询的语法形式: 模型类.query.[过滤器].执行器
146 query: 就是 模型类的管理
147
148 过滤器(where): filter, filter_by,order_by,goup_by
149 过滤器 不能把结果给我们 它只能给我们地址
150
151 filter(模型类名.字段 == 值)
152 filter_by(字段名=值)
153
154 执行器(获取数据): get,all,first
155 all: 获取查询的所有数据
156 first: 获取查询的第一个数据
157 count:个数
158 get(pk): primayr_key (pk) 通过主键获取 记录
159 """
160
161 # 查询所有人物数据
162 PeopleInfo.query.all()
163 # 查询有多少个人物
164 PeopleInfo.query.count()
165 # 查询第1个人物
166 PeopleInfo.query.first()
167
168 # 查询id为4的人物[3种方式]
169 # where id=4
170 PeopleInfo.query.get(4)
171
172 # filter_by 等值过滤器 =
173 PeopleInfo.query.filter_by(id=4).first()
174
175 # filter == 过滤器
176 PeopleInfo.query.filter(PeopleInfo.id==4).first()
177
178 # 查询名字结尾字符为g的所有数据[开始/包含]
179 PeopleInfo.query.filter(PeopleInfo.name.endswith('g')).all()
180 PeopleInfo.query.filter(PeopleInfo.name.startswith('g')).all()
181 PeopleInfo.query.filter(PeopleInfo.name.contains('g')).all()
182 # 查询名字不等于wang的所有数据[2种方式]
183 PeopleInfo.query.filter(PeopleInfo.name!='wang').all()
184 from sqlalchemy import not_
185 PeopleInfo.query.filter(not_(PeopleInfo.name=='wang')).all()
186
187 # 查询名字和邮箱都以 li 开头的所有数据[2种方式]
188 # and
189 from sqlalchemy import and_
190 PeopleInfo.query.filter(and_(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li'))).all()
191
192
193 PeopleInfo.query.filter(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li'))
194
195 # 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
196 from sqlalchemy import or_
197 #错误的
198 PeopleInfo.query.filter(or_(PeopleInfo.password=='123456'),PeopleInfo.email.endswith('itheima.com')).all()
199
200 #正确的
201 PeopleInfo.query.filter(or_(PeopleInfo.password=='123456',PeopleInfo.email.endswith('itheima.com'))).all()
202
203 # 查询id为 [1, 3, 5, 7, 9] 的人物列表
204 # select * from peopleinfo werhe id in (1,3,5,7,9)
205 PeopleInfo.query.filter(PeopleInfo.id.in_([1,3,5,7,9])).all()
206 # 查询name为liu的人物数据
207 PeopleInfo.query.filter(PeopleInfo.name=='liu').all()
208 PeopleInfo.query.filter_by(name='liu').all()
209 # 查询所有人物数据,并以邮箱排序
210 PeopleInfo.query.order_by(PeopleInfo.email.desc()).all()
211 PeopleInfo.query.order_by(PeopleInfo.email.asc()).all()
212
213 PeopleInfo.query.all().order_by(PeopleInfo.email.desc())
214
215 # 每页3个,查询第2页的数据
216 # page=None, 页数
217 # per_page=None 每页多少条
218 paginate = PeopleInfo.query.paginate(page=2,per_page=3)
219 #获取所有(第2页的)数据
220 paginate.items
221 # 获取有多少页
222 paginate.pages
223 #获取当前的页数
224 paginate.page
225
226 app.run()
select
2.orm-insert
1 from flask import Flask
2 from flask_sqlalchemy import SQLAlchemy
3
4 app=Flask(__name__)
5 # app.cofig['SQLALCHEMY_DATABASE_URI']=''
6 # 设置数据库的连接选项
7 # 语法形式: mysql://username:password@host:port/dbname
8 # mysql://root:mysql@127.0.0.1:3306/db_34
9 app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:mysql@127.0.0.1:3306/db')
10
11 # SQLALCHEMY_TRACK_MODIFICATIONS
12 # 是否设置跟踪模式,这个跟踪模式是需要消耗资源的 所以我们给它设置位False
13 # 默认值 位None,系统会发出一个警告
14 app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
15
16 # 让sql语句输出在控制台
17 app.config['SQLALCHEMY_ECHO']=True
18
19 #创建SQLAlchemy的实例对象
20 # app 参数: 就是 flask的实例对象
21 db = SQLAlchemy(app=app)
22
23
24 # 数据库中的一个表就需要对应我们的 一个模型
25 """
26 1.模型需要继承自 db.Model
27 2.定义字段(属性)
28 字段名: 不要使用python关键字 不要用mysql关键字
29 字段类型: 其实是和mysql类似的
30 字段选项:
31 primary_key :默认设置主键 会自动增长
32 uniue
33 nullable
34 default
35 """
36 class BookInfo(db.Model):
37
38 #修改表明
39 __tablename__='bookinfo'
40
41 # 主键
42 id=db.Column(db.Integer,primary_key=True)
43
44 name=db.Column(db.String(20),unique=True,nullable=False)
45 #发布日期
46 pub_date=db.Column(db.Date,nullable=True)
47 #阅读量
48 readcount=db.Column(db.Integer,default=0)
49 #评论量
50 commentcount=db.Column(db.Integer,default=0)
51 #是否删除
52 is_delete=db.Column(db.Boolean,default=False)
53
54
55 class PeopleInfo(db.Model):
56 __tablename__ = 'peopleinfo'
57 id = db.Column(db.Integer,primary_key=True)
58 name = db.Column(db.String(20),unique=True)
59 password = db.Column(db.String(20),nullable=False)
60 email = db.Column(db.String(50),nullable=True)
61
62 #设置外键
63 book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id))
64 # book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id'))
65
66 """
67 一本书中 有多个人物
68 id name readcount commentcount
69 1 西游记 100
70
71
72 id name password book_id
73 1 孙悟空 123 1
74 2 白骨精 321 1
75
76 """
77
78
79 @app.route('/')
80 def index():
81 return 'index'
82
83 if __name__ == '__main__':
84
85 # 删除表,删除 继承自 db.Model的类 的表
86 db.drop_all()
87
88 # db.create_all 就会给 继承自 db.Model的类 创建表
89 db.create_all()
90
91
92 #数据插入
93 # 第一种方式
94 book1=BookInfo(name='西游记',readcount=100)
95
96 #添加数据
97 """
98 事务 -- 就是保证数据操作的一致性
99
100 """
101 try:
102 db.session.add(book1)
103 db.session.commit()
104 except Exception as e:
105 db.session.rollback()
106
107 # 添加数据的第二种方式
108 book2=BookInfo()
109 book2.name='红楼梦'
110 book2.commentcount=1000
111
112
113 try:
114 #如果添加每天问题 则提交数据(类似于事务)
115 db.session.add(book2)
116 db.session.commit()
117 except Exception as e:
118 # 如果有问题 则数据回滚 不回添加成功
119 db.session.rollback()
120
121 p1 = PeopleInfo(name='wang', email='wang@163.com', password='123456', book_id=book1.id)
122 p2 = PeopleInfo(name='zhang', email='zhang@189.com', password='201512', book_id=book2.id)
123 p3 = PeopleInfo(name='chen', email='chen@126.com', password='987654', book_id=book2.id)
124 p4 = PeopleInfo(name='zhou', email='zhou@163.com', password='456789', book_id=book1.id)
125 p5 = PeopleInfo(name='tang', email='tang@itheima.com', password='158104', book_id=book2.id)
126 p6 = PeopleInfo(name='wu', email='wu@gmail.com', password='5623514', book_id=book2.id)
127 p7 = PeopleInfo(name='qian', email='qian@gmail.com', password='1543567', book_id=book1.id)
128 p8 = PeopleInfo(name='liu', email='liu@itheima.com', password='867322', book_id=book1.id)
129 p9 = PeopleInfo(name='li', email='li@163.com', password='4526342', book_id=book2.id)
130 p10 = PeopleInfo(name='sun', email='sun@163.com', password='235523', book_id=book2.id)
131
132 # 添加一个列表
133 db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10])
134 db.session.commit()
135
136 app.run()
insert
八、数据库迁移
1.python 文件 db init
2.python 文件 db migrate -m"版本名(注释)"
3.python 文件 db upgrade 然后观察表结构
4.根据需求修改模型
5.python 文件 db migrate -m"新版本名(注释)"
6.python 文件 db upgrade 然后观察表结构
7.若返回版本,则利用 python 文件 db history查看版本号
8.python 文件 db downgrade(upgrade) 版本号