Flask项目笔记
一、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 }}
四、配置文件相关内容
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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设置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
六、404页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@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)
七、orm
1.orm-select
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
2.orm-insert
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
八、数据库迁移
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) 版本号