使用 Apache 2 调整转发到具有路由和静态文件的 Flask 应用程序
Adapting the forwarding to Flask application with routes and static files with the Apache 2
http://servername.com:5000/ 上有一个 Flask 应用程序 运行。它封装了一些 Bootstrap 和 gis_webapp/static/...
中提供的静态文件,它们按应有的方式工作。
这是项目的树:
gis_webapp
├── __init__.py
├── routes.py
├── gunicorn_gis_webapp_conf.py
├── static
│ ├── bootstrap-4.6.0-dist
│ │ ├── css
│ │ └── js
│ ├── css
│ │ └── style.css
│ └── img
│ ├── favicon.png
│ └── glogo.gif
└── templates
├── about.html
├── base.html
├── contact.html
├── errors
│ └── 404.html
├── index.html
└── result.html
只要我通过 http://servername.com/ 在同一服务器上运行的 mod_auth_gssapi
通过 Apache2 应用转发( http://servername.com:80/) 使用 http://servername.com/gis/继承http://servername.com:5000/的全部内容,以下内容停止工作:
路由之间的通信
当我点击导航栏中的 联系人 link 时,它会将我带到 http://servername.com/contact/ (which does not exist) instead of http://servername.com/gis/contact
来自 /static
文件夹的内容
Bootstrap 来自 gis_webapp/static/bootstrap-4.6.0-dist
文件夹
我做错了什么?
.conf
文件的内容如下:
<VirtualHost *:80>
<Location /gis/>
ProxyPass "http://localhost:5000/"
ProxyPassReverse "http://localhost:5000/"
</Location>
</VirtualHost>
我在这些线程中找到了一些建议并尝试应用这些建议:
Link to Flask static files with url_for
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='bootstrap-4.6.0-dist/css/bootstrap.min.css') }}">
gis_webapp = Flask(__name__, root_path=os.getcwd())
<link rel="icon" type="image/png" href="../static/img/favicon.png">
gis_webapp = Flask(__name__,
static_url_path='',
static_folder='static',
template_folder='templates')
很遗憾,他们没有解决我的问题。
我还尝试修改 routes.py
文件中的路径。
# main page
@gis_webapp.route("/", methods=["GET"])
@gis_webapp.route("/index", methods=["GET"])
def index():
return render_template("index.html", title="GIS")
改写为:
# main page
@gis_webapp.route("/gis/", methods=["GET"])
@gis_webapp.route("/gis/index", methods=["GET"])
def index():
return render_template("index.html", title="GIS")
我还发现这个线程 Serving static files through apache 建议应用 ALIAS
,但这对我来说不是一个解决方案,因为以后 Apache2 和 Flask 应用程序将在不同的服务器上。但是,有一种观点:statics需要由Apache来分发,即使你再分散到不同的服务器上,那么最好将statics挂载到Apache所在的地方。
到现在我可以部分解决 2. 和 3. 在 'base.html' 中完成调整的问题,所以这个参考:
<link rel="icon" type="image/png" href="/static/img/favicon.png">
已更改为:
<link rel="icon" type="image/png" href="/gis/static/img/favicon.png">
所以,之后我可以在 http://servername.com/gis/ 页面上看到 /static
文件夹的内容,但是当我打开它虽然http://servername.com:5000/ ...不明白为什么。有什么想法吗?
解决方案是部署 SCRIPT_NAME
变量和 Gunicorn as suggested in this article:
SCRIPT_NAME="/gis" gunicorn --bind=0.0.0.0:5000 gis_webapp:gis_webapp
之后我可以通过 http://servername.com/gis/
访问该应用程序
然而初始URLhttp://servername.com:5000/ was yielding the Internal Server Error
. To overcome it, simply use the http://servername.com:5000/gis/.
http://servername.com:5000/ 上有一个 Flask 应用程序 运行。它封装了一些 Bootstrap 和 gis_webapp/static/...
中提供的静态文件,它们按应有的方式工作。
这是项目的树:
gis_webapp
├── __init__.py
├── routes.py
├── gunicorn_gis_webapp_conf.py
├── static
│ ├── bootstrap-4.6.0-dist
│ │ ├── css
│ │ └── js
│ ├── css
│ │ └── style.css
│ └── img
│ ├── favicon.png
│ └── glogo.gif
└── templates
├── about.html
├── base.html
├── contact.html
├── errors
│ └── 404.html
├── index.html
└── result.html
只要我通过 http://servername.com/ 在同一服务器上运行的 mod_auth_gssapi
通过 Apache2 应用转发( http://servername.com:80/) 使用 http://servername.com/gis/继承http://servername.com:5000/的全部内容,以下内容停止工作:
路由之间的通信
当我点击导航栏中的 联系人 link 时,它会将我带到 http://servername.com/contact/ (which does not exist) instead of http://servername.com/gis/contact
来自
/static
文件夹的内容Bootstrap 来自
gis_webapp/static/bootstrap-4.6.0-dist
文件夹
我做错了什么?
.conf
文件的内容如下:
<VirtualHost *:80>
<Location /gis/>
ProxyPass "http://localhost:5000/"
ProxyPassReverse "http://localhost:5000/"
</Location>
</VirtualHost>
我在这些线程中找到了一些建议并尝试应用这些建议:
Link to Flask static files with url_for
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='bootstrap-4.6.0-dist/css/bootstrap.min.css') }}">
gis_webapp = Flask(__name__, root_path=os.getcwd())
<link rel="icon" type="image/png" href="../static/img/favicon.png">
gis_webapp = Flask(__name__, static_url_path='', static_folder='static', template_folder='templates')
很遗憾,他们没有解决我的问题。
我还尝试修改 routes.py
文件中的路径。
# main page
@gis_webapp.route("/", methods=["GET"])
@gis_webapp.route("/index", methods=["GET"])
def index():
return render_template("index.html", title="GIS")
改写为:
# main page
@gis_webapp.route("/gis/", methods=["GET"])
@gis_webapp.route("/gis/index", methods=["GET"])
def index():
return render_template("index.html", title="GIS")
我还发现这个线程 Serving static files through apache 建议应用 ALIAS
,但这对我来说不是一个解决方案,因为以后 Apache2 和 Flask 应用程序将在不同的服务器上。但是,有一种观点:statics需要由Apache来分发,即使你再分散到不同的服务器上,那么最好将statics挂载到Apache所在的地方。
到现在我可以部分解决 2. 和 3. 在 'base.html' 中完成调整的问题,所以这个参考:
<link rel="icon" type="image/png" href="/static/img/favicon.png">
已更改为:
<link rel="icon" type="image/png" href="/gis/static/img/favicon.png">
所以,之后我可以在 http://servername.com/gis/ 页面上看到 /static
文件夹的内容,但是当我打开它虽然http://servername.com:5000/ ...不明白为什么。有什么想法吗?
解决方案是部署 SCRIPT_NAME
变量和 Gunicorn as suggested in this article:
SCRIPT_NAME="/gis" gunicorn --bind=0.0.0.0:5000 gis_webapp:gis_webapp
之后我可以通过 http://servername.com/gis/
访问该应用程序然而初始URLhttp://servername.com:5000/ was yielding the Internal Server Error
. To overcome it, simply use the http://servername.com:5000/gis/.