Flask项目目录一般规范

一、使用组件

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 使用

SQLAlchemy操作数据库的ORM组件

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

四、目录结构

Flask项目目录结构

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'

猜你喜欢

转载自blog.csdn.net/u011146423/article/details/84875932