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 }}

四、配置文件相关内容

 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) 版本号

 

转载于:https://www.cnblogs.com/returnes/p/10200000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值