【问题标题】:How to host a flask app on a subfolder of a website?如何在网站的子文件夹上托管烧瓶应用程序?
【发布时间】:2023-04-09 14:09:01
【问题描述】:

我有一个烧瓶应用程序,我想将它托管在网站的子文件夹中,例如 example.com/cn

我像这样配置了我的 nginx

location /cn {
    proxy_pass http://localhost:8000/;
}

所以如果我访问example.com/cn,它会重定向到flask的索引页。

但是,我已经在flask上写了其他页面的路线,例如app.route('/a')。所以如果我点击页面a的链接,URI是example.com/a,那么nginx不能重定向到正确的页面。

​我想我可以像app.route('/cn/a')这样重写flask上的所有路由,但它很复杂。如果有一天我想在example.com/en上部署它,我想我需要重新重写所有的路由。

还有其他方法吗?

【问题讨论】:

    标签: nginx flask


    【解决方案1】:

    您可以在定义蓝图时使用url_prefix="/cn" 选项:

    https://flask.palletsprojects.com/en/2.0.x/blueprints/#nesting-blueprints

    【讨论】:

      【解决方案2】:

      您需要在您的烧瓶应用中添加 APPLICATION_ROOT 参数:

      from flask import Flask, url_for
      from werkzeug.serving import run_simple
      from werkzeug.wsgi import DispatcherMiddleware
      
      app = Flask(__name__)
      app.config['APPLICATION_ROOT'] = '/cn'
      

      如果您需要在服务器上托管多个应用程序,您可以配置 nginx 以将所有请求重定向到由 gunicorn 提供的特定烧瓶应用程序,如下所示。 (如果您的服务器仅托管一个应用程序,则没有必要)在此处了解有关 gunicorn 和 nginx 的更多信息:https://docs.gunicorn.org/en/stable/deploy.html

      server {
          listen 8000;
          server_name example.com;
      
          proxy_intercept_errors on;
          fastcgi_intercept_errors on;
      
          location / {
              include proxy_params;
              proxy_pass http://unix:/path_to_example_flask_app_1/app.sock;
          }
      
          location /cn/{
              include proxy_params;
              proxy_pass http://unix:/path_to_example_flask_app_cn/app.sock;
          }
      }
      
      

      使用 gunicorn 为烧瓶应用提供服务: 这里有一个完整的例子:https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04

      #move into project directory
      /path_to_gunicorn/gunicorn --workers 3 --bind unix:app.sock -m 007 run:app
      

      如果您改用 flask_restful,您也可以通过以下方式指定根路径:

      from flask import Flask
      from flask_restful import Api
      
      app = Flask(__name__)
      app.debug = False
      api = Api(app, prefix='/cn')
      
      api.add_resource(ResourceClass, '/example_path') #will be served when the resource is requested at path /cn/example_path
      
      if __name__ == '__main__':
          app.run(host="0.0.0.0", port=8000)
      

      【讨论】:

      • 看起来是个解决方案。但是当我尝试设置app.config['APPLICATION_ROOT'] = '/cn'时,它没有用。我认为问题出在烧瓶本身。
      【解决方案3】:

      我找到了一个完美的解决方案here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-20
        • 2019-04-06
        • 2020-02-04
        • 1970-01-01
        • 2016-04-14
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多