web-dev-qa-db-ja.com

Google App Engineと404エラー

他の場所で見つかったヒントを使用してGAEに静的Webサイトをセットアップしましたが、404エラーを返す方法がわかりません。私のapp.yamlファイルは次のようになります

- url: (.*)/
  static_files: static\1/index.html
  upload: static/index.html

- url: /
  static_dir: static

すべての静的html/jpgファイルが静的ディレクトリに保存されています。上記は存在するファイルに対して機能しますが、存在しない場合はnull長のファイルを返します。答えはおそらくpythonスクリプトを記述して404エラーを返すことですが、存在する静的ファイルを提供するように設定しますが、存在しないファイルに対してスクリプトを実行するにはどうすればよいですか?

以下は、開発アプリケーションサーバー上に存在しないファイル(nosuch.html)をフェッチした場合のログです。

ERROR    2008-11-25 20:08:34,084 dev_appserver.py] Error encountered reading file "/usr/home/ctuffli/www/tufflinet/static/nosuch.html":
[Errno 2] No such file or directory: '/usr/home/ctuffli/www/tufflinet/static/nosuch.html'
INFO     2008-11-25 20:08:34,088 dev_appserver.py] "GET /nosuch.html HTTP/1.1" 404 -
38
ctuffli

キャッチオールスクリプトハンドラーを登録する必要があります。これをapp.yamlの最後に追加します。

- url: /.*
  script: main.py

Main.pyには、次のコードを配置する必要があります。

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class NotFoundPageHandler(webapp.RequestHandler):
    def get(self):
        self.error(404)
        self.response.out.write('<Your 404 error html page>')

application = webapp.WSGIApplication([('/.*', NotFoundPageHandler)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

置換<Your 404 error html page>意味のあるもの。または、テンプレートを使用すると、その方法を読むことができます ここ

この設定で問題が発生した場合はお知らせください。

37

google app engineに Custom Error Responses が追加されました

これで、次の例のように、app.yamlにerror_handlersセクションを追加できます。

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
27
jonmiddleton

CPUサイクルを必要とせずにこれを行う非常に簡単な方法は、このハンドラをapp.yamlの下部に配置することです。

- url: /.*
    static_files: views/404.html
    upload: views/404.html

これにより、ビューディレクトリに静的な404.htmlファイルを配置できます。 pythonハンドラーの必要はありません。app.yamlで処理されていないものはすでにヒットします。

5
Zee Spencer

ステータスコードのエラーを処理する関数を作成できます。あなたは404である場合、次のような関数を定義します。

def Handle404(request, response, exception):
     response.out.write("Your error message") 
     response.set_status(404)`

あなたは何でも渡すことができます-response.out.write関数でHTML /プレーンテキスト/テン​​プレート。次に、app宣言の後に次の宣言を追加します。

app.error_handlers[404] = Handle404

これでうまくいきました。

4
TeknasVaruas

webapp2は、カスタムエラーページを提供するために使用できるerror_handlers辞書を提供します。以下の例:

def handle_404(request, response, exception):
    logging.warn(str(exception))
    response.set_status(404)
    h = YourAppBaseHandler(request, response)
    h.render_template('notfound')

def handle_500(request, response, exception):
    logging.error(str(exception))
    response.set_status(500)
    h = YourAppBaseHandler(request, response)
    h.render_template('servererror')

app = webapp2.WSGIApplication([
    webapp2.Route('/', MainHandler, name='home')
    ], debug=True)
app.error_handlers[404] = handle_404
app.error_handlers[500] = handle_500

詳細については、webapp2のドキュメントページをご覧ください。 http://webapp-improved.appspot.com/guide/app.html#error-handlers

3
Romain

私は上記のすべての回答を確認し、最も一般的な404ソリューションとして最後に以下を使用しました:

このリンクをapp.yamlの最後に追加します

- url: /(.*) 
  script: 404.app

次の内容で404.pyを作成します

import webapp2
from google.appengine.ext.webapp import template

class NotFound(webapp2.RequestHandler):
  def get(self):
    self.error(404)
    self.response.out.write(template.render('404.html', {}))

app = webapp2.WSGIApplication([
    ('/.*', NotFound)
], debug=True)

これにより、404.htmlファイルの内容と404エラーコードが表示されます。

このソリューションの利点は、静的な404.htmlファイルをエラーページのコンテンツとして使用できるため、シンプルさ、動作の正確性、柔軟性です。

また、上記で提案された解決策のいくつかに対して警告したいと思います。

  • Custom Error Responses 404エラーでは機能しません
  • また、404エラーではなく200を返すため、静的ファイルを使用しないでください。これは先に多くの頭痛を引き起こす可能性があります。
2
husayt

Dev_appserverは、マッピングに一致しない、またはマッピングに一致するが存在しないものに対して、すでに404応答を返しています。 404レスポンス自体にはボディはありませんが、それでも404です。

$ wget -O - http://127.0.0.1:8080/foo
--2010-10-28 10:54:51--  http://127.0.0.1:8080/foo
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... 404 
2010-10-28 10:54:51 ERROR 404: (no description).

$ wget -O - http://127.0.0.1:8080/foo/
--2010-10-28 10:54:54--  http://127.0.0.1:8080/foo/
Connecting to 127.0.0.1:8080... connected.
HTTP request sent, awaiting response... 404 
2010-10-28 10:54:54 ERROR 404: (no description).

よりユーザーフレンドリーなエラーページを返す場合は、jonmiddletonのアドバイスに従い、カスタム404ページを指定します。

2
Nick Johnson

Jonmiddletonの回答についてコメントすることはできませんが、カスタムエラー応答は、その外観から見たApp Engine固有のエラーに対するものです。カスタム404ページを指定する方法がわかりません。

Djangoを使ってみましょう 指定 1つですが。

0
zahanm

私のアプローチは、最後のハンドラーとして配置したcatch allハンドラーで404リダイレクトと永続リダイレクトの両方を処理することです。これは、URLを再設計してアプリの名前を変更/置換するときに役立ちます。

app = webapp2.WSGIApplication([
    ...
    ...
    ('/.*', ErrorsHandler)
], debug=True)


class ErrorsHandler(webapp2.RequestHandler):
    def get(self):
        p = self.request.path_qs
        if p in ['/index.html', 'resources-that-I-removed']:  
            return self.redirect('/and-substituted-with-this', permanent=True)
        else: 
            self.error(404)
            template = jinja_environment.get_template('404.html')
            context =  {
                'page_title': '404',
            }
            self.response.out.write(template.render(context))
0
JackNova