当省略尾部斜线时,不在Bottle应用程序中加载静态文件

我正在通过Apache使用瓶服务testing文件。

以下是我的Apacheconfiguration:

WSGIDaemonProcess temp user=www-data group=www-data processes=1 threads=5 WSGIScriptAlias /temp /opt/gridops/usage/temp/adapter.wsgi <Directory /opt/gridops/usage/temp> WSGIProcessGroup temp WSGIApplicationGroup %{GLOBAL} Order deny,allow Allow from all </Directory> 

adapter.wsgi

 import os,sys os.chdir(os.path.dirname(__file__)) sys.path = ['/opt/gridops/usage/temp'] + sys.path os.chdir(os.path.dirname(__file__)) sys.stdout = sys.stderr import bottle print "++"*10 import index # This loads your application application = bottle.default_app() 

index.py

 from bottle import mount, run from routes import app from bottle import default_app default_app.push(app) #run() #run(app=app, host='192.168.1.3', port=8085) 

routes.py

 from bottle import Bottle , run,route,static_file,view,template,post,request app = Bottle() print str(dir(app)) @app.route('/static/<filename>') def server_static(filename): return static_file(filename, root='static') @app.route('/') def index(): return template('template',text='This is index page!') 

template.tpl

 <html> <head> <link rel="stylesheet" type="text/css" href="static/prettify.css" /> </head> <body> {{text}} </body> </html> 

目录列表

 temp/ adapter.wsgi index.py routes.py static/ prettify.css views/ template.tpl 

我的问题是每当我尝试使用http://192.168.1.3/temp访问Bottle应用程序时,网页显示没有静态文件,但每当我访问http://192.168.1.3/temp/ [请注意额外/ ]页面正确加载。 我应该做些什么修改,使得http://192.168.1.3/temphttp://192.168.1.3/temp/的结果相同?

任何帮助将是非常有益的

问题

有问题的路线是这样的:

 <link rel="stylesheet" type="text/css" href="static/prettify.css" /> 

CSS文件的地址是相对的,因此完整的绝对地址是从加载的页面位置计算出来的。

对于http://192.168.1.3/temp/ ,它将是http://192.168.1.3/temp/static/prettify.css (正确)。

对于http://192.168.1.3/temp ,它将是http://192.168.1.3/static/prettify.csstemp被认为是根目录下的一个文件,而不是它自己的子目录。

解决方案

没有可行的方法来使用单个相对地址来引用静态资源。 你的应用程序可能会有像/article/some-name/view/content/566这样的“嵌套”路径,或者像/这样简单的路径。

您可以尝试在模板中指定一个基于根的路径,例如/temp/static/prettify.css ,但这意味着如果您将应用程序本身重新定位(例如myapp.example.com/ ,则必须更改该模板myapp.example.com/ from example.com/myapp/ )。

相反,您需要告诉框架为您需要使用的资源创建正确的路径。 Bottle有一个名为get_url的函数来实现这个功能。 不幸的是,在Bottle教程中没有提到它。

代码

这是你应该做的。

template.tpl ,调用get_url引用静态处理程序:

 <link rel="stylesheet" type="text/css" href="{{ get_url('static', filename='prettify.css') }}" /> 

get_url ,输入get_url

 from bottle import Bottle, run, route, static_file, view, template, post, request, get_url 

然后,命名您的处理程序,以便您可以将其名称传递给get_url

 @app.route('/static/<filename>', name='static') def server_static(filename): return static_file(filename, root='static') 

最后,在渲染模板时提供实际的get_url作为模板参数:

 @app.route('/') def index(): return template('template', text='This is index page!', get_url=get_url) 

或者,不要在每个处理程序中提供get_url ,而是在get_url中设置模板默认值:

 from Bottle import SimpleTemplate SimpleTemplate.defaults["get_url"] = app.get_url 

警告 :最后一种方法似乎没有记录,但在邮件列表中由Bottle的作者解释 。

最后的想法

由于网站上的每个页面都应该有一个规范地址,因此您可能希望选择一种形式(使用斜线或不使用斜线)作为规范,并从另一个表格中添加某种重定向。

另一个解决方法是在你的Apache配置文件中添加这个重定向:

 RedirectMatch 301 ^/(temp)$ /$1/ 

这会在你的索引页面的最后添加一个/,所以你不必修改你的代码。

一种解决方法是添加:

 <base href="/temp/"> 

到模板中的头部。