1

場合によっては、他の Web サイトが不適切にパーセント エンコードされた URL を使用して、Django を利用したサイトにリンクしていることがあります。Disqus.com と Twitter.com は同じ問題を抱えているため、私たちのユース ケース ( http://disqus.com/%C3A4 ) は特別なことではありません。この URL では、2 番目の % が欠落しています。有効な URL は次のようになります: http://disqus.com/%C3%A4

Django は空のエラー 400 (Bad request) ページを返します。ただし、エラーをキャッチしたいので、単なる有益でないページを返す代わりに、少なくともカスタム 404 ページをユーザーに表示したいと考えています。さらに良いことに、入力 URL の % 文字の欠落などをチェックして、その形式を検証したいと考えています。MiddleWare/process_request は現在の 400 エラーでも呼び出されるため、エラーをキャッチするためのフックがあります。

当サイトで問題を解決したいと思います。ベストプラクティスはありますか...? handler400 は素晴らしいでしょう - 自分で作成することは可能ですか?

4

2 に答える 2

1

テンプレートに404.htmlを作成し、これをurls.pyに配置します

#handle the errors    
from django.utils.functional import curry
from django.views.defaults import *

handler404 = curry(page_not_found, template_name='404.html')

You can also handle other errors like this:
handler500 = curry(server_error, template_name='500.html')
handler403 = curry(permission_denied, template_name='403.html')

あらゆるタイプのエラーを処理します。ここでアイデアが得られます。

https://github.com/Roejames12/django-error-pages
于 2013-02-01T12:11:37.713 に答える
0

Cathy's aswer のコメントの形式で既に投稿されているように、これは非常に優れていますが、この特定のケースでは機能しません。現在の少しハックなソリューションを別の回答としてここに公開します。

どうやら、このエラーは Django のミドルウェア内ではオーバーライドできません。これは、\django\core\handlers\wsgi.py の WSGIHandler 内でトリガーされる UNICODE デコード エラーです。正確には、

path_info = force_unicode(environ.get('PATH_INFO', u'/'))

問題を引き起こしているWSGIRequest内。これは基本的に Django の正しい動作ですが、私の質問で説明したように、空のエラー ページよりも便利なものをユーザーに表示したいだけです。したがって、受信 URL リクエストを有効な UNICODE 文字でチェックしてから、WSGIHandler に渡します。このブログ投稿は正しい方向を示してくれました: http://codeinthehole.com/writing/django-nginx-wsgi-and-encoded-slashes/

したがって、次のように wsgi.py 内の無効な URL を再ルーティングします。

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()

# for Django 1.7+
# from django.core.wsgi import get_wsgi_application
# _application = get_wsgi_application()

from django.utils.encoding import force_unicode
def application(environ, start_response):
    try:
        path_info = force_unicode(environ.get('PATH_INFO', u'/'))
    except:
        environ['PATH_INFO'] = u'/'
    return _application(environ, start_response)

代わりに WSGHandler をサブクラス化しても機能するはずです。この例では、無効な URL をサイトのルート「/」にリダイレクトするだけです。ただし、任意のカスタム エラー ページ URL にリダイレクトすることも、URL のサニタイズを試みることもできます。

于 2013-02-04T08:34:33.430 に答える