4

Pythonを使用したWebappでGAE、Google App Engineを使用しています。

カスタム エラー ハンドラ、テンプレート、またはそれらの線に沿って実装しようとしています。GAE はここにいくつかのドキュメントを提供していますが、実装の例では十分ではありません (私にとって)。

また、別の StackOverflow の質問でこれらすべての素晴らしい例を見てきましが、現在のmain.pyファイルに実装する方法を理解できません。

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

class MainHandler(webapp.RequestHandler):
 def get (self, q):
    if q is None:
      q = 'static/index.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))

def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler)], debug=False)
  util.run_wsgi_app (application)

if __name__ == '__main__':
  main ()

MainHandler別のクラスを作成して、の前と新しいのに実装しようとしdefましたMainHandler。404 が表示されたのは、グローバルに表示されたときだけでした。つまり、index.htmlファイルでさえ「404」でした。

私が最後に試したのは、次の行に沿って何かを実装することでした:

if not os.path.exists (_file_):
 self.redirect(/static/error/404.html)

私のapp.yamlファイルは次のとおりです。

application: appname
version: 1
runtime: python
api_version: 1

error_handlers:
  - file: static/error/404.html

  - error_code: over_quota
    file: static/error/404.html

handlers:
- url: /(.*\.(gif|png|jpg|ico|js|css))
  static_files: \1
  upload: (.*\.(gif|png|jpg|ico|js|css))

- url: /robots.txt
  static_files: robots.txt
  upload: robots.txt 

- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico    

- url: .*
  script: main.py

404 ハンドラーの実装に関するガイド/チュートリアルは見つかりません。コードの抜粋だけです。

皆さん、どうもありがとうございました!

編集:以下のハンスからの説明によると、ファイル (またはディレクトリ) がファイルシステムに存在しない場合、404 を返したいと考えています。

私はもう試した:

class ErrorHandler(webapp.RequestHandler):
  def get(self):
     if not os.path.isfile(_file_):
        self.redirect('/static/error/404.html')

無駄に。正しい実装/構文は何ですか?

編集:ヴォスカサへ

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
import logging

import webapp2

def handle_404(request, response, exception):
    logging.exception(exception)
    response.write('Oops! I could swear this page was here!')
    response.set_status(404)

def handle_500(request, response, exception):
    logging.exception(exception)
    response.write('A server error occurred!')
    response.set_status(500)

app = webapp2.WSGIApplication([
    webapp2.Route('/', handler='handlers.HomeHandler', name='home')
])
app.error_handlers[404] = handle_404
app.error_handlers[500] = handle_500

class MainHandler(webapp.RequestHandler):
  def get (self, q):
    if q is None:
      q = 'static/index.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))

def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler)], debug=True)
  util.run_wsgi_app (application)

if __name__ == '__main__':
  main ()
4

2 に答える 2

0

404 および 500 例外の処理については、http : //webapp-improved.appspot.com/guide/exceptions.html をご覧ください。Webapp2 は現在、GAE Python アプリケーションの優先フレームワークです。

于 2012-09-18T10:13:37.210 に答える
0

解決策 1: appengine に静的ファイルを処理させる

次のように、GAE に静的ファイルを処理させることができます。

application: appname
version: 1
runtime: python
api_version: 1

handlers:
- url: /static
  static_dir: static

- url: .*
  script: main.py

これは、静的ファイルの提供がはるかに簡単になるため、より優れています。また、CPU クォータにそれほどカウントされません。

警告は 1 つだけです。以下にファイルが見つからない場合に処理されるカスタム エラーを指定することはできません/static。ハンドラーが URL を取得するとすぐに、要求を終了しようとします。静的 dir ハンドラーが URL を見つけられない場合、制御を に戻しませんmain.py。これがワイルドカード ソリューションになりました。appengine からデフォルトの 404 エラー ページを返すだけです。

解決策 2: アプリケーションから静的ファイルを提供する

静的なカスタム404 ページを本当に作成する必要がある場合は、アプリケーションで作成する必要があります。(それが明確でない場合に備えて、そうすることをお勧めしません。) その場合、あなたは正しい軌道に乗っていました。例のように、追加のハンドラーを作成する必要があります。1行書き直すだけです:

path = os.path.join(os.path.dirname(__file__), 'static', q)

アプリケーション行に、次のようにハンドラーを追加します。

('/static/(.*)?', MainHandler),

ファイルが見つからない場合は、self.response.set_status(404) を呼び出して、必要なカスタム応答メッセージを記述してください。

于 2012-09-18T09:00:01.540 に答える