2013-08-06 17 views
5

Ben bu anladım sanıyordum tanınmayan url (sadece 404 şablon) için kullanıcıyı yönlendirme, ama sadece garip bir şey keşfetti. URL'ler olarakDjango,

Ben url tanınmadığı takdirde

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

handle_page_not_found()

uygun kullanıcıyı yönlendirme var. gayet iyi çalışıyor, ama garip bir şey keşfettim

.

bir işlev döndürülür

return HttpResponse("ok") 

ardından "Tamam" döner ve her şey iyi çalışıyor gibi görünüyor edin. AMA, ben sadece handle_page_not_found() da denir gördüm (Ben bir baskı beyanı ile test). Yine de "tamam" geri döndü, ancak ilk önce kodu handle_page_not_found()'da çalıştırıyor.

Peki, nasıl tanınmayan URL'ler için çağrılan bir işlevi olabilir, ancak bu bir HttpResponse nesnesi tarafından çağrılmıyor mu?

DÜZENLEME: cevap dayanarak, benim kod özel test durumlar hariç aslında iyi olduğunu gördük. HttpResponse bir ajax çağrısına (normalde kullandığım zaman) döndüğü sürece her şey iyidir.

cevap

0

en olası nedeninin tarayıcı web birden isteği yapıyor olmasıdır. Özellikle, /favicon.ico/ için istekte bulunmaya çalışıyor olabilir.

İşleyiciniz çağrıldığında, request.path görüntülendiğinden emin olabilirsiniz.

+0

Haklısınız! Bu bana bakmak ve ben bir ajax arama için HTTPResponse döndüğünüzde Sorunu yok olduğunu görüyoruz yapılmış /favicon.ico/ request.path olduğunu. Ve aslında şu anda baktığım test sayfası dışında bunu yaptığım tek zaman. – user984003

+0

Kısa versiyon: her şey yolunda. Kodum özel test durumu dışında çalışır. – user984003

+0

benim için bunun son URL'deki ifadeden kaynaklandığına inanıyorum. Herhangi bir dize için handle_page_not_found'u arayacak, yıldızı başka bir şeye değiştirecek. //docs.djangoproject: [Django URL memuru referans] de abda2005 Look (HTTPS @ – drabo2005

3

benimle çalışır bu konuyu kaçının.

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: Daha fazla ayrıntı için

def handle_page_not_found_404(request): 

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

bkz: Django documentation: customizing-error-views

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

     return response 
0

O Django v1.11.3 ile uygulamam için çalışır ve python v3.6. views.py içinde

Adım 1. eklenti view_404 şu şekilde.

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

Adım 2. İşleyiciyi urls.py dosyasına ekleyin.

url(r'^.*/$', views.view_404)