2

私はBottleを使用してapacheを介してテストファイルを提供しています。

以下は私のapache設定です:

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、ウェブページを使用してボトルアプリにアクセスしようとすると、静的ファイルなしで表示されますが、http://192.168.1.3/temp/[余分な注意/]にアクセスするたびにページが正しく読み込まれることです。http://192.168.1.3/temp両方の結果が同じになるように、どのような変更を行う必要があり http://192.168.1.3/temp/ますか?

どんな助けでも非常に役に立ちます

4

3 に答える 3

15

問題

問題のある行はこれです:

<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/から example.com/myapp/)にテンプレートを変更する必要があることを意味します。

代わりに、使用する必要のあるリソースへの正しいパスを作成するようにフレームワークに指示する必要があります。ボトルには、これを容易にするget_urlという名前の関数があります。残念ながら、ボトルのチュートリアルでは言及されていません。

コード

これがあなたがすべきことです。

で、静的ハンドラーを参照してtemplate.tpl呼び出します。get_url

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

routes.py、インポート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のように設定します。index.py

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

警告:最後の方法は文書化されていないようですが、メーリングリストのBottleの作者によって説明されました

最終的な考え

Webサイトのすべてのページに正規のアドレスが必要なため、1つのフォーム(末尾にスラッシュがある場合とない場合)を正規として選択し、他のフォームからのリダイレクトを追加することをお勧めします。

于 2012-03-01T23:01:53.623 に答える
1

別の回避策は、Apache構成ファイルにこのリダイレクトを追加することです。

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

これにより、インデックスページの最後に/が追加されるため、コードを変更する必要はありません。

于 2014-10-14T10:09:33.343 に答える
0

1つの回避策は、次を追加することです。

<base href="/temp/">

テンプレートの頭に。

于 2014-03-04T21:57:48.297 に答える