Flask项目笔记

时间:2024-09-01 09:34:26

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

四、配置文件相关内容

 # 配置文件
class Config(object):
# debug模式配置
# DEBUG=True
LOG_LEVEL = logging.DEBUG
# mysql 配置
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:000000@127.0.0.1:3306/news'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
# redis 配置信息
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
# session 配置
SESSION_TYPE = 'redis'
SESSION_USE_SIGNER = True
SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT,db=1)
PERMANENT_SESSION_LIFETIME = 3600
SECRET_KEY = 'KZtgoZECnZyp/hiU49YHotf2Nv4IGYqF5I7M6K3iClzvTWYtALha9E2i7wgIK78X'

配置

五、csrf_token设置

     @app.after_request
def after_request(response):
from flask_wtf.csrf import generate_csrf
csrf_token = generate_csrf()
response.set_cookie('csrf_token', csrf_token)
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

 from flask import Flask
from flask_sqlalchemy import SQLAlchemy app=Flask(__name__)
# app.cofig['SQLALCHEMY_DATABASE_URI']=''
# 设置数据库的连接选项
# 语法形式: mysql://username:password@host:port/dbname
# mysql://root:mysql@127.0.0.1:3306/db_34
app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:mysql@127.0.0.1:3306/db') # SQLALCHEMY_TRACK_MODIFICATIONS
# 是否设置跟踪模式,这个跟踪模式是需要消耗资源的 所以我们给它设置位False
# 默认值 位None,系统会发出一个警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False # 让sql语句输出在控制台
app.config['SQLALCHEMY_ECHO']=False #创建SQLAlchemy的实例对象
# app 参数: 就是 flask的实例对象
db = SQLAlchemy(app=app) # 数据库中的一个表就需要对应我们的 一个模型
"""
1.模型需要继承自 db.Model
2.定义字段(属性)
字段名: 不要使用python关键字 不要用mysql关键字
字段类型: 其实是和mysql类似的
字段选项:
primary_key :默认设置主键 会自动增长
unique
nullable
default
"""
class BookInfo(db.Model): #修改表明
__tablename__='bookinfo' # 主键
id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),unique=True,nullable=False)
#发布日期
pub_date=db.Column(db.Date,nullable=True)
#阅读量
readcount=db.Column(db.Integer,default=0)
#评论量
commentcount=db.Column(db.Integer,default=0)
#是否删除
is_delete=db.Column(db.Boolean,default=False) class PeopleInfo(db.Model):
__tablename__ = 'peopleinfo'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),unique=True)
password = db.Column(db.String(20),nullable=False)
email = db.Column(db.String(50),nullable=True) #设置外键
book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id))
# book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id')) def __repr__(self):
return '------%s------'%self.name
"""
一本书中 有多个人物
id name readcount commentcount
1 西游记 100 id name password book_id
1 孙悟空 123 1
2 白骨精 321 1 """ @app.route('/')
def index():
return 'index' if __name__ == '__main__': # 删除表,删除 继承自 db.Model的类 的表
db.drop_all() # db.create_all 就会给 继承自 db.Model的类 创建表
db.create_all() #数据插入
# 第一种方式
book1=BookInfo(name='西游记',readcount=100) #添加数据
"""
事务 -- 就是保证数据操作的一致性 """
try:
db.session.add(book1)
db.session.commit()
except Exception as e:
db.session.rollback() # 添加数据的第二种方式
book2=BookInfo()
book2.name='红楼梦'
book2.commentcount=1000 try:
#如果添加每天问题 则提交数据(类似于事务)
db.session.add(book2)
db.session.commit()
except Exception as e:
# 如果有问题 则数据回滚 不回添加成功
db.session.rollback() p1 = PeopleInfo(name='wang', email='wang@163.com', password='', book_id=book1.id)
p2 = PeopleInfo(name='zhang', email='zhang@189.com', password='', book_id=book2.id)
p3 = PeopleInfo(name='chen', email='chen@126.com', password='', book_id=book2.id)
p4 = PeopleInfo(name='zhou', email='zhou@163.com', password='', book_id=book1.id)
p5 = PeopleInfo(name='tang', email='tang@itheima.com', password='', book_id=book2.id)
p6 = PeopleInfo(name='wu', email='wu@gmail.com', password='', book_id=book2.id)
p7 = PeopleInfo(name='qian', email='qian@gmail.com', password='', book_id=book1.id)
p8 = PeopleInfo(name='liu', email='liu@itheima.com', password='', book_id=book1.id)
p9 = PeopleInfo(name='li', email='li@163.com', password='', book_id=book2.id)
p10 = PeopleInfo(name='sun', email='sun@163.com', password='', book_id=book2.id) # 添加一个列表
db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10])
db.session.commit() #########################查询#####################################
"""
查询的语法形式: 模型类.query.[过滤器].执行器
query: 就是 模型类的管理 过滤器(where): filter, filter_by,order_by,goup_by
过滤器 不能把结果给我们 它只能给我们地址 filter(模型类名.字段 == 值)
filter_by(字段名=值) 执行器(获取数据): get,all,first
all: 获取查询的所有数据
first: 获取查询的第一个数据
count:个数
get(pk): primayr_key (pk) 通过主键获取 记录
""" # 查询所有人物数据
PeopleInfo.query.all()
# 查询有多少个人物
PeopleInfo.query.count()
# 查询第1个人物
PeopleInfo.query.first() # 查询id为4的人物[3种方式]
# where id=4
PeopleInfo.query.get(4) # filter_by 等值过滤器 =
PeopleInfo.query.filter_by(id=4).first() # filter == 过滤器
PeopleInfo.query.filter(PeopleInfo.id==4).first() # 查询名字结尾字符为g的所有数据[开始/包含]
PeopleInfo.query.filter(PeopleInfo.name.endswith('g')).all()
PeopleInfo.query.filter(PeopleInfo.name.startswith('g')).all()
PeopleInfo.query.filter(PeopleInfo.name.contains('g')).all()
# 查询名字不等于wang的所有数据[2种方式]
PeopleInfo.query.filter(PeopleInfo.name!='wang').all()
from sqlalchemy import not_
PeopleInfo.query.filter(not_(PeopleInfo.name=='wang')).all() # 查询名字和邮箱都以 li 开头的所有数据[2种方式]
# and
from sqlalchemy import and_
PeopleInfo.query.filter(and_(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li'))).all() PeopleInfo.query.filter(PeopleInfo.name.startswith('li'),PeopleInfo.email.startswith('li')) # 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
from sqlalchemy import or_
#错误的
PeopleInfo.query.filter(or_(PeopleInfo.password==''),PeopleInfo.email.endswith('itheima.com')).all() #正确的
PeopleInfo.query.filter(or_(PeopleInfo.password=='',PeopleInfo.email.endswith('itheima.com'))).all() # 查询id为 [1, 3, 5, 7, 9] 的人物列表
# select * from peopleinfo werhe id in (1,3,5,7,9)
PeopleInfo.query.filter(PeopleInfo.id.in_([1,3,5,7,9])).all()
# 查询name为liu的人物数据
PeopleInfo.query.filter(PeopleInfo.name=='liu').all()
PeopleInfo.query.filter_by(name='liu').all()
# 查询所有人物数据,并以邮箱排序
PeopleInfo.query.order_by(PeopleInfo.email.desc()).all()
PeopleInfo.query.order_by(PeopleInfo.email.asc()).all() PeopleInfo.query.all().order_by(PeopleInfo.email.desc()) # 每页3个,查询第2页的数据
# page=None, 页数
# per_page=None 每页多少条
paginate = PeopleInfo.query.paginate(page=2,per_page=3)
#获取所有(第2页的)数据
paginate.items
# 获取有多少页
paginate.pages
#获取当前的页数
paginate.page app.run()

select

2.orm-insert

 from flask import Flask
from flask_sqlalchemy import SQLAlchemy app=Flask(__name__)
# app.cofig['SQLALCHEMY_DATABASE_URI']=''
# 设置数据库的连接选项
# 语法形式: mysql://username:password@host:port/dbname
# mysql://root:mysql@127.0.0.1:3306/db_34
app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:mysql@127.0.0.1:3306/db') # SQLALCHEMY_TRACK_MODIFICATIONS
# 是否设置跟踪模式,这个跟踪模式是需要消耗资源的 所以我们给它设置位False
# 默认值 位None,系统会发出一个警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False # 让sql语句输出在控制台
app.config['SQLALCHEMY_ECHO']=True #创建SQLAlchemy的实例对象
# app 参数: 就是 flask的实例对象
db = SQLAlchemy(app=app) # 数据库中的一个表就需要对应我们的 一个模型
"""
1.模型需要继承自 db.Model
2.定义字段(属性)
字段名: 不要使用python关键字 不要用mysql关键字
字段类型: 其实是和mysql类似的
字段选项:
primary_key :默认设置主键 会自动增长
uniue
nullable
default
"""
class BookInfo(db.Model): #修改表明
__tablename__='bookinfo' # 主键
id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),unique=True,nullable=False)
#发布日期
pub_date=db.Column(db.Date,nullable=True)
#阅读量
readcount=db.Column(db.Integer,default=0)
#评论量
commentcount=db.Column(db.Integer,default=0)
#是否删除
is_delete=db.Column(db.Boolean,default=False) class PeopleInfo(db.Model):
__tablename__ = 'peopleinfo'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(20),unique=True)
password = db.Column(db.String(20),nullable=False)
email = db.Column(db.String(50),nullable=True) #设置外键
book_id = db.Column(db.Integer,db.ForeignKey(BookInfo.id))
# book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id')) """
一本书中 有多个人物
id name readcount commentcount
1 西游记 100 id name password book_id
1 孙悟空 123 1
2 白骨精 321 1 """ @app.route('/')
def index():
return 'index' if __name__ == '__main__': # 删除表,删除 继承自 db.Model的类 的表
db.drop_all() # db.create_all 就会给 继承自 db.Model的类 创建表
db.create_all() #数据插入
# 第一种方式
book1=BookInfo(name='西游记',readcount=100) #添加数据
"""
事务 -- 就是保证数据操作的一致性 """
try:
db.session.add(book1)
db.session.commit()
except Exception as e:
db.session.rollback() # 添加数据的第二种方式
book2=BookInfo()
book2.name='红楼梦'
book2.commentcount=1000 try:
#如果添加每天问题 则提交数据(类似于事务)
db.session.add(book2)
db.session.commit()
except Exception as e:
# 如果有问题 则数据回滚 不回添加成功
db.session.rollback() p1 = PeopleInfo(name='wang', email='wang@163.com', password='', book_id=book1.id)
p2 = PeopleInfo(name='zhang', email='zhang@189.com', password='', book_id=book2.id)
p3 = PeopleInfo(name='chen', email='chen@126.com', password='', book_id=book2.id)
p4 = PeopleInfo(name='zhou', email='zhou@163.com', password='', book_id=book1.id)
p5 = PeopleInfo(name='tang', email='tang@itheima.com', password='', book_id=book2.id)
p6 = PeopleInfo(name='wu', email='wu@gmail.com', password='', book_id=book2.id)
p7 = PeopleInfo(name='qian', email='qian@gmail.com', password='', book_id=book1.id)
p8 = PeopleInfo(name='liu', email='liu@itheima.com', password='', book_id=book1.id)
p9 = PeopleInfo(name='li', email='li@163.com', password='', book_id=book2.id)
p10 = PeopleInfo(name='sun', email='sun@163.com', password='', book_id=book2.id) # 添加一个列表
db.session.add_all([p1, p2, p3, p4, p5, p6, p7, p8, p9, p10])
db.session.commit() 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) 版本号