一、flask-session

1、为什么要使用flask-session

因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,
而使用flask-session可以更改session存放的位置,
可以存放在redis、memcached、filesystem、mongodb、sqlalchemy等数据库中,
flask-session也是基于flask原本的session原理实现的,只是让session存放的位置更改了而已。

实现原理:
-- 内置的session调用 session_interface = xxxxx
  -- xxxxx.open_session 解密cookie转换成字典给session
  -- xxxxx.save_session 将session加密给cookie
-- Flask-session通过修改session_interface指定的类
  -- 来改变session存储的位置

2、使用步骤

1. 下载  pip install flask-session
2. 导入 from flask-session import Session 到__init__的app实例里面
3. 更改配置文件
class DevConfig(object):
DEBUG = True
SESSION_TYPE = "redis"
SESSION_REDIS = redis.Redis(host="127.0.0.1", port="")
4. 实例化 Session(app)

3、Demo(使用蓝图搭建的Demo)

# 1. __init__.py
from flask import Flask
from FlaskPlug.views.user import userBlue # 测试的视图
from flask_session import Session # 导入插件flask-session def create_app():
app = Flask(__name__, template_folder='templates')
# 更改配置信息
app.config.from_object('settings.DevConfig')
# 实例化
Session(app)
app.register_blueprint(userBlue)
return app

__init__.py

# 2. settings.py
import redis class DevConfig(object):
DEBUG = True
SESSION_TYPE = 'redis'
SESSION_REDIS = redis.Redis(host='localhost', port=6379)

2. settings.py

# 3. user.py
from flask import Blueprint, session userBlue = Blueprint("userBlue", __name__) @userBlue.route('/')
def index():
session['test'] = 'test-flask-session'
return "index" @userBlue.route("/user")
def user():
print(session.get('test'))
return "user"

3. user.py

二、Flask-SQLAlchemy

1、前戏

学习Flask-SQLAlchemy之前,我们先去学习一下SQLAlchemy(可看上一篇),SQLAlchemy是一个Python的ORM框架,SQLAlchemy
而Flask-SQLAlchemy是基于SQLAlchemy实现的一个Flask插件。

2、使用步骤

1. 下载 pip install flask-sqlalchemy

2. 导入 from flask_sqlalchemy import SQLAlchemy

3. 在init.py 实例化 并且实现初始化

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# SQLAlchemy必须在导入蓝图之前实例化
db = SQLAlchemy()
from FlaskPlug.views.user import userBlue def create_app():
app = Flask(__name__)
# 导入配置信息
app.config.from_object('settings.DevConfig')
app.register_blueprint(userBlue)
# 初始化db
db.init_app(app)
return app

4. 配置文件

# settings.py
class DevConfig(object):
DEBUG = True # flask-SQLAlchemy配置
# 连接什么数据库,哪个数据库
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123abc@127.0.0.1:3306/sqlalchemy?charset=utf8'
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_MAX_OVERFLOW = 2
SQLALCHEMY_TRACK_MODIFICATIONS = False

5. 建models

# 表必须继承flask-SQLAlchemy的SQLAlchemy的实例化对象db.Model
from FlaskPlug import db
# 其他一些字段的东西导入的是python的SQLAlchemy
# 当然,也可以使用db.Column, db.Integer, db.String, db.relationship等等

from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import relationship class Book(db.Model):
__tablename__ = 'book' id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False)
publisher_id = Column(Integer, ForeignKey('publisher.id'))
publisher = relationship('Publisher', backref='books')
tags = relationship('Tag', backref='books', secondary='book2tag') __table_args__ = (
# UniqueConstraint联合唯一,这个联合唯一的字段名为:uni_id_name
UniqueConstraint("id", "title", name="uni_id_title"),
# 联合索引
Index("id", "title")
) def __repr__(self):
return self.title class Publisher(db.Model):
__tablename__ = 'publisher' id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False) def __repr__(self):
return self.title class Tag(db.Model):
__tablename__ = 'tag' id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False) def __repr__(self):
return self.title class Book2Tag(db.Model):
__tablename__ = 'book2tag' id = Column(Integer, primary_key=True)
book_id = Column(Integer, ForeignKey('book.id'))
tag_id = Column(Integer, ForeignKey('tag.id'))

6. 生成表

# 需要使用app上下文
# 离线脚本这时候就体现作用了 from FlaskPlug import db, create_app
# 一定要导入models 否则找不到表创建不出来
from FlaskPlug.models import * app = create_app()
# app_context()就是前两篇文章里面Flask请求上下文走过的流程啊
# app_ctx = AppContext(app)
app_ctx = app.app_context()
# with 就会去走AppContext的__enter__和__exit__方法
# __enter__就是去取app了,__exit__就是删除
with app_ctx:
db.create_all() 注意:一般建表的py文件和生成表的py文件要分成两个文件执行,不然有时候会导致循环引用。

7. 基于flask-SQLAlchemy的ORM操作

跟python的SQLAlchemy一样的

@userBlue.route('/')
def index():
# 给Tag增加一条数据
tag_obj = Tag(title='python')
db.session.add(tag_obj)
db.session.commit()
db.session.close()
return "index"

8. Demo

# __init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from FlaskPlug.views.user import userBlue def create_app():
app = Flask(__name__, template_folder='templates')
app.config.from_object('settings.DevConfig')
app.register_blueprint(userBlue)
db.init_app(app)
return app

__init__.py

# settings.py
class DevConfig(object):
DEBUG = True
# flask-SQLAlchemy配置
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123abc@127.0.0.1:3306/sqlalchemy?charset=utf8'
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_MAX_OVERFLOW = 2
SQLALCHEMY_TRACK_MODIFICATIONS = False

settings.py

# models.py
from FlaskPlug import db
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import relationship class Book(db.Model):
__tablename__ = 'book' id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False)
publisher_id = Column(Integer, ForeignKey('publisher.id'))
publisher = relationship('Publisher', backref='books')
tags = relationship('Tag', backref='books', secondary='book2tag') __table_args__ = (
# UniqueConstraint联合唯一,这个联合唯一的字段名为:uni_id_name
UniqueConstraint("id", "title", name="uni_id_title"),
# 联合索引
Index("id", "title")
) def __repr__(self):
return self.title class Publisher(db.Model):
__tablename__ = 'publisher' id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False) def __repr__(self):
return self.title class Tag(db.Model):
__tablename__ = 'tag' id = Column(Integer, primary_key=True)
title = Column(String(64), nullable=False) def __repr__(self):
return self.title class Book2Tag(db.Model):
__tablename__ = 'book2tag' id = Column(Integer, primary_key=True)
book_id = Column(Integer, ForeignKey('book.id'))
tag_id = Column(Integer, ForeignKey('tag.id'))

models.py

# run_models.py
from FlaskPlug import db, create_app
# 一定要导入models 否则找不到表创建不出来
from FlaskPlug.models import * app = create_app()
# app_context()就是前两篇文章里面Flask请求上下文走过的流程啊
# app_ctx = AppContext(app)
app_ctx = app.app_context()
# with 就会去走AppContext的__enter__和__exit__方法
# __enter__就是去取app了,__exit__就是删除
with app_ctx:
db.create_all()

run_models.py

# user.py
from flask import Blueprint, session
from FlaskPlug import db
from FlaskPlug.models import Tag, Book, Publisher userBlue = Blueprint("userBlue", __name__) @userBlue.route('/')
def index():
# 给Tag增加一条数据
tag_obj = Tag(title='python')
db.session.add(tag_obj)
db.session.commit()
db.session.close()
return "index"

user.py

# manager.py
from FlaskPlug import create_app app = create_app() if __name__ == '__main__': app.run()

manager.py

9.注意 

flask-sqlalchemy跟sqlalchemy的语法是一模一样的,只是flask-sqlalchemy的session是从flask-sqlalchemy的SQLALchemy实例化对象中拿到。

但是值得注意的还有一点,flask-sqlalchemy除了完全支持sqlalchemy的语法外,它也有自己的查询语法,例如:

"""
使用的是上面例子中的表
"""
# flask-sqlalchemy查询语法:类名.query.查询操作
ret = Tag.query.get(1) # python
ret2 = Tag.query.filter_by(id=1).first() # python
ret3 = Tag.query.filter(Tag.id==1).first() # python # sqlalchemy查询语法:db.session.query(类名).查询操作
ret4 = db.session.query(Tag).get(1) # python
ret5 = db.session.query(Tag).filter_by(id=1).first() # python
ret6 = db.session.query(Tag).filter(Tag.id==1).first() # python """
更多示例
假设User是我们建的一个表
"""
# 查询所有用户数据
User.query.all() # 查询有多少个用户
User.query.count() # 查询第1个用户
User.query.first()
User.query.get(1) # 根据id查询 # 查询id为4的用户[3种方式]
User.query.get(4)
User.query.filter_by(id=4).all() # 简单查询 使用关键字实参的形式来设置字段名
User.query.filter(User.id == 4).all() # 复杂查询 使用恒等式等其他形式来设置条件 # 查询名字结尾字符为g的所有用户[开始 / 包含]
User.query.filter(User.name.endswith("g")).all()
User.query.filter(User.name.startswith("w")).all()
User.query.filter(User.name.contains("n")).all()
User.query.filter(User.name.like("%n%g")).all() # 模糊查询 # 查询名字和邮箱都以li开头的所有用户[2种方式]
User.query.filter(User.name.startswith("li"), User.email.startswith("li")).all() from sqlalchemy import and_
User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))).all() # 查询age是25 或者 `email`以`itheima.com`结尾的所有用户
from sqlalchemy import or_
User.query.filter(or_(User.age == 25, User.email.endswith("itheima.com"))).all() # 查询名字不等于wang的所有用户[2种方式]
from sqlalchemy import not_
User.query.filter(not_(User.name == "wang")).all()
User.query.filter(User.name != "wang").all() # 查询id为[1, 3, 5, 7, 9]的用户
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all() # 所有用户先按年龄从小到大, 再按id从大到小排序, 取前5个
User.query.order_by(User.age, User.id.desc()).limit(5).all() # 分页查询, 每页3个, 查询第2页的数据
pn = User.query.paginate(2, 3)
pn.items # 获取该页的数据
pn.page # 获取当前的页码
pn.pages # 获取总页数

三、Flask-Script

1、下载安装

pip install flask-script

2、使用

1. manager.py下的代码
from FlaskPlug import create_app
from flask_script import Manager app = create_app()
manager = Manager(app) if __name__ == '__main__':
# app.run()
manager.run() 2. 启动命令
这样使用Manager后,我们就可以在Terminal中启动我们的项目
或者在cmd里面 cd到项目目录下启动也可以 启动命令变成
1. 使用默认端口
python manager.py runserver 2. 自定义域名和端口
python manager.py runserver -h 127.0.0.1 -p 8000

3、自定义命令

from FlaskPlug import create_app
from flask_script import Manager, Command app = create_app()
manager = Manager(app) # 方法一
class Hello(Command):
"""
继承Command,并重写run方法
自定义命令
python manager.py hello_girl
"""
def run(self):
print('hello world') # 添加命令和对应的对象
manager.add_command('hello_girl', Hello()) # 方法二
# 位置传参
@manager.command
def my_add(arg1, arg2):
"""
使用装饰器command
自定义命令
python manager.py my_add 1 2
"""
ret = int(arg1) + int(arg2)
print(arg1, arg2, ret) # 方法三
# 关键字传参
# 关键字参数的简写:-n
# 关键字参数全写:--name
# 关键字的描述:dest
@manager.option('-n', '--name', dest='name')
@manager.option('-a', '--age', dest='age')
def person(name, age):
"""
使用装饰器option
自定义命令
执行: python manager.py person -n 小明 --age 28
"""
print(name, age) if __name__ == '__main__':
# app.run()
manager.run()

四、Flask-Migrate

1、下载

pip install flask-migrate

2、注意

flask-migrate依赖flask-script

3、使用

from FlaskPlug import create_app, db
from FlaskPlug.models import *
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
# 1. 导入SQLAlchemy的实例化db和script、migrate插件 app = create_app()
manager = Manager(app)
Migrate(app, db) # 2. 实例化Migrate # 3. 给manager添加命令(MigrateCommand里面就存放了自定义的命令)
manager.add_command("db", MigrateCommand) """
数据库迁移命令
依赖 flask-script
python manager.py db init # 初始化
python manager.py db migrate # 相当于Django的ORM的makemigrations
python manager.py db upgrade # 相当于Django的ORM的migrate
""" if __name__ == '__main__':
# app.run()
manager.run()

Flask的插件session、SQLAlchemy、Script、Migrate的更多相关文章

  1. Flask-Session SQLAlchemy Script Migrate wtforms

    Flask-session Flask-session跟框架自带的session有什么区别呢~ 框架自带的session是通过请求上下文~放入到Local中的~那如果我们想把session放入别的地方 ...

  2. flask基础之session原理详解(十)

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  3. Flask中的session ,自定义实现 session机制, 和 flask-session组件

    session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 ...

  4. flask系列四之SQLAlchemy

    一.SQLAlchemy简介 (1)flask_sqlalchemy是一套ORM框架. (2)ORM(Object Relationship Mapping):模型关系映射 (3)ORM的好处:可以让 ...

  5. 将 flask 中的 session 存储到 SQLite 数据库中

    将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...

  6. flask的orm框架(SQLAlchemy)-操作数据

    # 原创,转载请留言联系 Flask-SQLAlchemy 实现增加数据 用 sqlalchemy 添加数据时,一定要注意,不仅仅要连接到数据表,并且你的创建表的类也必须写进来.而且字段和约束条件要吻 ...

  7. flask 状态保持session和上下文session的区别

    问题场景: 在falsk项目中导入了两个session:    首先,配置文件config.py文件中 有个 flask_session扩展导入了Session  ( from flask_sessi ...

  8. flask中cookie,session的存储,调用,删除 方法(代码demo)

    # -*- encoding: utf-8 -*- # cookie,session的存储,调用,删除 from flask import Flask,make_response,request,se ...

  9. flask总结之session,websocket,上下文管理

    1.关于session flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看 from flask import Fl ...

随机推荐

  1. javaweb项目创建和虚拟主机配置

    首先点击File-àNew-àWeb [roject-à在Projcet Name里写项目名-à点击finish-à会出来一个框,选择NO,一个javaweb项目就创建好了.具体请看下图! 配置服务器 ...

  2. 二次剩余Cipolla算法学习笔记

    对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...

  3. 文件类型解析漏洞防御与攻击(PHP)

    简介: 解析漏洞主要是一些特殊文件被iis.Apache.Nginx等服务在某种情况下解释成脚本文件格式并得以执行而产生的漏洞,一般的思路都是用图片木马来欺骗服务器,上传webshell,达到提权的目 ...

  4. 解决centos7.0安装mysql后出现access defind for user@'localhost'的错误

    在使用yum 安装完mariadb, mariadb-server, mariadb-devel后 1. rpm -qa | grep maria   查看maria相关库的是否在进程中 2. net ...

  5. word表格转html后去除冗余代码

    word可以另存为html文件,通过这个功能,可以快速实现网页展示word内容,特别是表格的编辑,它包含tr.td.th.rowspan.colspan等内容,直接写比较繁琐. 但word转换过来的h ...

  6. Netty学习笔记(三) 自定义编码器

    编写一个网络应用程序需要实现某种编解码器,编解码器的作用就是讲原始字节数据与自定义的消息对象进行互转.网络中都是以字节码的数据形式来传输数据的,服务器编码数据后发送到客户端,客户端需要对数据进行解码, ...

  7. docker与虚拟机有何不同

    docker与虚拟机有何不同 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 容器技术有 ...

  8. gitbook 入门教程之实用插件(新增3个插件)

    插件没有什么逻辑顺序,大家可以按照目录大纲直接定位到感兴趣的插件部分阅读即可. 更多插件正在陆续更新中,敬请期待... 最新更新插件 tbfed-pagefooter 版权页脚插件 gitalk 评论 ...

  9. Python Django对接企业微信第三方服务回调验证的一些坑

    今天公司老总,叫我把公司的企业微信,服务商管理后台中的本地应用进行回调验证. 听起来一脸懵逼,没搞过企业微信对接情况.一头雾水,不知道如何下手. 先讲解一下,企业微信情况. 登录到企业微信后,右上角服 ...

  10. uiautomatorviewer 查看元素报错: Error taking device screenshot: null 原因

    使用uiautomatorviewer 查看android某些页面元素,出现错误Error obtaining UI hierarchy  Reason: Error taking device sc ...