2013-08-06 4 views
5

私はこれを理解したと思っていましたが、奇妙なものを発見しました。 URLが認識されない場合、私はDjango、認識できないURL(404テンプレートだけではない)のリダイレクト

url('^page_1/$', handle_page_1), 
url('^page_2/$', handle_page_2), 
url('^.*/$', handle_page_not_found), 

handle_page_not_found()を持っているURLで

は適切にユーザーをリダイレクトします。

これはうまくいきますが、私は奇妙なことを発見しました。

関数が返され

return HttpResponse("ok") 

し、「OK」を返し、すべてが正常に動作すると思われる場合。しかし、私はちょうどhandle_page_not_found()が呼び出されているのを見ました(私はprintステートメントでテストしました)。返されるのはまだ「OK」ですが、最初にhandle_page_not_found()のコードを実行しています。

したがって、認識されないURLに対して呼び出されるが、HttpResponseオブジェクトによって呼び出されない関数を持つにはどうすればよいですか?

編集:答えに基づいて、特別なテスト状況を除いて、実際に私のコードが正常であることがわかりました。 HttpResponseがajax呼び出し(通常は私が使用しているとき)に返される限り、すべて役に立ちます。

答えて

0

あなたのブラウザがあなたのウェブサイトに複数のリクエストを行っている可能性が最も高い原因です。

特に、/favicon.ico/をリクエストしようとしている可能性があります。

ハンドラが呼び出されたときにrequest.pathと表示されていることを確認できます。

+0

あなたはそうです! request.pathは/favicon.ico/です。これは、私が見て、私がHttpResponseをajax呼び出しに返すときに問題がないことを確認しました。それは実際には私が今見ているテストページを除いてこれを行う唯一の時間です。 – user984003

+0

ショートバージョン:すべて正常です。私のコードは特殊なテスト状況を除いて動作します。私のために – user984003

+0

私はそれが最後のURLの表現のためだと思う。任意の文字列に対してhandle_page_not_foundを呼び出し、星を別のものに変更します。 – drabo2005

3

この問題を回避するには、それは私と一緒に働きます。

urls.py:

urlpatterns = patterns('', 
url('^page_1/$', handle_page_1), 
url('^page_2/$', handle_page_2), 
) 
handler404='views.handle_page_not_found_404' 

views.py:詳細については

def handle_page_not_found_404(request): 

page_title='Page Not Found' 
return render_to_response('404.html',locals(),context_instance=RequestContext(request)) 

は、以下を参照してください。Django documentation: customizing-error-views

1
class Redirect404Middleware(object): 
    def process_response(self, request, response): 
     if response == Http404: 
      return HttpResponsePermanentRedirect('/') 

     return response 
0

それは、Djangoのv1.11.3で私のアプリのために働き、 Python v3.6。

ステップ1. views.pyに次のようにview_404を追加します。

def view_404(request): 
    # do something 
    return redirect('/') 

ステップ2. urls.pyにハンドラを追加します。

url(r'^.*/$', views.view_404) 
関連する問題