4

そのため、webapp2/jinja2 と Paste サーバーを使用してアプリを正常にデプロイしましたが、静的スタイルシートの提供に問題があります。

私はこのメソッドを介して静的ファイルにアクセスでき、Google-fu で見つけた StaticFileHandler を実装できました。

import os
import mimetypes
import webapp2
import logging

class StaticFileHandler(webapp2.RequestHandler):
    def get(self, path):
        abs_path = os.path.abspath(os.path.join(self.app.config.get('webapp2_static.static_file_path', 'static'), path))
        if os.path.isdir(abs_path) or abs_path.find(os.getcwd()) != 0:
            self.response.set_status(403)
            return
        try:
            f = open(abs_path, 'r')
            self.response.headers.add_header('Content-Type', mimetypes.guess_type(abs_path)[0])
            self.response.out.write(f.read())
            f.close()
        except:
            self.response.set_status(404)

メインアプリのルーティングは次のようになります。

app = webapp2.WSGIApplication([('/', HelloWorld),
                               (r'/display', DisplayHandler),
                               (r'/static/(.+)', StaticFileHandler)
                              ], debug=True)

私の css ファイルは、アプリのルートの下のフォルダーにあります: /static/css/main.css

直接 URL を介してファイルにアクセスし、スタイルシートとしてリンクすることもできますが、スタイルは適用されません。何か案は?スタイルシートを提供する別の方法はありますか? GAE に似た app.yaml を実装する方法はありますか?

4

3 に答える 3

0
self.response.headers.add_header('Content-Type', mimetypes.guess_type(abs_path)[0])
self.response.headers['Content-Type'] = mimetypes.guess_type(abs_path)[0]
于 2016-10-10T11:28:49.887 に答える
0

@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 ステータス コード ページを提供して提供する必要があります。

于 2014-06-04T13:03:32.647 に答える
0

静的ファイル ハンドラーは必要ありません。
これを静的ファイルフォルダーに追加して、アプリをアップロードしますapp.yaml

- url: /static/
  static_dir: static

ドキュメントはこちら: https://developers.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

編集:コメントで以下の回答を参照してください

于 2012-06-07T15:45:20.213 に答える