【问题标题】:Flask WSGI subdomain dispatching causing 404s on app instancesFlask WSGI 子域调度导致应用实例出现 404
【发布时间】:2014-11-23 23:30:03
【问题描述】:

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

非常感谢任何建议,因为我已经为此苦苦挣扎了一段时间。

【问题讨论】:

    标签: python flask


    【解决方案1】:

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

    基本上视图只会在第一个应用程序/子域命中时实例化一次。

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

    views.py 中也是如此:

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

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

    真是太棒了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 2014-07-23
      • 2018-10-09
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多