user2268507
user2268507

Reputation:

How to structure Flask User app?

I use supervisor to run my app. It is structured as follows:

My app layout

my_app
    __init__.py 
    my_app
        __init__.py
        startup
            create_app.py
            create_users.py
            common_settings.py
        core
            __init__.py
            models.py
            views.py

Outer __init__.py

from my_app import app

Inner __init__.py

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)           # The WSGI compliant web application object
db = SQLAlchemy(app)            # Setup Flask-SQLAlchemy
manager = Manager(app)          # Setup Flask-Script

from my_app.startup.create_app import create_app
create_app()

create_app.py

def create_app(extra_config_settings={}):        

    """
    Initialize Flask applicaton
    """

    # ***** Initialize app config settings *****
    # Read common settings from 'app/startup/common_settings.py' file
    app.config.from_object('app.startup.common_settings')

    # Read environment-specific settings from file defined by OS  environment variable 'ENV_SETTINGS_FILE'
    app.config.from_envvar('ENV_SETTINGS_FILE')

    # Load all blueprints with their manager commands, models and views

    # Setup Flask-User to handle user account related forms
    from my_app.core.models import User

    # Setup Flask-User
    db_adapter = SQLAlchemyAdapter(db, User)        # Setup the SQLAlchemy DB Adapter
    user_manager = UserManager(db_adapter, app)     # Init Flask-User and bind to app

    from my_app import core                                                     

    return app

my_app/core/__init__.py

from . import models
from . import views

views.py

from my_app import db, app

'''
Register a new user
'''
@app.route('/register', methods = ['POST'])
def register_user():  
    user_manager =  app.user_manager
    db_adapter = user_manager.db_adapter  

I was trying to follow an example I found online.

I'm creating the variables db_adapter and user_manager in create_app(). Are these the same ones being used in my views.py?

If anyone has any suggestions or links to examples that I can follow to structure my project, it would be greatly appreciated.

Thanks.

Upvotes: 3

Views: 1161

Answers (1)

davidism
davidism

Reputation: 127260

Assuming that that's how Flask-User works (sets the user_manager attribute on app), this is trivial to determine, just compare them in the create_app function when you still have a direct reference to the objects.

db_adapter = SQLAlchemyAdapter(db, User)
user_manager = UserManager(db_adapter, app)
assert db_adapter is user_manager.db_adapter
assert user_manager is app.user_manager

However, your entire project layout doesn't make much sense. You should be creating the entire app inside the create_app factory. You should not have an __init__.py file at the top level, that's the project folder not the package. You should use current_app within views to access the app, since it will only be created at runtime by the factory. You should create a manage.py file at the project level to use the factory.

my_project/
  my_app/
      __init__.py
      models.py
      views.py
      defaults.py
  instance/
      config.py
  manage.py

__init__.py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object('my_app.defaults')
    app.config.from_pyfile('config.py')
    db.init_app(app)
    from my_app.views import bp
    app.register_blueprint(bp)
    return app

models.py:

from my_app import db

class User(db.Model):
    ...

views.py:

from flask import Blueprint, render_template
from my_app.models import User

bp = Blueprint('app', __name__)

@bp.route('/')
def index():
    return render_template('index.html')

manage.py:

#!/usr/bin/env python
from flask_script import Manager
from my_app import create_app

Manager(create_app).run()

Upvotes: 2

Related Questions