使用蓝图创建flask项目结构

程序目录结构

flask/
	|-- app/  # 程序包,程序的主体文件都包含在内
		|-- main/
			|-- __init__.py
			|-- views.py
			|-- errors.py
		|-- templates/
			|-- index.html
		|-- static/
		|-- __init__.py
	|--config.py   # 配置选项
	|--manage.py	# 程序启动脚本
	|--requirements.txt	# 需求文件

配置选项

config.py

# 程序的配置
import os

basedir = os.path.abspath(os.path.dirname(__file__))

class Config: # 通用配置
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
    FLASKY_MAIL_SENDER = 'Flasky Admin <[email protected]>'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')

    @staticmethod # 使类不需要实例化就可以被调用
    def init_app(app):
        pass

class DevelopmentConfig(Config):
    DEBUG = True
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
        'sqllite:///' + os.path.join(basedir, 'data-dev.sqlite')

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')
        

class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')


config = {
    'development' : DevelopmentConfig,
    'testing' : TestingConfig,
    'production' : ProductionConfig,
    'default' : DevelopmentConfig
}
        

        

程序包 APP/

使用程序工厂函数

app/__init__.py
# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from config import config

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()

def create_app(config_name):
    '''程序的工厂函数'''
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    # 初始化扩展
    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)

    # 注册蓝本
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

创建蓝本

app/main/__init__.py
# -*- coding: utf-8 -*-
# 创建蓝本
from flask import Blueprint

main = Blueprint('main', __name__)

from . import views, errors

定义蓝本中的路由

app/main/views.py
# -*- coding: utf-8 -*-
# 蓝本中定义的程序路由
from datetime import datetime
from flask import render_template, session, redirect, url_for
from . import main

@main.route('/', methods=['GET', 'POST'])
    return "hello world"

定义蓝本中的错误处理程序

app/main/errors.py
# -*- coding: utf-8 -*-
# 蓝本中的错误处理程序
from flask import render_template
from . import main


# 如果使用 errorhandler 修饰器,那么只有蓝本中的
# 错误才能触发处理程序。要想注册程序全局的错误处理程序,必须使用 app_errorhandler
@main.app_errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@main.app_errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500

启动脚本

manage.py
# -*- coding: utf-8 -*-
# 启动脚本
import os
from app import create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

if __name__ == '__main__':
    app.run()

需求文件

程序中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号。如果
要在另一台电脑上重新生成虚拟环境, 这个文件的重要性就体现出来了,例如部署程序时
使用的电脑。 pip 可以使用如下命令自动生成这个文件:
(venv) $ pip freeze >requirements.txt

文章完结
@快乐是一切

猜你喜欢

转载自blog.csdn.net/weixin_42600599/article/details/83829782