一、使用组件
Flask-SQLAlchemy:SQLAlchemy与Flask的粘合剂
Flask-script:生成命令组件,cmd命令行写入命令运行,例子:python manage.py runserver
-- 增加 runserver 命令
-- 自定义命令
Flask-migrate:数据迁移组件
pipreqs:自动查找项目中使用的组件和模块,版本
-- 命令:pipreqs ./ --encoding=utf8
-- 命令:pip install -r requirements.txt # 安装所有相关依赖
vitualenv:用来建立一个虚拟的python环境,一个专属于项目的python环境。
-- 命令:virtualenv my_project_env # 搭建虚拟环境
-- 命令:virtualenv -p /usr/bin/python2.7 my_project_env # 选择运行环境
-- 命令:source my_project_env/bin/activate # 使用虚拟环境
-- 命令:deactivate # 停止虚拟环境
虚拟环境集中管理模块:
virtualenvwrapper:
鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper。
virtualenvwrapper提供了一系列命令使得和虚拟环境工作变得便利,它把你所有的虚拟环境都放在一个地方。
安装virtualenvwrapper(确保virtualenv已安装)
pip install virtualenvwrapper
pip install virtualenvwrapper-win # Windows使用该命令
安装完成后,在~/.bashrc写入以下内容
export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh
第一行:virtualenvwrapper存放虚拟环境目录
第二行:virtrualenvwrapper会安装到python的bin目录下,所以该路径是python安装目录下bin/virtualenvwrapper.sh
source ~/.bashrc # 读入配置文件,立即生效
virtualenvwrapper基本使用:
1.创建虚拟环境 mkvirtualenv
mkvirtualenv venv
这样会在WORKON_HOME变量指定的目录下新建名为venv的虚拟环境。
若想指定python版本,可通过"--python"指定python解释器
mkvirtualenv --python=/usr/local/python3.5.3/bin/python venv
2. 基本命令
查看当前的虚拟环境目录:
[root@localhost ~]# workon
py2
py3
切换到虚拟环境:
[root@localhost ~]# workon py3
(py3) [root@localhost ~]#
退出虚拟环境:
(py3) [root@localhost ~]# deactivate
[root@localhost ~]#
删除虚拟环境:
rmvirtualenv venv
二、Flask-SQLAlchemy 使用
2.1、Flask-SQLAlchemy 配置 Flask settings
class DBConfig(object):
# 数据库连接的地址
SQLALCHEMY_DATABASE_URI= 'mysql+pymysql://root:[email protected]:3306/flask_sql?charset=utf8'
SQLALCHEMY_BINDS=
SQLALCHEMY_NATIVE_UNICODE=
SQLALCHEMY_ECHO=
SQLALCHEMY_RECORD_QUERIES=
# 数据库连接个数
SQLALCHEMY_POOL_SIZE= 10
# 数据库延迟响应时间“秒”
SQLALCHEMY_POOL_TIMEOUT= 30
SQLALCHEMY_POOL_RECYCLE=
# 数据库连接最大超出个数
SQLALCHEMY_MAX_OVERFLOW= 5
SQLALCHEMY_COMMIT_ON_TEARDOWN=
SQLALCHEMY_TRACK_MODIFICATIONS=
2.2、Flask-SQLAlchemy 创建数据表
# 创建的步骤
1、__init__.py 导入 Flask-SQLAlchemy 并实例化 Flask-SQLAlchemy
PS:必须在蓝图导入的上面;
必须导入 from .models import * 。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
导入 Flask 蓝图
from .models import *
2、初始化 app 因为要读取app中的配置文件
db.init_app(app)
3、在配置文件中写入配置
4、创建 models.py (创建数据表)
app文件夹下创建 models.py 文件
5、生成表(使用app上下文)
from flask05 import db,create_app
app = create_app()
app_ctx = app.app_context() # app_ctx = app/g
with app_ctx: # with 自动调用 __enter__,通过 LocalStack 放入 local 中
db.create_all() # 调用 LocalStack 放入 Local 中获取app,再去app中获取配置
6、基于 ORM 对数据库进行操作
引入:
from app文件夹 import db
from app文件夹 import models
db.session.add() # 给表中添加数据
db.session.remove() # 关闭数据连接
2.3、常用的 SQLAlchemy 语句
2.3.1、常用的SQLAlchemy查询过滤器
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit | 使用指定的值限定原查询返回的结果 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
2.3.2、常用的SQLAlchemy查询执行器
方法 | 说明 |
---|---|
all() | 以列表形式返回查询的所有结果 |
first() | 返回查询的第一个结果,如果未查到,返回None |
first_or_404() | 返回查询的第一个结果,如果未查到,返回404 |
get() | 返回指定主键对应的行,如不存在,返回None |
get_or_404() | 返回指定主键对应的行,如不存在,返回404 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |
# 创建表:
db.create_all()
# 删除表
db.drop_all()
三、Flask-script 使用
3.1、创建并运行命令
首先,创建一个Python模板运行命令脚本,可起名为manager.py;在该文件中,必须有一个Manager实例,Manager类追踪所有在命令行中调用的命令和处理过程的调用运行情况;
Manager只有一个参数——Flask实例,也可以是一个函数或其他的返回Flask实例;
调用manager.run()启动Manager实例接收命令行中的命令;
#-*-coding:utf8-*-
from flask_script import Manager
from debug import app
manager = Manager(app)
if __name__ == '__main__':
manager.run()
其次,创建并加入命令;有三种方法创建命令,即创建Command子类、使用@command修饰符、使用@option修饰符;
3.2、创建Command子类,Command子类必须定义一个run方法
举例:创建Hello命令,并将Hello命令加入Manager实例。
from flask_script import Manager,Server
from flask_script import Command
from debug import app
manager = Manager(app)
class Hello(Command):
'hello world'
def run(self):
print 'hello world'
#自定义命令一:
manager.add_command('hello', Hello())
# 自定义命令二:
manager.add_command("runserver", Server()) #命令是runserver
if __name__ == '__main__':
manager.run()
执行如下命令:
python manager.py hello
> hello world
python manager.py runserver
> hello world
3.3、使用Command实例的@command装饰器
#-*-coding:utf8-*-
from flask_script import Manager
from debug import app
manager = Manager(app)
@manager.command
def hello():
'hello world'
print 'hello world'
if __name__ == '__main__':
manager.run()
该方法创建命令的运行方式和Command类创建的运行方式相同
python manager.py hello
> hello world
3.4、使用Command实例的@option装饰器
复杂情况下,建议使用@option;可以有多个@option选项参数;
from flask_script import Manager
from debug import app
manager = Manager(app)
#命令既可以用-n,也可以用--name,dest="name"用户输入的命令的名字作为参数传给了函数中的name
@manager.option('-n', '--name', dest='name', help='Your name', default='world')
#命令既可以用-u,也可以用--url,dest="url"用户输入的命令的url作为参数传给了函数中的url
@manager.option('-u', '--url', dest='url', default='www.csdn.com')
def hello(name, url):
'hello world or hello <setting name>'
print 'hello', name
print url
if __name__ == '__main__':
manager.run()
运行方式如下:
python manager.py hello
> hello world
> www.csdn.com
python manager.py hello -n sissiy -u www.sissiy.com
> hello sissiy
> www.sissiy.com
python manager.py hello -name sissiy -url www.sissiy.com
> hello sissiy
> www.sissiy.com
四、目录结构
4.1、__init__.py 文件
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # SQLAlchemy的所有东西都已经得到
# from flask_session import Session # 使用 session 这个是信息存储的,不是SQLAlchemy中的session。
from .views.index import home
# 必须导入进来,才能创建获取创建数据库类信息
from .models import *
def create_app():
app = Flask(__name__)
# app.debug = True # 自动更新程序更改
# app.config['debug'] = True
app.config.from_object('settings.ProConfig')
app.register_blueprint(home)
# Session(app)
db.init_app(app)
return app
4.2、models.py文件
from sqlalchemy import Column,String,Integer
from flask05 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,nullable=False)
4.3、settings.py文件
class DBConfig(object):
SQLALCHEMY_BINDS = None
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/flask_sql?charset=utf8'
# 数据库连接个数
SQLALCHEMY_POOL_SIZE = 10
# 数据库延迟响应时间“秒”
SQLALCHEMY_POOL_TIMEOUT = 30
# 数据库连接最大超出个数
SQLALCHEMY_MAX_OVERFLOW = 5
SQLALCHEMY_TRACK_MODIFICATIONS = False
DEBUG = True # 自动更新程序更改
pass
class ProConfig(DBConfig):
pass
class SessionConfig(object):
SESSION_SECRET_key = 'xxxx'
SESSION_TYPE = 'redis' # session类型为redis
SESSION_PERMANENT = False # 如果设置为True,则关闭浏览器session就失效。
SESSION_USE_SIGNER = False # 是否对发送到浏览器上session的cookie值进行加密
SESSION_KEY_PREFIX = 'session:' # 保存到session中的值的前缀
SESSION_REDIS = redis.Redis(host='127.0.0.1', port='6379', password='123123') # 用于连接redis的配置
4.4、create_table.py文件
from flask05 import db,create_app
app = create_app()
app_ctx = app.app_context() # app_ctx = app/g
with app_ctx: # with 自动调用 __enter__,通过 LocalStack 放入 local 中
db.create_all() # 调用 LocalStack 放入 Local 中获取app,再去app中获取配置
4.5、manage.py文件
from flask05 import create_app,db
from flask_script import Manager # 创建命令组件
from flask_migrate import Migrate,MigrateCommand # 迁移数据库操作组件
app = create_app()
manager = Manager(app)
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand) # 创建“db”相关命令
'''
# 相关命令
python manage.py db init # 初始化
python manage.py db migrate # 创建数据库相关迁移文件 == Django makemigrations
python manage.py db upgrade # 吧数据库相关迁移文件提交到数据库生成数据 == Django migrate
'''
if __name__ == '__main__':
# app.run()
manager.run()
4.6、index.py视图处理文件
from flask import Blueprint,render_template as render
from flask05 import db,models
# from flask05.models import Users
home = Blueprint('index',__name__)
@home.route('/',methods=['GET','POST'])
def index():
# 添加内容到数据表
# db.session.add(Users(id=3,name='任盈盈',depart_id=3))
db.session.add(models.Users(id=4,name='任我行',depart_id=2))
db.session.commit()
db.session.remove()
return 'index'