标签:程序 执行 优先 world 查看 性能 工具 error 提高
通常一个项目的启动文件为app.py或者manage.py,所以我们先将项目中启动文件的文件名进行修改。这里我修改为manage.py。
在立项准备的时候,我们在manage.py中写入了太多的内容,导致整个文件已经非常的臃肿了,所以,这里我们要对代码进行抽取,我们只让manage.py做一个程序的启动入口,而不是让所有代码都写入其中。
这里,我们自顶向下开始抽取。
from redis import StrictRedis
还有这里
这里是因为找不到Config这个类了,被移到config.py这个文件里面了,我们导入一下
from config import Config
封装代码的步骤:
2.1app的相关代码都是业务逻辑相关代码,所以,我们最好将其封装到业务逻辑部分中。
这里,我们需要新建一个Python Package的包,命名为info,以后里面就存储着业务逻辑相关代码。
这里,我们将标注的部分抽取到info的__init__中,因为业务逻辑只要一开始,就会优先执行__init__文件中的内容。
当把代码放入到__init__中,可以看到下面内容:
2.2 从这里我们可以看到一堆报红的,然后我们在返回manage.py去看,把灰色的包全部收集起来,扔到_init_.py这个目录下就可以了
2.3我们返回manage.py可以看到app和db报红,我们从_init_.py中导入一下
from info import app, db
然后运行一下代码检查一下,就可以了
不同开发环境会有不同的配置,所以我们要封装不同开发环境下的配置信息。
首先我们在config.py中建立不同环境的类如下:
class DevlopmentConfig(Config): """开发环境""" pass class ProductionConfig(Config): """生产环境""" DEBUG = False SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/demo" class TestConfig(Config): """测试环境""" pass
这里专门解释下为啥要用工厂方式来创建app,因为app的相关信息的修改和业务逻辑有关。而你们公司会有个恶心的职业,叫做测试,每当我们修改了业务逻辑的相关内容,都必须要进行测试,哪怕只是加了个空格,改了标点也要重新测试(没错,就是这么恶心)。所以,你懂的!
而目前和业务逻辑无关的是manage.py和config.py我们要看看从哪个文件入手,来间接地处理这个问题,这里我们选择的是manage.py
info -> __init__.py
首先我们创建一个函数 create_app ,然后给他传一个参数,再然后app的内容全部踢进去,然后改一下配置类所需要接受的参数
def create_app(env): app = Flask(__name__) app.config.from_object(env) # 开启CSRF保护:因为项目中的表单不再使用FlaskForm来实现,所以不会自动地开启CSRF保护,需要我们自己开启 CSRFProtect(app) # 创建连接到MySQL数据库的对象 db = SQLAlchemy(app) # 创建连接到Redis数据库的对象 redis_store = StrictRedis(host=env.REDIS_HOST, port=env.REDIS_PORT) # 指定session存储在后端的位置 Session(app)
当我们这么玩的时候,manage.py中的app和db导包的时候发生了错误,这是因为我们把这部分内容放到了函数中,这样我们就没法从__init__中读取这两个内容了。这里先不用解决,注释掉,
from info import create_app app = create_app("参数")
configs = { "dev": DevelopmentConfig, "pro": ProductionConfig, "test": TestConfig, }
然后我们就可以在manage.py里面加入那个参数了
app = create_app("dev")
参数传到了__init__中去创建app了。但是__init__中并不知道这个参数的作用,所以需要导入相关包,并完成相关配置:
from config import configs
def create_app(env):
app = Flask(__name__)
app.config.from_object(configs[env])
# 开启CSRF保护:因为项目中的表单不再使用FlaskForm来实现,所以不会自动地开启CSRF保护,需要我们自己开启
CSRFProtect(app)
# 创建连接到MySQL数据库的对象
db = SQLAlchemy(app)
# 创建连接到Redis数据库的对象
redis_store = StrictRedis(host=configs[env].REDIS_HOST, port=configs[env].REDIS_PORT)
# 指定session存储在后端的位置
Session(app)
测试之后报错,是因为没有给函数一个返回值,所以报错
所以,在工厂函数的后面加上:
return app
4.1 首先我们第一步遇到问题先看源码:
默认app为None,再看下边,如果app不等于None,那么就初始化app,由此我们可以写出以下代码:
...... # 创建SQLAlchemy对象 db = SQLAlchemy() def create_app(env): ...... # 创建连接到MySQL数据库的对象 # db = SQLAlchemy(app) db.init_app(app) ......
那么,怎样才能在不改动应用程序代码的情况下实现在不同的环境记录不同详细程度的日志呢?这就是日志等级的作用了,我们通过配置文件指定我们需要的日志等级就可以了。
不同的应用程序所定义的日志等级可能会有所差别,分的详细点的会包含以下几个等级:
import logging from logging.handlers import RotatingFileHandler # 设置日志的记录等级 logging.basicConfig(level=logging.DEBUG) # 调试debug级 # 创建日志记录器,指明日志保存的路径(前面的logs为文件的名字,需要我们手动创建,后面则会自动创建)、每个日志文件的最大大小、保存的日志文件个数上限。 file_log_handler = RotatingFileHandler("../logs/log", maxBytes=1024*1024*100, backupCount=10) # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息 formatter = logging.Formatter(‘%(levelname)s %(filename)s:%(lineno)d %(message)s‘) # 为刚创建的日志记录器设置日志记录格式 file_log_handler.setFormatter(formatter) # 为全局的日志工具对象(flask app使用的)添加日志记录器 logging.getLogger().addHandler(file_log_handler)
创建一个函数 setup_log 并且将日志信息踢进去,并且接受一个参数为level
def setup_log(level): # 设置日志的记录等级 logging.basicConfig(level=level) # 调试debug级 # 创建日志记录器,指明日志保存的路径(前面的logs为文件的名字,需要我们手动创建,后面则会自动创建)、每个日志文件的最大大小、保存的日志文件个数上限。 file_log_handler = RotatingFileHandler("./logs/log", maxBytes=1024*1024*100, backupCount=10) # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息 formatter = logging.Formatter(‘%(levelname)s %(filename)s:%(lineno)d %(message)s‘) # 为刚创建的日志记录器设置日志记录格式 file_log_handler.setFormatter(formatter) # 为全局的日志工具对象(flask app使用的)添加日志记录器 logging.getLogger().addHandler(file_log_handler)
并且到环境工厂里面去,调试一下logging的日志等级
然后我们可以传参数了
它什么都没有,但我们的前端又能运行,他是个怎么回事儿呢
因为它的一个日志级别比其他的日志级别都高,所以其他日志级别都不能显示,只能显示ERROR级别的一个信息。
我们将业务逻辑统一放在了info文件夹中,而项目中我们又会分为很多的业务模块,比如用户模块、订单模块等。
在info的业务逻辑模块中,除了放业务模块还会放其他内容,所以我们需要新建一个文件夹来专门存放这些业务模块。
这里,我们在info下新建一个名为modules的文件夹来存放它们。
我们在modules中新建一个名为index的python package文件夹用于存放主页的相关内容,并在这个文件夹中新建一个views.py来存储视图函数相关内容。
首先我们把我们的视图函数从manage.py中抽取并剪切到我们的views.py里面去
然后我们在views.py中进行对刚刚抽取过来的代码经行一个修改以及蓝图的导入
from flask import Blueprint index_blue = Blueprint("index", __name__) @index_blue.route("/") def index(): # 测试Redis连接是否成功 # redis_store.set("name", "heitao") # 测试session from flask import session session["age"] = 20 return "hello world"
因为前边蓝图的建立跟路由和视图的关系不大,所以我们抽取出来经行一下封装,我们把它扔到index下的_init_.py里面
from flask import Blueprint index_blue = Blueprint("index", __name__) from . import views
然后我们回到views.py里面导入一下index_blue
from . import index_blue
基本上我们蓝图就弄的差不多了,就差最后一步注册路由了,我们到info文件夹中_init_.py中去注册一下路由
from info.moudles.index.views import index_blue ...... def create_app(env): ...... # 注册路由 app.register_blueprint(index_blue)
return app
标签:程序 执行 优先 world 查看 性能 工具 error 提高
原文地址:https://www.cnblogs.com/ls011218/p/13766126.html