1

我正在使用 Flask 构建一个网站,我想使用指示的SubdomainDispatcher,但我不知道如何使它工作(它缺少run启动服务器的初始值)。

这是代码:

这里给出的 create_app 函数:

def create_app(database_uri, debug=False):
    app = Flask(__name__)
    app.debug = debug

    # set up your database
    app.engine = create_engine(database_uri)

    # add your modules
    app.register_module(frontend)

    # other setup tasks

    return app

子域调度程序:

class SubdomainDispatcher(object):

    def __init__(self, domain, create_app):
        self.domain = domain
        self.create_app = create_app
        self.lock = Lock()
        self.instances = {}

    def get_application(self, host):
        host = host.split(':')[0]
        assert host.endswith(self.domain), 'Configuration error'
        subdomain = host[:-len(self.domain)].rstrip('.')
        with self.lock:
            app = self.instances.get(subdomain)
            if app is None:
                app = self.create_app(subdomain)
                self.instances[subdomain] = app
            return app

    def __call__(self, environ, start_response):
        app = self.get_application(environ['HTTP_HOST'])
        return app(environ, start_response)

主应用程序:

def make_app(subdomain):
    user = get_user_for_subdomain(subdomain)
    if user is None:
        # if there is no user for that subdomain we still have
        # to return a WSGI application that handles that request.
        # We can then just return the NotFound() exception as
        # application which will render a default 404 page.
        # You might also redirect the user to the main page then
        return NotFound()

    # otherwise create the application for the specific user
    return create_app(user)

application = SubdomainDispatcher('example.com', make_app)

到目前为止,我的代码可以正常工作,但随后就停止了。这是正常的,因为没有地方,有:

if __name__ == "__main__":
    application = create_app(config.DATABASE_URI, debug=True)
    application.run()

使初始服务器运行的代码。

我试过这个:

if __name__ == "__main__":
    application = SubdomainDispatcher('example.com', make_app)
    application.run()

但它失败了:

AttributeError:“SubdomainDispatcher”对象没有属性“运行”

如何使用 SubdomainDispatcher 运行它?

4

2 回答 2

2

让我们分析一下您的代码。

您创建一个SubdomainDispatcher类,该类创建一个Flask application并根据host传入的返回它get_application

这也是一个callable

问题是该.run方法是Flask对象(应用程序本身)的。它仅用于test开发期间的应用程序,并且适用于单个应用程序。

所以你不能用开发服务器作为一个整体系统来测试它。您一次只能测试一个域(应用程序)。

if __name__ == "__main__":
    application = SubdomainDispatcher('example.com', make_app)
    app = application.get_application('example.com')
    app.run()

测试服务器不是全功能服务器。

更好的解决方案

顺便说一句,我认为如果你解释你想要达到的目标(而不是你打算如何在烧瓶中做到这一点:))我们可以找到一个更好的解决方案。即使用 Flask 子域关键字,或使用@before_request基于某些东西本地化应用程序参数的关键字。如果问题只是加载基于子域的用户类,则不需要不同的 Flask 应用程序(特别是因为您使用相同的代码库),但您只需要一个@before_request处理程序。

于 2013-08-23T08:59:21.543 回答
1

为了SubdomainDispatcher与 Flask 本地开发服务器一起使用,我将大部分代码复制flask.Flask.run到一个单独的函数中,并挂接到那里的SubdomainDispatcher中间件中。繁重的工作由以下人员完成werkzeug.serving.run_simple

def rundevserver(host=None, port=None, domain='', debug=True, **options):
    from werkzeug.serving import run_simple

    if host is None:
        host = '127.0.0.1'
    if port is None:
        port = 5000
    options.setdefault('use_reloader', debug)
    options.setdefault('use_debugger', debug)

    app = SubdomainDispatcher(create_app, domain, debug=debug)

    run_simple(host, port, app, **options)

有关更多详细信息,请参阅我的博客文章:Flask 本地开发服务器的基于子域的配置

于 2014-02-22T09:43:21.690 回答