首页 > 开发 > Python > 正文

flask的工厂函数无法启用

2017-09-06 19:23:59  来源:网友分享

提示错误如下

C:\Documents and Settings\Administrator\PycharmProjects\flaskr>python manage.py runserverTraceback (most recent call last):  File "manage.py", line 7, in <module>    from app import create_app  File "C:\Documents and Settings\Administrator\PycharmProjects\flaskr\app\__init__.py", line 9, in <module>    from .views import init_views  File "C:\Documents and Settings\Administrator\PycharmProjects\flaskr\app\views.py", line 8, in <module>    from .models import User  File "C:\Documents and Settings\Administrator\PycharmProjects\flaskr\app\models.py", line 4, in <module>    from . import dbImportError: cannot import name db

代码如下所示

__init__.py

from  flask import Flaskfrom flask_bootstrap import Bootstrapfrom flask_sqlalchemy import SQLAlchemyimport osfrom .views import init_viewsbasedir = os.path.abspath(os.path.dirname(__file__))bootstrap = Bootstrap()db = SQLAlchemy()#定义create_app函数def create_app():    app = Flask(__name__)#设置密匙    app.config['SECRET_KEY'] = 'hard to guess string'#配置数据库    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(basedir,'data.sqlite')    #app.config['SQLALCHEMY_DATABASE_URL'] = 'sqlite:////' + os.path.join(basedir,'data.sqlite')    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True    #app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True    bootstrap.init_app(app)    db.init_app(app)    init_views(app)    return app

models.py

from . import db#定义模型class Role(db.Model):    __tablename__ = 'roles'    id = db.Column(db.Integer,primary_key=True)    name = db.Column(db.String(64),unique=True)    users = db.relationship('User',backref='role',lazy='dynamic')        def __repr__(self):        return '<Role %r>' % self.nameclass User(db.Model):    __tablename__ = 'users'    id = db.Column(db.Integer,primary_key=True)    username = db.Column(db.String(64),unique=True,index=True)    role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))    def __repr__(self):        return '<User %r>' %self.username

views.py

from  flask import render_template,make_response,redirect,session,abortfrom .forms import NameFormfrom .models import Userfrom . import dbdef init_views(app):    #视图函数    @app.route('/',methods=['GET','POST'])    def index():         ##在视图函数中操作数据库        form = NameForm()        if form.validate_on_submit():            user = User.query.filter_by(username=form.name.data).first()            if user is None:                user = User(username = form.name.data)                db.session.add(user)                session['known']=False            else:                session['known']=True            session['name'] = form.name.data            form.name.data=''            return redirect('index')        return render_template('index.html',form=form,name=session.get('name'),known=session.get('known',False))    @app.route('/make_response')    def make_request():        response = make_response('<h1>Hello!!!</h1>')        response.set_cookie('answer','42')        return response    @app.route('/user/<name>')    def user(name):        return render_template('user.html',name=name)    @app.route('/test/')    def test_get():        return render_template('test.html')    #重定向    @app.route('/redirect')    def redirect_test():        return redirect('http://www.baidu.com')    @app.route('/abort/<id>')    def get_abort(id):        user = load_user(id)        if not user:            abort(404)        return '<h1>Hello,%s</h1>'%user.name    @app.errorhandler(404)    def page_not_found(e):        return render_template('404.html'),404    @app.errorhandler(500)    def internal_server_error(e):        return render_template('500.html'),500

forms.py

from flask_wtf import Formfrom wtforms import StringField,SubmitFieldfrom wtforms.validators import Required##表单类class NameForm(Form):    name=StringField('what is you name?',validators=[Required()])    submit =SubmitField('Submit')

解决方案

把__init__.py修改一下就可以了

#!/usr/bin/env python# coding=utf-8from  flask import Flaskfrom flask_bootstrap import Bootstrapfrom flask_sqlalchemy import SQLAlchemyimport os# from .views import init_viewsbasedir = os.path.abspath(os.path.dirname(__file__))bootstrap = Bootstrap()db = SQLAlchemy()def create_app():    app = Flask(__name__)    app.config['SECRET_KEY'] = 'hard to guess string'    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(basedir,'data.sqlite')    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True    bootstrap.init_app(app)    db.init_app(app)###下面的就是修改内容###    from .views import init_views    init_views(app)    return app