FLask插件
Flask插件
flask-session
下载
pip install Flask-session
导入
from flask_session import Session
实例化session
在__init__文件中
def create_app():
app = Flask(__name__)
Session(app)
return app
配置文件
SESSION_TYPE = 'redis'
用法和内置session一样
实现原理
- 内置的session调用 session_interface = xxxx
- xxxx.open_session 解密cookie转化成字典给session
- xxxx.save_session 将session加密给cookie
- Flask-session 修改session_interface 制定的类
- 来改变session存储的位置
- 内置的session调用 session_interface = xxxx
SQLALchemy
创建连接
from sqlalchemy import create_engine
conn = create_engine(
# 'mysql+pymysql://rout用户:密码@连接地址:端口号/数据库名?charset=编码方式'
'mysql+pymysql://root:123@127.0.0.1:3306/day103?charset=ustf8',
max_overflow = 0, # 超过连接池大小外最多创建的连接数
pool_size = 5, # 连接池大小
pool_timeout=30, # 连接池中没有线程最多等待时间,否则报错
pool_recycle=-1, # 多久之后对连接池中的连接进行回收(重置), -1不回收
)
如何创建表
导入
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
单表创建
class Book(Base):
__tablename__ = "book" id = Column(Integer, primary_key=True)
title = Column(String(32), nullable=False,index=True) def __repr__(self):
return self.title __table_args__ = (
# 联合唯一
UniqueConstraint("id", "title", name="uni_id_title"),
# 联合索引
Index("id", "title")
)
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy import Index, UniqueConstraint
import datetime
# 连接数据库
ENGINE = create_engine("mysql+pymysql://root:root1234@127.0.0.1:3306/code_record?charset=utf8",)
# 实例化
Base = declarative_base() # 创建单表,继承Base
class UserInfo(Base):
__tablename__ = "user_info" id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
email = Column(String(32), unique=True)
create_time = Column(DateTime, default=datetime.datetime.now)
# 类似与django中的class Meta, 针对于本表
__table_args__ = (
# 设置联合唯一
UniqueConstraint("id", "name", name="uni_id_name"),
# 设置联合索引
Index("name", "email")
) # 函数,方便创建表
def create_db():
Base.metadata.create_all(ENGINE) # 方便删除
def drop_db():
Base.metadata.drop_all(ENGINE) if __name__ == '__main__':
# 执行
create_db()
一对多表创建
class Book(Base):
__tablename__ = "book" id = Column(Integer, primary_key=True)
title = Column(String(32), nullable=False)
publisher_id = Column(Integer, ForeignKey("publisher.id"))
# 不生成字段建立关系 方便操作
# 一对多
publisher = relationship("Publisher", backref="books")
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy import Index, UniqueConstraint, ForeignKey
from sqlalchemy.orm import relationship
import datetime ENGINE = create_engine("mysql+pymysql://root:root1234@127.0.0.1:3306/code_record?charset=utf8",) Base = declarative_base() # ======一对多示例=======
class UserInfo(Base):
__tablename__ = "user_info" id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
email = Column(String(32), unique=True)
create_time = Column(DateTime, default=datetime.datetime.now)
# FK字段的建立
hobby_id = Column(Integer, ForeignKey("hobby.id"))
# 不生成表结构 方便查询使用
hobby = relationship("Hobby", backref="user") __table_args__ = (
UniqueConstraint("id", "name", name="uni_id_name"),
Index("name", "email")
) class Hobby(Base):
__tablename__ = "hobby" id = Column(Integer, primary_key=True)
title = Column(String(32), default="码代码") def create_db():
Base.metadata.create_all(ENGINE) def drop_db():
Base.metadata.drop_all(ENGINE) if __name__ == '__main__':
create_db()
# drop_db()
多对对创建
第三张表自己生成
class Book(Base):
__tablename__ = "book" id = Column(Integer, primary_key=True)
title = Column(String(32), nullable=False)
publisher_id = Column(Integer, ForeignKey("publisher.id"))
# 不生成字段建立关系 方便操作
# 一对多
publisher = relationship("Publisher", backref="books")
# 多对多
tags = relationship("Tag", secondary="book2tag", backref="books")
class Book2Tag(Base):
__tablename__ = "book2tag" id = Column(Integer, primary_key=True)
book_id = Column(Integer, ForeignKey("book.id"))
tag_id = Column(Integer, ForeignKey("tag.id"))
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy import Index, UniqueConstraint, ForeignKey
from sqlalchemy.orm import relationship
import datetime ENGINE = create_engine("mysql+pymysql://root:root1234@127.0.0.1:3306/code_record?charset=utf8",) Base = declarative_base() # ======多对多示例=======
class Book(Base):
__tablename__ = "book" id = Column(Integer, primary_key=True)
title = Column(String(32))
# 不生成表字段 仅用于查询方便
tags = relationship("Tag", secondary="book2tag", backref="books") class Tag(Base):
__tablename__ = "tag" id = Column(Integer, primary_key=True)
title = Column(String(32)) class Book2Tag(Base):
__tablename__ = "book2tag" id = Column(Integer, primary_key=True)
book_id = Column(Integer, ForeignKey("book.id"))
tag_id = Column(Integer, ForeignKey("tag.id")) def create_db():
Base.metadata.create_all(ENGINE) def drop_db():
Base.metadata.drop_all(ENGINE) if __name__ == '__main__':
create_db()
# drop_db()
创建表命令
Base.metadata.create_all(conn) # conn是连接池对象
对数据库表的操作(增删改查)
创建管理器
from sqlalchemy.orm import sessionmaker, scoped_session
Session = sessionmaker(bind=conn)
# 线程安全 根本本地线程会使用一个session
session = scoped_session(Session)
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from models_demo import Tag ENGINE = create_engine("mysql+pymysql://root:root1234@127.0.0.1:3306/code_record?charset=utf8",) Session = sessionmaker(bind=ENGINE) # 每次执行数据库操作的时候,都需要创建一个session # 线程安全,基于本地线程实现每个线程用同一个session session = scoped_session(Session) # =======执行ORM操作==========
tag_obj = Tag(title="SQLAlchemy")
# 添加
session.add(tag_obj)
# 提交
session.commit()
# 关闭session
session.close()
基本增删改查
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from models_demo import Tag, UserInfo
import threading ENGINE = create_engine("mysql+pymysql://root:root1234@127.0.0.1:3306/code_record?charset=utf8",) Session = sessionmaker(bind=ENGINE) # 每次执行数据库操作的时候,都需要创建一个session
session = Session()
session = scoped_session(Session) # ============添加============
# tag_obj = Tag(title="SQLAlchemy")
# # 添加
# session.add(tag_obj)
# session.add_all([
# Tag(title="Python"),
# Tag(title="Django"),
# ])
# # 提交
# session.commit()
# # 关闭session
# session.close() # ============基础查询============
# ret1 = session.query(Tag).all()
# ret2 = session.query(Tag).filter(Tag.title == "Python").all()
# ret3 = session.query(Tag).filter_by(title="Python").all()
# ret4 = session.query(Tag).filter_by(title="Python").first()
# print(ret1, ret2, ret3, ret4) # ============删除===========
# session.query(Tag).filter_by(id=1).delete()
# session.commit() # ===========修改===========
session.query(Tag).filter_by(id=22).update({Tag.title: "LOL"})
session.query(Tag).filter_by(id=23).update({"title": "王者毒药"})
session.query(Tag).filter_by(id=24).update({"title": Tag.title + "~"}, synchronize_session=False)
# synchronize_session="evaluate" 默认值进行数字加减
session.commit()
常用操作
# 条件查询
ret1 = session.query(Tag).filter_by(id=22).first()
ret2 = session.query(Tag).filter(Tag.id > 1, Tag.title == "LOL").all()
ret3 = session.query(Tag).filter(Tag.id.between(22, 24)).all()
ret4 = session.query(Tag).filter(~Tag.id.in_([22, 24])).first()
from sqlalchemy import and_, or_
ret5 = session.query(Tag).filter(and_(Tag.id > 1, Tag.title == "LOL")).first()
ret6 = session.query(Tag).filter(or_(Tag.id > 1, Tag.title == "LOL")).first()
ret7 = session.query(Tag).filter(or_(
Tag.id>1,
and_(Tag.id>3, Tag.title=="LOL")
)).all()
# 通配符
ret8 = session.query(Tag).filter(Tag.title.like("L%")).all()
ret9 = session.query(Tag).filter(~Tag.title.like("L%")).all()
# 限制
ret10 = session.query(Tag).filter(~Tag.title.like("L%")).all()[1:2]
# 排序
ret11 = session.query(Tag).order_by(Tag.id.desc()).all() # 倒序
ret12 = session.query(Tag).order_by(Tag.id.asc()).all() # 正序
# 分组
ret13 = session.query(Tag.test).group_by(Tag.test).all()
# 聚合函数
from sqlalchemy.sql import func
ret14 = session.query(
func.max(Tag.id),
func.sum(Tag.test),
func.min(Tag.id)
).group_by(Tag.title).having(func.max(Tag.id > 22)).all()
# 连表
ret15 = session.query(UserInfo, Hobby).filter(UserInfo.hobby_id == Hobby.id).all()
# print(ret15) 得到一个列表套元组 元组里是两个对象
ret16 = session.query(UserInfo).join(Hobby).all()
# print(ret16) 得到列表里面是前一个对象
# 相当于inner join
# for i in ret16:
# # print(i[0].name, i[1].title)
# print(i.hobby.title)
ret17 = session.query(Hobby).join(UserInfo, isouter=True).all()
ret17_1 = session.query(UserInfo).join(Hobby, isouter=True).all()
ret18 = session.query(Hobby).outerjoin(UserInfo).all()
ret18_1 = session.query(UserInfo).outerjoin(Hobby).all()
# 相当于left join
print(ret17)
print(ret17_1)
print(ret18)
print(ret18_1)
基于relationship的Fk
# 基于relationship的FK
# 添加
user_obj = UserInfo(name="提莫", hobby=Hobby(title="种蘑菇"))
session.add(user_obj) hobby = Hobby(title="弹奏一曲")
hobby.user = [UserInfo(name="琴女"), UserInfo(name="妹纸")]
session.add(hobby)
session.commit() # 基于relationship的正向查询
user_obj_1 = session.query(UserInfo).first()
print(user_obj_1.name)
print(user_obj_1.hobby.title) # 基于relationship的反向查询
hb = session.query(Hobby).first()
print(hb.title)
for i in hb.user:
print(i.name) session.close()
基于relationship的M2M
# 添加
book_obj = Book(title="Python源码剖析")
tag_obj = Tag(title="Python")
b2t = Book2Tag(book_id=book_obj.id, tag_id=tag_obj.id)
session.add_all([
book_obj,
tag_obj,
b2t,
])
session.commit() # 上面有坑哦~~~~
book = Book(title="测试")
book.tags = [Tag(title="测试标签1"), Tag(title="测试标签2")]
session.add(book)
session.commit() tag = Tag(title="LOL")
tag.books = [Book(title="大龙刷新时间"), Book(title="小龙刷新时间")]
session.add(tag)
session.commit() # 基于relationship的正向查询
book_obj = session.query(Book).filter_by(id=4).first()
print(book_obj.title)
print(book_obj.tags)
# 基于relationship的反向查询
tag_obj = session.query(Tag).first()
print(tag_obj.title)
print(tag_obj.books)
Flask_Script
下载
pip install flask-script
导入
from flask_demo import create_app
from flask_script import Manager
实例化
app = create_app()
# 实例化
manager = Manager(app) if __name__ == '__main__':
# app.run()
manager.run()
自定义的命令
位置传参
@manager.command
def mycommad(arg):
prin(arg)
# python manange.py my_command 123
关键字
@manager.option('-n','--name', dest='name')
@manager.option('-u','--url', dest='url')
def cmd(name, url):
print(name, url)
# python manager.py cmd -n xiatian -u www.xxx
Flask-Migrate
!!! 依赖flask-script
下载
pip install flask-migrate
导入
from flask_Migrate import Migrate, MigrateCommand
实例化
Migrate(app) manager.add_command('db', MigrateCommand)
"""
python manager.py db init
python manager.py db migrate # 类型于makemigrations
python manager.py db uprade # migrate
"""
师博客:
https://www.cnblogs.com/GGGG-XXXX/articles/9447619.html
FLask插件的更多相关文章
- Flask插件wtforms、Flask文件上传和Echarts柱状图
一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...
- flask插件系列之flask_uploads上传文件
前言 flask可以实现上传文件和下载文件的基本功能,但如果想要健壮的功能,使用flask_uploads插件是十分方便的. 安装 pip install flask_uploads 基本使用 # e ...
- flask插件系列之flask_caching缓存
前言 为了尽量减少缓存穿透,同时减少web的响应时间,我们可以针对那些需要一定时间才能获取结果的函数和那些不需要频繁更新的视图函数提供缓存服务,可以在一定的时间内直接返回结果而不是每次都需要计算或者从 ...
- flask插件系列之flask_session会话机制
flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制. 配置参数详解 SESSION_COOKIE_NAME 设置返回给客户端的c ...
- 在SAE上使用Flask插件
因为我之前学习的时候使用的是虚拟环境,下载的所有需要用到的插件都在flask这个文件夹里面,SAE上Flask的版本和我本地用的版本对不上,导致有时候import都不对,于是我就把本地的环境直接放到S ...
- flask插件全家桶集成学习---持续更新ing
不得不说flask的设计要比django要小巧精妙的多了,没有那么臃肿,只保留核心功能,其他的都需要自己引入,即各种各样的插件来满足我们的需求,我这里记录一下自己学习项目中用的插件使用方法和一些技巧总 ...
- flask插件系列之Flask-WTF表单
flask_wtf是flask框架的表单验证模块,可以很方便生成表单,也可以当做json数据交互的验证工具,支持热插拔. 安装 pip install Flask-WTF Flask-WTF其实是对w ...
- flask插件系列之flask_restful设计API
前言 flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的 ...
- flask插件系列之flask_celery异步任务神器
现在继续学习在集成的框架中如何使用celery. 在Flask中使用celery 在Flask中集成celery需要做到两点: 创建celery的实例对象的名字必须是flask应用程序app的名字,否 ...
随机推荐
- 简述CGI与FASTCGI区别
CGI和FASTCGI都是服务器端与客户端进行交互的常见方式. CGI处理客户端请求,会生成一个子进程来专门调用外部程序来处理客户端请求,处理完成,子进程会随之关闭 FAST处理客户端请求时.服务器端 ...
- 30天自制操作系统day2汇编语言
<30天自制操作系统>一书中第1天和第二天中有关汇编语言的程序的理解 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以下的记述用于标准FAT12格 ...
- js reduce累加器
reduce 是es6 新增的数组操作方法 意为累加器 使用方法如下 [1,1,1,1].reduce((total,currentValue,index)=>{ },initialValu ...
- 基于UDP传输协议局域网文件接收软件设计 Java版
网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...
- 《STL源码剖析》学习半生记:第一章小结与反思
不学STL,无以立.--陈轶阳 从1.1节到1.8节大部分都是从各方面介绍STL, 包括历史之类的(大致上是这样,因为实在看不下去我就直接略到了1.9节(其实还有一点1.8.3的内容)). 第一章里比 ...
- [VM trunk ports]opensatck VM 单网卡,多VLAN配置
描述 需求产生场景 1.用户在虚机运行 K8S ,采用 VLAN 模式组网,要求 VM 端口要支持 trunk,支持多个 VLAN 网络数据在同一虚拟网卡上传输. 2.需要动态的增删虚拟机上的网络接口 ...
- [题解]第十一届北航程序设计竞赛预赛——L.偶回文串
题目描述 长度为偶数的回文串被称为偶回文串.如果一个字符串重新排序之后能够成为一个偶回文串,则称为可回文的. 给一个字符串,求可回文的子串个数.字符串只含小写字母,单个字符串长度不超过10^5,所有数 ...
- [Unity] 编辑器运行中动态编译执行C#代码
(一)问题 之前写Lua时,修改完代码 reload 就可以热重载代码,调试起来十分方便(重构则十分痛苦). 现在使用 C# 做开发,目前还没找到比较方便地进行热重载的方式.只能退而求其次,在调试上找 ...
- Django框架表关系外键-多对多外键(增删改查)-正反向的概率-多表查询(子查询与联表查询)
目录 一:表关系外键 1.提前创建表关系 2.目前只剩 书籍表和 书籍作者表没创建信息. 3.增 4.删 5.修改 二:多对多外键增删改查 1.给书籍绑定作者 2.删 3.修改 4.清空 三:正反向的 ...
- 【C# 程序集】.NET core Could not load file or assembly
NET core 添加了新的nuget包,部署出现Could not load file or assembly 这个坑,今天整了一天,我添加了Microsoft.AspNetCore.Mvc.Ver ...