如何在网站的子文件夹上托管 Flask 应用程序?

时间:2021-05-28 10:19:13

标签: nginx flask

我有一个 Flask 应用,我想将它托管在网站的子文件夹中,例如 std::identity{}

我像这样配置了我的 nginx

example.com/cn

所以如果我访问location /cn { proxy_pass http://localhost:8000/; } ,它会重定向到flask的索引页面。

不过我已经在flask上写了其他页面的路由,比如example.com/cn。因此,如果我单击页面 app.route('/a') 的链接,URI 为 a,那么 example.com/a 无法将其重定向到正确的页面。

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

有人有其他方法吗?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您需要将 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)

答案 2 :(得分:0)

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