Flask WSGI子域调度导致应用程序实例上的404s

时间:2014-11-23 23:30:04

标签: python flask

我的目标是让我的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,但是也没有看到工作。

我非常感谢任何建议,因为我一直在努力解决这个问题。

1 个答案:

答案 0 :(得分:0)

在看了几眼之后,问题是导入只会运行一次,导致路由只与创建的第一个应用相关联。

基本上,视图只会在第一次app / subdomain命中时实例化一次。

解决方案是在初始化路径的每个模块中导入您的函数而不是导入。

views.py

def init_views(app):
    @app.route('/page')
    def page():
        return "asdf"

因此,每个应用程序都有自己的路由副本,而不仅仅是第一个。

真是太好了。