38

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

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

- url: /
  static_dir: static

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

以下は、開発アプリケーション サーバーで存在しないファイル (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 -
4

9 に答える 9

37

キャッチオール スクリプト ハンドラを登録する必要があります。これを 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>意味のあるものに置き換えます。または、テンプレートを使用することをお勧めします。ここでその方法を読むことができます。

この設定に問題がある場合はお知らせください。

于 2008-10-10T02:36:02.923 に答える
28

Google App Engine にカスタム エラー レスポンスが追加されました

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

error_handlers:

- file: default_error.html

- error_code: over_quota
    file: over_quota.html
于 2010-09-15T21:50:05.000 に答える
5

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

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

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

于 2009-05-13T03:08:55.270 に答える
4

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

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

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

app.error_handlers[404] = Handle404

これは私にとってはうまくいきました。

于 2012-06-02T11:37:26.043 に答える
2

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ページを指定してください。

于 2010-10-28T09:56:02.043 に答える
2

上記のすべての回答を確認し、最後に最も普遍的な 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 Responses404エラーで動かない
  • また、静的ファイルは 404 エラーではなく 200 を返すため、使用しないでください。これは、先に多くの頭痛の種を引き起こす可能性があります。
于 2016-01-04T01:06:44.697 に答える
0

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

ただし、 Django では指定できます。

于 2011-03-01T21:47:10.990 に答える