@Mnemon、私の問題を解決してくれてありがとう。私はあなたに賛成票を投じますが、それは許可されていません。それが GAE を使用しない唯一の webapp2 の方法ではない場合、少なくとも機能する方法であると確信しました。
しかし、あなたのソリューションがpipiから「pip install webapp2_static」としてインストール可能になったことにも貢献できます---彼の本名を使用しているように見える作者による... 私が役に立つと思ったその他の webapp2 ドキュメントは、こちらから入手できます。
あなたも使用したペーストを使用して、Linuxデスクトップ開発サーバーにコードを実装しています:
def main():
from paste import httpserver
httpserver.serve(app, host='127.0.0.1', port='8080')
しかし、上記のコード (webapp2_static.py ファイルのコードとまったく同じように見えます) を使用すると、css ファイルをアプリのルートにある static という名前のフォルダーに配置しても、あなたが言ったように機能することがわかりません。
たとえば、/home/user/proj/public_html/app/app.py があります。この py ファイルには、非常にシンプルなサイトのコードとその他の「ビュー」が含まれています。(ペーストが実際にどのように機能するかはわかりません。したがって、本番サーバーに物をアップロードするときに混乱しないように、今のところ public_html は参考のためにそこにあるだけかもしれません。)
したがって、css スタイルシートを /static という名前のフォルダーに入れると、/static を /app または /public_html のサブディレクトリとして入れると、どちらの場所も機能しないことがわかります。代わりに、/proj のサブディレクトリにする必要があります。
私はそれを期待していませんでしたが、私にとっての治療法は、 app.configure.get(..., 'static') 呼び出しのデフォルトの 'static' を 'public_html/app/static' に変更することです。次に、/app 内の /static フォルダーで動作します。
同様に、デフォルトの「static」の代わりに「./app/static/」を使用してpipiコードを使用しても機能しません。代わりに ./public_html/app/static が必要であることがわかりました (または、単に /public_html/app/static または public_html/app/static だったのかもしれません... 忘れていました...そのうちの 1 つが機能していました)。
あなたの abs_path の計算がどのように機能するかをテストし、以下のコードでそれを作り直しました。つまり、1 つのアプリ py ファイルの先頭に次のように記述します。
STATIC_DIR = os.sep + 'tostatic' + os.path.abspath(os.path.dirname(__file__)) + os.sep + 'static'
次に、css を追加したいページ (私の場合はホームページ) に、非常に読みやすいものを配置します。
<link href="{{STATIC_DIR}}/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css">
私が持っているホームページを生成する「ビュー」の場合(envは、テンプレートローダーを引数として取るjinja2環境オブジェクトです):
class Home(webapp2.RequestHandler):
def get(self):
template = env.get_template('index.html')
template_values = {'STATIC_DIR': STATIC_DIR }
self.response.write(template.render(template_values))
最後に、URL ルーティングは次のようになります。
app = webapp2.WSGIApplication(
[
(r'/', Home),
(r'/tostatic/(.+)', StaticView),
], debug=True)
静的ファイル サービスのビューは次のようになりました。
class StaticView(webapp2.RequestHandler):
def get(self, path):
path = os.sep + path
try:
f = open(path, 'r')
self.response.headers.add_header('Content-Type', mimetypes.guess_type(path)[0])
self.response.out.write(f.read())
f.close()
except Exception, e:
print 'Problem in StaticView:', e
self.response.set_status(404)
最後に、あなたのアプローチで私が抱えていた問題は、ファイル システムとの従来の関連付けからの URL の離脱に関して、私や他の初心者に近い問題です。あなたのアプローチでは、「静的」はサブディレクトリであり、URLの前にあるスラッシュの間の文字列であり、インタープリターにどのビュー(どのwebapp2.RequestHandlerサブクラス)を実行するかを伝えます。URL の残りの部分から /static を取得し、後でハードコーディングします。そして、タグの href に何を入れるかを決定するときが来たら、HTML ページのコーダーはその二重性を覚えておく必要があります。{{STATIC_DIR}} テンプレート変数アプローチを使用すると、何をすべきかが明確になります。また、静的ファイルの場所を簡単に再定義できます。変更する必要があるのは STATIC_DIR 宣言だけです。
self.response.set_status(404) は Firebug では表示されますが、Firefox では表示されないことがわかりました。明らかに webapp2 では、独自の HTTP ステータス コード ページを提供して提供する必要があります。