Flask组件:flask-sqlalchemy & flask-script & flask-migrate
flask-sqlalchemy组件
项目目录结构:
flask目录 # 项目名
|--- flaskdir
|--- static # 静态文件
|--- templates # 模板
|--- models.py # models 文件
|--- __init__.py # 创建 app 对象
|--- views # 视图
|--- account.py
|--- user.py
|--- manage.py # 入口程序
|--- settings.py # 配置文件
|--- create_table.py # 在数据库中创建表的脚本
manage.py
from flaskdir import create_app app = create_app() if __name__ == "__main__":
app.run()
settings.py
from redis import Redis class BaseConfig(object):
# SESSION_TYPE = "redis"
# SESSION_REDIS = Redis(host="127.0.0.1",port=6379) # ##### SQLAlchemy 相关配置 #####
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:tj037778@127.0.0.1:3306/dbtest?charset=utf8" # 连接 数据库
SQLALCHEMY_POOL_SIZE = 10 # 连接池大小
SQLALCHEMY_MAX_OVERFLOW = 5 # 连接池 最大溢出 SQLALCHEMY_TRACK_MODIFICATIONS = False pass class ProConfig(BaseConfig):
pass
create_table.py
# 在数据库中创建表的脚本 from flaskdir import db,create_app # 导入 db
from flaskdir.views import * # 一定导入 models ,否则找不到表 创建不出来
app = create_app()
app_ctx = app.app_context() # 导入 Flask 的 app 上下文
with app_ctx: # __enter__ 方法:通过 LocalStack 放入 Local 中
db.create_all() # 在 with app_ctx 中,执行 db.create_all();调用 LocalStack 获取 Local 中的 app,再去 app 中获取配置
db.drop_all()
离线脚本:
# db就我们在__init__文件中实例化的对象,它包含了create_all(创建表)和drop_all(删除表)的命令,但是由于在使用db时我们需要用到app中关于数据库的配置(从上下文中取),但是这时项目没有运行,没有请求,在local类中没有app的内容,所以我们使用 with 方法,利用上下文管理,将需要的内容添加到loacl对象中
flaskdir/__init__.py
from flask import Flask
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy # 从 flask-sqlalchemy 引入 SQLAlchemy # flask-sqlalchemy 的使用方法:
# 第一步: 导入并实例化 SQLAlchemy
db = SQLAlchemy() # db 这个对象中含有 SQLAlchemy 需要的所有东西,唯独少 数据库连接
# 注意: SQLAlchemy 的实例化必须要在 蓝图的上面 from .views.account import ac
from .views.user import usr
from .models import * # 也要导入 models 中的类 def create_app():
app = Flask(__name__)
app.config.from_object("settings.ProConfig") app.register_blueprint(ac)
app.register_blueprint(usr) # Flask-session:第一步要实例化 Session;第二步要加配置
# Session(app) # 第三步:注册:app 中含有所有的配置文件,所以这一步是去 配置文件中读取 数据库连接
db.init_app(app) return app
flaskdir/models.py
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
from flaskdir import db # 第二步:让 Users 继承 db.Model;db.Model 就是 SQLAlchemy 中的 Base
class Users(db.Model):
__tablename__ = 'users' id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
# email = Column(String(32), unique=True)
# ctime = Column(DateTime, default=datetime.datetime.now)
# extra = Column(Text, nullable=True)
flaskdir/views/user.py
from flask import Blueprint
from flaskdir.models import * # 导入 model 类
from flaskdir import db usr = Blueprint("sur",__name__) @usr.route("/index")
def login():
# 使用flask-sqlalchemy 在数据库 users 表中插入一条数据
"""
db.session.add(Users(name="neo")) # db,session 会为每个线程在 数据库连接池 中获取一个连接;基于 scoped_session 实现的
db.session.commit() # 提交
db.session.remove() # 把连接归还给连接池
"""
# 使用 flask-sqlalchemy 从数据库 users 表中获取数据
ret = db.session.query(Users).all()
print(ret)
db.session.remove() return "index"
flaskdir/views/account.py 略
flask-sqlalchemy用法归纳:
a. 下载安装
pip3 install flask-sqlalchemy b. chun.__init__.py
导入并实例化SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() 注意事项:
- 必须在导入蓝图之前
- 必须导入models.py c. 初始化
db.init_app(app) d. 在配置文件中写入配置
# ##### SQLALchemy配置文件 #####
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/s9day122?charset=utf8"
SQLALCHEMY_POOL_SIZE = 10
SQLALCHEMY_MAX_OVERFLOW = 5 e. 创建models.py中的类(对应数据库表)
flaskdir/models.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer,String,Text,Date,DateTime
from sqlalchemy import create_engine
from chun import db class Users(db.Model):
__tablename__ = 'users' id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
depart_id = Column(Integer) f. 生成表(使用app上下文)
from flaskdir import db,create_app app = create_app()
app_ctx = app.app_context() # app_ctx = app/g
with app_ctx: # __enter__,通过LocalStack放入Local中
db.create_all() # 调用LocalStack放入Local中获取app,再去app中获取配置 g. 基于ORM对数据库进行操作。
from flask import Blueprint
from flaskdir import db
from flaskdir import models
us = Blueprint('us',__name__) @us.route('/index')
def index():
# 使用SQLAlchemy在数据库中插入一条数据
# db.session.add(models.Users(name='高件套',depart_id=1))
# db.session.commit()
# db.session.remove()
result = db.session.query(models.Users).all()
print(result)
db.session.remove() return 'Index'
补充: with obj 的用法
class Foo:
def __init__(self):
pass def __enter__(self):
print("进入with obj") def __exit__(self, exc_type, exc_val, exc_tb):
print("退出with obj") obj = Foo() with obj: # with 对象 会自动触发类的 __enter__ 方法
print("在with obj 中")
"""
with 对象: 时,刚进入 缩进时会自动触发 __enter__ 方法
缩进执行完后,会自动触发 __exit__ 方法
""" # 打印结果:
# 进入with obj
# 在with obj 中
# 退出with obj
flask-script组件:
安装:
pip install flask-script
还是以上面的代码为例:
manage.py
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 # flask-script 用途一:按照位置传参
@manager.command
def custom(arg):
"""
自定义命令;有个这个,以后不仅可以 runserver,还可以 run 这个命令(函数)
执行 如: python manage.py custom 123
"""
print(arg)
"""
用途如:创建表时不用再写 create_all()、create_table.py 这样的离线脚本,而可以直接放到 这个命令里面
""" # flask-script 用途二:按照关键字传参
@manager.option("-n", "--name", dest="name") # -n 代表 --name,表示 要传入函数参数的 "name"
@manager.option("-u", "--url", dest="url") # -u 代表 --url,表示 要传入函数参数的 "url"
def cmd(name, url):
"""
自定义命令:
执行如:python manage.py cmd -n neo -u http://www.baidu.com
"""
print(name, url) if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run() """
flask-script runserver 启动程序:
在命令行输入: python manage.py runserver
并且也可以指定 IP 和 端口,如: python manage.py runserver -h 127.0.0.1 -p 8001
"""
flask-script用途小结:
1. 多了 runserver 的命令:
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run() 2. 按照位置传参的命令:
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 # flask-script 用途一:按照位置传参
@manager.command
def custom(arg):
"""
自定义命令;有个这个,以后不仅可以 runserver,还可以 run 这个命令(函数)
执行 如: python manage.py custom 123
"""
print(arg)
"""
用途如:创建表时不用再写 create_all()、create_table.py 这样的离线脚本,而可以直接放到 这个命令里面
""" if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run() 3. 按照关键字传参人命令:
from flaskdir import create_app
from flask_script import Manager # 从 flask-script 引入 Manager app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化 # flask-script 用途二:按照关键字传参
@manager.option("-n", "--name", dest="name") # -n 代表 --name,表示 要传入函数参数的 "name"
@manager.option("-u", "--url", dest="url") # -u 代表 --url,表示 要传入函数参数的 "url"
def cmd(name, url):
"""
自定义命令:
执行如:python manage.py cmd -n neo -u http://www.baidu.com
"""
print(name, url) if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run()
flask-migrate 组件:
安装:
pip install flask-migrate
flask-migrate 用于 数据库迁移,该组件依赖于 flask-script 组件
以上面代码为例:
from flaskdir import create_app,db
from flask_script import Manager # 从 flask-script 引入 Manager
from flask_migrate import Migrate,MigrateCommand # 导入 Migrate 和 MigrateCommand app = create_app()
manager = Manager(app) # 利用 app 进行 Manager 实例化
Migrate(app,db) # 利用 app 和 db 进行 Migrate 的实例化;db 中有数据库的相关操作
"""
数据库迁移命令:
python manage.py db init # 初始化;仅第一次时需要执行该命令
python manage.py db migrate # 相当于 Django 的 makemigrations
python manage.py db upgrade # 相当于 Django 的 migrate
"""
manager.add_command("db",MigrateCommand) # 定义了一个 "db" 的命令; flask-migrate 依赖于 flask-script if __name__ == "__main__":
# app.run()
manager.run() # 启动程序改为 manager.run()
pipreqs 工具:
pipreqs 用于 找到项目中使用的所有组件和版本
安装:
pip install pipreqs
用法:
# 生成 requirements.txt 文件
pipreqs ./ --encoding=utf-8 # 会自动找到 当前目录下 所有文件所依赖的所有的组件和库,并生成一个 requirements.txt 的文件 # 下载所有依赖
pip install -r requirements.txt
虚拟环境:
# 安装:
pip install virtualenv # 命令行创建虚拟环境:
virtualenv env1 --no-site-packages # 创建虚拟环境;--no-site-packages 表示 该虚拟环境中不会安装 python site-packages 目录下的组件和库 # 进入虚拟环境:
cd Scripts
activate # 退出虚拟环境:
deactivate # 也是在 Scripts 目录下
Flask组件:flask-sqlalchemy & flask-script & flask-migrate的更多相关文章
- Flask的插件session、SQLAlchemy、Script、Migrate
一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...
- Flask组件
组件踩坑记录 : 先注册组件在使用配置(...) flask-script Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shel ...
- 14、Flask实战第14天:Flask使用SQLAlchemy
flask-sqlalchemy使用详解 之前我们用到的SQLAchemy是可以单独使用的,不需要用到Flask 如果我们在Flask框架中使用SQLAchemy,可以使用flask_sqlalche ...
- Flask 中的 SQLAlchemy 使用教程
Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...
- flask连接数据库mysql+SQLAlchemy
使用flask框架链接2种数据库 ----------db.py # -*- coding: utf-8 -*- # Flask hello world from flask import Flask ...
- 【数据可视化之Flask】快速设计和部署Flask网站
Flask是Python应用于WEB开发的第三方开源框架,以设计简单高效著称.我也尝试过Django,相对于Flask显得更加全面同样也更加笨重,并且我也不需要它的后台管理功能,因此选择了Flask作 ...
- Flask 学习篇二:学习Flask过程中的记录
Flask学习笔记: GitHub上面的Flask实践项目 https://github.com/SilentCC/FlaskWeb 1.Application and Request Context ...
- Flask最强攻略 - 跟DragonFire学Flask - 第一篇 你好,我叫Flask
首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...
- [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题
http://www.cnblogs.com/mizhon/p/4242073.html [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题 最近想 ...
随机推荐
- JAVA中abstract,interface,final,static语法
转自:http://www.cnblogs.com/yueue/archive/2010/04/20/1715863.html 一,抽象类:abstract 1,只要有一个或一个以上抽象方法的 ...
- jmeter(七)函数
JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functionName(var1,var2,var3)},-functionName匹配函数 ...
- laravel5.5文件上传
/** * 上传文件 * @param Request $request * @return array */ public function upload(Re ...
- JavaScript——class与原型对象
原型对象的意义 通过new 一个构造函数,我们能够获得一个实例,在new 的过程中,程序会在内存中申请一块区域,同时我们可以加参数,所以每个对象都不一样. 原型对象则是同一个构造函数 new 出来的所 ...
- leetcode_238. Product of Array Except Self_思维
https://leetcode.com/problems/product-of-array-except-self/ 给一个vector<int> nums,输出一个vector< ...
- CAD参数绘制实心圆弧填充(com接口)
C#中实现代码说明: private void DrawPathToHatch1() { //把路径的开始位置移动指定的点 //参数一为点的X坐标 ,参数二为点的Y坐标,参数三为该点处开始宽度,对Po ...
- 用 vue cli 脚手架搭建单页面 Vue 应用(进阶2)
1.配置 Node 环境. 自行百度吧. 安装好了之后,打开 cmd .运行 node -v .显示版本号,就是安装成功了. 注:不要安装8.0.0以上的版本,和 vue-cli 不兼容. 我使用的 ...
- java_线程优先级
线程优先级分为三个等级: MAX_PIORITY:10 优先 MIN_PRIORITY:1 NORM_PRIORITY:5 默认 getPriority:获取优先级 setPriority:设置优 ...
- mac vim编辑器常用操作快捷方式
0 行首$ (shift+6)行尾gg 文首G(shift+g) 文尾A(Shift+a)文尾,并编辑ctrl+f 向上翻页ctrl+b 向下翻页ctrl+u 向上翻半页ctrl+d 向下翻半页数字+ ...
- springboot Tomcat connector configured to listen on port 8081 failed to start.
启动报 Tomcat connector configured to listen on port 8081 failed to start. The port may already be in ...