部署Bottle应用到Apache:是否需为所有路由添加/app1前缀?
不需要修改所有路由前缀!
你完全不用给每个路由手动加上/app1前缀,Apache的WSGIScriptAlias配置已经帮你处理了路径映射的问题,只要调整一下Bottle应用的配置和WSGI脚本的写法就行,具体步骤如下:
1. 调整你的Bottle WSGI脚本
确保你的应用脚本(比如app1.py)导出标准的WSGI应用对象,而不是用run()启动内置服务器。示例代码如下:
from bottle import Bottle, route # 创建Bottle应用实例 app = Bottle() # 保持路由不变,依然以"/"开头 @app.route('/') def app1_root(): return "这是app1的根页面,访问路径是 /app1/" @app.route('/user/<name>') def show_user(name): return f"你好,{name}!访问路径是 /app1/user/{name}" # 导出WSGI应用对象,Apache会调用这个变量 application = app
2. 确认Apache配置正确
你的现有配置WSGIScriptAlias /app1 /var/www/app1/app1.py是没问题的,但建议加上目录权限配置确保Apache能访问文件:
WSGIScriptAlias /app1 /var/www/app1/app1.py <Directory /var/www/app1> Require all granted </Directory>
3. 处理链接生成(可选)
如果你的应用需要生成内部链接(比如用Bottle的url()函数),为了让链接自动带上/app1前缀,在应用里添加一行配置:
app.config['SCRIPT_NAME'] = '/app1'
这样调用url('/user/foo')就会返回/app1/user/foo,而不是/user/foo。
原理说明
当Apache收到http://yourdomain/app1/user/foo这样的请求时,会把SCRIPT_NAME设为/app1,把PATH_INFO设为/user/foo。Bottle默认是基于PATH_INFO来匹配路由的,所以你原来写的@app.route('/user/<name>')会直接匹配这个请求,完全不需要修改路由路径。
内容的提问来源于stack exchange,提问作者amonroejj
相关产品推荐
相关产品推荐

