これは、 Pylons と比較して Pyramid でどうやってリダイレクトと HTTP エラー を送るかを示したものです:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # Pylons -- in controller action
from pylons.controllers.util import abort, redirect
abort(404) # Not Found
abort(403) # Forbidden
abort(400) # Bad request; e.g., invalid query parameter
abort(500) # Internal server error
redirect(url("section1")) # Redirect (default 302 Found)
# Pyramid -- in view code
import pyramid.httpexceptions as exc
raise exc.exception_response(400) # Not Found
raise exc.HTTPNotFound() # Same thing
return exc.HTTPNotFound() # Same thing
raise exc.HTTPForbidden()
raise exc.HTTPBadRequest()
raise exc.HTTPInternalServerError()
raise exc.HTTPFound(request.route_url("section1")) # Redirect
|
pyramid.httpexceptions モジュールにはすべての公式 HTTP ステータスに 対応したクラスがあります。これらのクラスは Response と Exception の両方から継承します。したがって、戻り値として返すことも、例外として 送出することもできます。 HTTP 例外を投げることでコードは構造的により 読みやすくなるかもしれません。それはいくつかの呼び出しスタックフレーム を通過することがあるサブルーチンで特に役立ちます。そうでなければエラー 状態を受け渡すために各々の呼び出し毎に if を必要とするでしょう。
例外ルール:
これらは、代表的な HTTP 例外です:
クラス | コード | Location | 意味 |
---|---|---|---|
HTTPMovedPermanently | 301 | Y | 恒久的なリダイレクト; クライアントは ブックマークを変更するべき。 |
HTTPFound | 302 | Y | 一時的なリダイレクト。 [1] |
HTTPSeeOther | 303 | Y | 一時的なリダイレクト; クライアントは GET を使うべき。 [1] |
HTTPTemporaryRedirect | 307 | Y | 一時的なリダイレクト。 [1] |
HTTPClientError | 400 | N | 一般的なユーザエラー; 例えば、不正な クエリパラメータ。 |
HTTPUnauthorized | 401 | N | ユーザは認証が必要。 |
HTTPForbidden | 403 | N | 認証の失敗、または一般的な拒否。 |
HTTPNotFound | 404 | N | この URL は認識されない。 |
HTTPGone | 410 | N | 以前この URL に存在したリソースは 恒久的に利用できなくなった; クライアントはブックマークを削除すべき。 |
HTTPInternalServerError | 500 | N | 内部エラーによりサーバーはリクエストを 処理することができなかった。 |
location カラムが “Y” のクラスのコンストラクタ引数は (location="", detail=None, headers=None, comment=None, ...) です。それ以外は、 コンストラクタ引数は (detail=None, headers=None, comment=None, ...) です。
location 引数は Python レベルではオプションですが、 HTTP 仕様は 絶対 URL である位置を要求しています。したがって、それは事実上必須です。
detail 引数はエラー画面の一部として表示されるプレーンテキスト文字列です。 headers はレスポンスに加えたい HTTP ヘッダー (name-value タプル) の リストです。 comment はユーザには表示されないプレーンテキスト文字列です。 (XXX これはログに記録される?)
例外ビューは HTTPNotFound または HTTPForbidden と一緒に使用される ことが最も普通ですが、任意の例外クラスに対して例外ビューを登録することが できます。これは、 Pyramid マニュアルから拝借した、カスタム例外を用いた 例外ビューの例です:
1 2 3 4 5 6 7 8 9 10 11 12 13 | from pyramid.response import Response
class ValidationFailure(Exception):
pass
@view_config(context=ValidationFailure)
def failed_validation(exc, request):
# If the view has two formal arguments, the first is the context.
# The context is always available as ``request.context`` too.
msg = exc.args[0] if exc.args else ""
response = Response('Failed validation: %s' % msg)
response.status_int = 500
return response
|
利便性のため、 Pyramid は “Not Found” ビューや “Forbidden” ビューを登録 するための特別なデコレータおよび Configurator メソッドを持っています。 @notfound_view_config と @forbidden_view_config (pyramid.view で定義) は、コンテキスト引数の面倒を見ます。
加えて、 @notfound_view_config は append_slash 引数を受け付けます。 それは末尾のスラッシュ規約を強制するために使用できます。あなたのサイトが すべての route はスラッシュで終るべきと定義していて、 append_slash=True をセットした場合、スラッシュのないリクエストが route とマッチしなかった場合、Pyramid はリクエスト URL にスラッシュを 追加して再びマッチを試みます。これが route とマッチすれば、 Pyramid は リダイレクトを実行します。これは、末尾のスラッシュ (“/dir/” や “/dir/a/”) を好むサイトでのみ役立ちます。他のサイトでは末尾のスラッシュ を好まれず (“/dir” and “/dir/a”) 、またこのための特別な機能はありません。