-2

I have tried to re-structure my app using blueprints, and once completed, I get error:"NameError: name 'db' is not defined" I cannot see why the error comes up

This is my init.py File: where app and db is initialised

  import os
  from flask import Flask
    
    
    
    def create_app():
        app = Flask(__name__)
    
        from svc.base.routes import base
        from svc.admin.routes import admin
        from svc.auth.routes import auth
        from flaskext.mysql import MySQL
    
        db = MySQL(app)
        db.init_app(app)
    
        app.config['SECRET_KEY'] = 'MySecretKey'
        app.config['MYSQL_DATABSE_HOST'] = os.environ.get('DB_HOST')
        app.config['MYSQL_DATABASE_PORT'] = os.environ.get('DB_PORT')
        app.config['MYSQL_DATABASE_USER'] = os.environ.get('DB_USER')
        app.config['MYSQL_DATABASE_PASSWORD'] = os.environ.get('DB_PASSWORD')
        app.config['MYSQL_DATABASE_DB'] = os.environ.get('DB_DATABASE')
        app.register_blueprint(admin)
        app.register_blueprint(base)
        app.register_blueprint(auth)
    
        return app
    

my routes.py file where the error occurs after restructuring.

    from flask import Blueprint, render_template
from .forms import LoginForm
from svc import create_app



auth = Blueprint('auth', __name__, template_folder='templates')


@auth.route('/login', methods=['POST', 'GET'])
def login():
    form=LoginForm()
    if form.validate_on_submit():
        email = form.email.data
        password = (form.password.data).encode('utf-8')

        cur = db.get_db().cursor()
        cur.execute("SELECT * FROM `user` WHERE `user_email` = %s",(form.email.data))
        user = cur.fetchone()
        cur.close()
        if user:
            username = user[1]
            role = user[5]
            session_id = user[0]
            if bcrypt.hashpw(password, (user[4].encode('utf-8'))) == (user[4].encode('utf-8')):
              session['loggedin'] = True
              session['id'] = session_id
              session['user'] = username
              session['role'] = role
              flash(f'Login Successful for {user[1]} {user[2]}', category='success')
              return redirect(url_for('account'))
            else:
                flash(f'Login Unsuccessful - Incorrect Password', category='danger')
        else:
            flash(f'Login Unsuccessful - Incorrect Email', category='danger')
    return render_template('login.html', title='Login',form=form)
maxjames
  • 3
  • 1
  • Not only is `db` a local variable in the function, but also not imported in the flask routes file – rdas Apr 11 '21 at 05:46
  • i have tried 'from svc import db' , but get message ' cannot import name 'db' from 'svc' is the 'from svc import create_app' not allowing us to use db once imported? – maxjames Apr 11 '21 at 09:10

1 Answers1

0

flask-mysql is installed by running pip3 install flask-mysqlDB. In your __init__.py, you need to import MySQL from flask_mysqldb and initialize it as follows:

# Your previous imports
from flask_mysqldb import MySQL

db = MySQL()

def create_app():
    app = Flask(__name__)

    db.init_app(app)

    #
Gitau Harrison
  • 3,179
  • 1
  • 19
  • 23