我的目标是让我的Flask应用程序根据子域切换数据库。
subdomain dispatcher described in the docs很有用,我正在使用something based off it
一切似乎都运行正常,但只有2个实例似乎在给定时间工作,尽管SubDomainDispatcher加载了多个实例。其他实例给出404。
我的 create_app 功能如下:
def create_app(subdomain):
app = Flask("proj", static_folder="../static", template_folder="../templates")
with app.app_context():
app.config.from_object('proj.config')
app.config.update(
SQLALCHEMY_DATABASE_URI = 'mysql://root:password@localhost:3306/' + subdomain + '_proj',
HOST = subdomain + app.config["HOST"],
)
from proj.models import db, Models
engine = sqlalchemy.create_engine("mysql://root:passwordT@localhost:3306")
engine.execute("CREATE DATABASE IF NOT EXISTS "+subdomain+"_proj")
engine.execute("use "+subdomain+"_proj")
db.init_app(app)
db.create_all()
mail = Mail(app)
store = DictStore()
KVSessionExtension(store, app)
import proj.views
return app
我正在使用带mod_wsgi的Apache:
Apache配置
<VirtualHost *:80>
ServerName mywebsite.com
ServerAdmin admin@mywebsite.com
WSGIScriptAlias / /var/www/proj/app.wsgi
WSGIDaemonProcess application user=www-data group=www-data processes=5 threads=20
<Directory /var/www/proj/proj/>
Order allow,deny
Allow from all
</Directory>
#Alias /static /var/www/FlaskApp/FlaskApp/static
#<Directory /var/www/FlaskApp/FlaskApp/static/>
# Order allow,deny
# Allow from all
#</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
wsgi文件
import sys
sys.path.insert(0, '/var/www/proj')
from subdomain import SubdomainDispatcher
from proj import create_app
application = SubdomainDispatcher(create_app)
看起来像某种竞争条件,但我不知道它会发生在何处或为何会发生。我已经尝试将进程和线程的数量减少到1,但是也没有看到工作。
我非常感谢任何建议,因为我一直在努力解决这个问题。
答案 0 :(得分:0)
在看了几眼之后,问题是导入只会运行一次,导致路由只与创建的第一个应用相关联。
基本上,视图只会在第一次app / subdomain命中时实例化一次。
解决方案是在初始化路径的每个模块中导入您的函数而不是导入。
views.py :
def init_views(app):
@app.route('/page')
def page():
return "asdf"
因此,每个应用程序都有自己的路由副本,而不仅仅是第一个。
真是太好了。