我使用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_manager
和create_app()
。这些是否与views.py
中使用的相同?
如果有人对构建我的项目可以遵循的示例有任何建议或链接,我们将不胜感激。
感谢。
答案 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()