我正在通过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/temp
和http://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.css
。 temp
被认为是根目录下的一个文件,而不是它自己的子目录。
没有可行的方法来使用单个相对地址来引用静态资源。 你的应用程序可能会有像/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/">
到模板中的头部。