flask blueprint模块
更改框架为蓝图昨天终于完成,还是挺开心的,下面总结一下自己在其中遇到许多问题。
先上图片
这是blueprint的一个框架结构
#__init__.py(运行的接口)
# -*- coding: utf-8 -*-
from flask import Flask , render_template
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
import mysql.connector
import sys , os
from flask_login import LoginManager
mail=Mail()
moment=Moment()
db=SQLAlchemy()
login_manager=LoginManager()
app = Flask(__name__)
from .func import *
def create_app():
#蓝图注册
from . import auth , main
app.register_blueprint(auth.auth , subdomain='auth')
app.register_blueprint(main.main , subdomain='main')
#配置模块
dir_path = os.path.abspath(os.path.dirname(__file__))
os.environ['mcc_config'] = os.path.join(dir_path , 'config\\development.py')
instance_path = os.path.join(dir_path , 'instance\\config.py')
app.config.from_envvar('mcc_config')
app.config.from_pyfile(instance_path)
#模型初始化
mail.init_app(app)
db.init_app(app)
moment.init_app(app)
login_manager.init_app(app)
@login_manager.user_loader
def load_user(id):
return User.query.get(int(id))
@login_manager.unauthorized_handler
def unauthorized():
return render_template("index.html")
#数据库初始化
with app.app_context():
db.create_all()
dic=dict()
dic['name']='root'
dic['password']='root'
dic['email']=None
dic['confirmed']=True
dic['pri']=2
db_user_push(dic)
return app
其实关于蓝图框架没有太多可说的,这次更改框架还是挺顺利的,唯一遇到的一个问题是关于python包循环导入的问题,还是学长帮忙解决的。下面重点说一下python包循环导入问题。
首先python包导入的流程是由运行的python文件出发,遇到包导入就按路径查找包,再分析另一个包中需要导入的模块,也就是说此时运行的文件下面的变量函数都是没有初始化的,不能被调用,如果被调用则会出现循环导入的问题。
简单来说假设运行A文件,import B文件中的函数或变量,然后B文件import C文件中的变量,C又import A文件中的变量,而A又没有初始化变量,所以会报错,所以你会看到许多书上将一下可能导致问题的包尽量靠近调用的地方才去import,关于这一点,我上面的代码中就有体现
from .func import *
def create_app():
#蓝图注册
from . import auth , main
app.register_blueprint(auth.auth , subdomain=‘auth’)
app.register_blueprint(main.main , subdomain=‘main’)
我是在函数中import的一个包的变量
总结:ok吧,最近挺忙的,只说到这里了。