2011-06-16 13 views
5

Bu benim kodum:Django process_request kullanarak url nasıl değiştirilir.

class MobileMiddleware(object): 

    def process_request(self, request): 
     if request.path.startswith('/core/mypage/'): 
      request.path='/core/mypage/?key=value' 
      print request.path,'aaaa' 

Sayfa url /core/mypage/,

olduğunda ve http:www.ss.com/core/mypage/?key=value

olacak şekilde http:www.ss.com/core/mypage/?key=valuehttp:www.ss.com/core/mypage/?key=value eklemek istiyorum tarayıcıda URL değiştirilmedi.

Ne yapabilirim?

cevap

3

Sorun şu ki, HttpRequest.path düz bir özelliktir. Bunu değiştirmek tarayıcı için yeni talimatlar oluşturmaz. Muhtemelen tarayıcıyı başka bir yere gitmeye zorlayacak olan redirect yöntemini arıyorsunuzdur.

+0

Ancak bu çok fazla performans tüketir, 302 atlamadır, django çekirdek kodunu değiştirebilir miyiz? – zjm1126

+1

İstemcinin tarayıcısının bir URL olarak nasıl göründüğünü değiştirmenin yalnızca iki yolu vardır (bu sizin için sorduğunuzu düşünüyorum). Birincisi, onları başka bir yere göndermek için yönlendirme veya başlık kullanmaktır. İkincisi onları yönlendirmek için JS kullanmaktır. Her iki durumda da bir sayfa yenileme hakkında konuşuyorsunuz. Bu sadece tarayıcılar nasıl çalışır. – cwallenpoole

0

Bu

return HttpResponseRedirect('/core/mypage/?key=value') 
+0

ama bu çok fazla performans tüketecek, 302 atlama, django çekirdek kodunu değiştirebilir miyiz? Sorunun mantığı ile – zjm1126

+0

, bu istek hala 'core/mypage' – radtek

0

Bu test değil deneyin, ama request.GET["key"] = val

Edit gibi bir şey deneyin: ya da belki Google'cuların için request.path

9

yerine request.path_info kullanmak - Ben ile test request.path_info. Middlware'de URL'yi değiştirmek isterseniz, request.path_info dosyasını process_request numaralı telefondan değiştirin.

request.path_info = <change request.path_info> 

Lütfen bunu önermediğimi veya önermediğimi unutmayın. Sadece url'leri değiştirmek istiyorsan, yapabileceğin bir şey olduğunu söylüyorum.

+0

ile başlayan beri sonsuz bir yönlendirme döngüsü olacak, aslında bu doğru istek yapar, tarayıcıda URL değişmedi. Yönlendirme olmadan olacağını sanmıyorum. – radtek

1

request.path_info benim için tarayıcının adres çubuğundaki url değişmedi ama bu yönlendirme yaptı:

from django.shortcuts import redirect 


class DomainRedirectMiddleware(object): 

    def process_request(self, request): 

     if request.path.startswith('/core/mypage/') and not request.GET: 
      return redirect('/core/mypage/?key=value') # works! 
      #request.path_info = '/core/mypage/?key=value' # works, but does not change url in browser address bar 

Django ayrıca aşağıdaki ara katman içeren Django 1.3, çünkü bir "Yönlendirme App" sunar: 'django.contrib.redirects.middleware.RedirectFallbackMiddleware'. redirects app documentation'a bakın, yönetici arayüzünden yönlendirmeler oluşturmanızı sağlar.

Uygulamayı kullanarak aynı yönlendirmeyi denedim ve çalıştı. Şerefe!

İlgili konular