他の場所で見つかったヒントを使用して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 -
キャッチオールスクリプトハンドラーを登録する必要があります。これを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>
意味のあるもの。または、テンプレートを使用すると、その方法を読むことができます ここ 。
この設定で問題が発生した場合はお知らせください。
google app engineに Custom Error Responses が追加されました
これで、次の例のように、app.yamlにerror_handlersセクションを追加できます。
error_handlers:
- file: default_error.html
- error_code: over_quota
file: over_quota.html
CPUサイクルを必要とせずにこれを行う非常に簡単な方法は、このハンドラをapp.yamlの下部に配置することです。
- url: /.*
static_files: views/404.html
upload: views/404.html
これにより、ビューディレクトリに静的な404.htmlファイルを配置できます。 pythonハンドラーの必要はありません。app.yamlで処理されていないものはすでにヒットします。
ステータスコードのエラーを処理する関数を作成できます。あなたは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
これでうまくいきました。
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
私は上記のすべての回答を確認し、最も一般的な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エラーでは機能しません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ページを指定します。
Jonmiddletonの回答についてコメントすることはできませんが、カスタムエラー応答は、その外観から見たApp Engine固有のエラーに対するものです。カスタム404ページを指定する方法がわかりません。
Djangoを使ってみましょう 指定 1つですが。
私のアプローチは、最後のハンドラーとして配置した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))