Flask项目的拆分
Flask介绍:
- Flask是一种使用Python编写的轻量级的Web框架, WSGI工具采用Werkzeug,模板引擎使用Jinja2, Flask使用的是BSD授权
- Flask核心简单, 可以自定义扩展, 没有固定的数据库和模板等设置, 简单轻便
- Flask也有web开发'微'框架之称
开始项目
下面是官网中的一个Flask项目, 只需要简单的7行代码, 我们就是可以让一个Flask项目运行起来。
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
项目拆分
Flask由于框架体量小, 所有的拓展包都需要我们自己去安装, 所以一个Flask项目会安装很多的拓展包是很常见的。基于项目的可拓展性和代码的可阅读性, 当代码量较大时, 将所有的代码写在一个文件中是一件很可怕的事, 所以我们就要对其进行拆分, 主要还是参考 MVC模式进行, 将不同的功能放在其对应的模块中, 方便我们进行阅读。
-
创建app的文件目录, 将views 和 models 写入其中进行管理
-
在app目录下创建 static 目录,存放静态文件
-
在app目录下创建 templates 目录, 存放网页模板
-
在app目录下创建settings.py文件,存放所有的配置文件
- 创建ext.py文件,用来管理扩展的工具函数
- 在app下的__init__.py文件中,创建一个函数用来创建app并整合所有的配置信息。
- 将主要的执行内容写在执行文件manage.py中,manage.py和创建的app目录为同一级, 在这里面调用app下__init__.py中创建的函数来创建app,并且引入 Manage 进行管理app。
整体结构:
from flask_script import Manager from myapp import create_app app = create_app('debug') manage = Manager(app = app) if __name__ == '__main__': manage.run()
static目录用来存放静态文件目录。如css,js,img等。templates目录用来存放html模板文件。
from flask import Flask from myapp.ext import init_ext #导入扩展库中的函数 from myapp.settings import conf #从settings中导入配置文件 from myapp.views import init_blue #从views中导入注册蓝图的函数 from myapp.models import db #从models中导入实例化SQLAlchemy的对象 def create_app(env_name): #创建一个创建app的函数,并传入要配置的环境 if not env_name in conf.keys(): raise Exception('环境名称有问题') app = Flask(__name__) app.config.from_object(conf.get(env_name)) #根据传入的环境导入settings配置 init_ext(app) #实例化第三方插件 init_blue(app) #实例化蓝图 return app
from flask_session import Session from flask_sqlalchemy import SQLAlchemy def init_ext(app): #实例化第三方插件并绑定app se = Session() se.init_app(app) db = SQLAlchemy() db.init_app(app)
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() #实例化SQLAlchemy对象 class Student(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) name = db.Column(db.String(30),nullable=True,unique=True)
import os from redis import StrictRedis # 数据库的连接拼写规则 def get_db_uri(conf): uri = '{backend}+{engine}://{user}:{pwd}@{host}:{port}/{name}'.format( backend=conf.get('backend'), engine=conf.get('engine'), user=conf.get('user'), pwd=conf.get('pwd'), host=conf.get('host'), port=conf.get('port'), name=conf.get('name'), ) return uri class Config: Debug = False Test = False Online = False SECRET_KEY = 'aisofhas' #做session持久化的配置 SESSION_TYPE = 'redis' # 指定session存储方案 SESSION_KEY_PREFIX = 'myapp:' # 设置缓存的开头 SQLALCHEMY_TRACK_MODIFICATIONS = False class DebugConfig(Config): Debug = True SESSION_REDIS = StrictRedis('127.0.0.1',db=1) DATABASE = { 'backend':'mysql', 'engine':'pymysql', 'user':os.environ.get('DB_USER'), 'pwd':os.environ.get('DB_PASSWD'), 'host':'127.0.0.1', 'port':3306, 'name':'hzflask' } SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE) class TestConfig(Config): Test = True SESSION_REDIS = StrictRedis('127.0.0.1', db=2) DATABASE = { 'backend': 'mysql', 'engine': 'pymysql', 'user': os.environ.get('DB_USER'), 'pwd': os.environ.get('DB_PASSWD'), 'host': '127.0.0.1', 'port': 3306, 'name': 'hzflask2' } SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE) class OnlineConfig(Config): Online = True SESSION_REDIS = StrictRedis('127.0.0.1', db=3) DATABASE = { 'backend': 'mysql', 'engine': 'pymysql', 'user': os.environ.get('DB_USER'), 'pwd': os.environ.get('DB_PASSWD'), 'host': '127.0.0.1', 'port': 3306, 'name': 'hzflask3' } SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE) conf = { 'debug':DebugConfig, 'test':TestConfig, 'online':OnlineConfig, }
from flask import Blueprint, session, render_template from myapp.models import db, Student blue = Blueprint('wusir',__name__) def init_blue(app): app.register_blueprint(blue) @blue.route('/') def index(): return 'index'
Fake it,till you make it