如何构建Flask User app?

时间:2016-01-19 13:11:28

标签: python flask

我使用supervisor来运行我的应用。其结构如下:

我的应用布局

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

外__init __。py

from my_app import app

内部__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 /核心/ __初始化__。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  

我试图效法我在网上找到的一个例子。

我正在db_adapter中创建变量user_managercreate_app()。这些是否与views.py中使用的相同?

如果有人对构建我的项目可以遵循的示例有任何建议或链接,我们将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:2)

假设这就是Flask-User的工作方式(在user_manager上设置app属性),这一点很容易确定,只需在create_app函数中比较它们直接引用对象。

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

但是,整个项目布局没有多大意义。您应该在create_app工厂内创建整个应用程序。你不应该在顶层有一个__init__.py文件,那是项目文件夹而不是包。您应该在视图中使用current_app来访问应用程序,因为它只会在工厂运行时创建。您应该在项目级别创建一个manage.py文件以使用工厂。

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()