2011-06-16 81 views
5

這是我的代碼:如何使用django process_request更改網址。

class MobileMiddleware(object): 

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

我想添加一個PARAM key時,網址爲/core/mypage/

和網頁瀏覽器的網址將改爲http:www.ss.com/core/mypage/?key=value

然而,瀏覽器中的網址不會更改。

我能做些什麼?

回答

3

問題是HttpRequest.path是一個普通的屬性。更改它不會爲瀏覽器提供任何新的說明。你可能正在尋找redirect方法,這實際上會迫使瀏覽器去其他地方。

+0

但這會消耗很多性能,它是一個302跳,我們可以更改django核心代碼嗎? – zjm1126 2011-06-16 03:06:57

+1

只有兩種方法可以將客戶端的瀏覽器顯示爲URL(這是我認爲您所要求的)。首先是使用重定向或標題實際發送到另一個位置。第二個是使用JS重定向它們。無論哪種方式你都在談論頁面刷新。這就是瀏覽器的工作原理。 – cwallenpoole 2011-06-16 10:30:24

0

嘗試這個

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

但這會消耗很多性能,它是一個302跳,我們可以改變django核心代碼嗎? – zjm1126 2011-06-16 03:08:56

+0

與問題中的邏輯,這將是一個無限循環的重定向,因爲請求仍然以'core/mypage'開始 – radtek 2014-12-24 15:53:15

0

我沒有測試過這一點,但你可以試試request.GET["key"] = val

編輯:或可能使用request.path_info代替request.path

9

,讓Google - 我與測試request.path_info。如果您想更改middlware中的URL,請更改process_request中的request.path_info。

request.path_info = <change request.path_info> 

請注意,我不建議或者禁止使用此。我只是說如果你想改變網址,這是你的方式。

+0

儘管這確實實現了正確的請求,但瀏覽器中的url並沒有改變。我不認爲它會沒有重定向。 – radtek 2014-12-24 15:58:09

1

的request.path_info沒有改變我的瀏覽器地址欄中的網址,但該重定向所做的:

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還提供了「重定向應用程序」,因爲Django的1.3,其中包括以下中間件: 'django.contrib.redirects.middleware.RedirectFallbackMiddleware'。請參閱redirects app documentation,它允許您從管理界面創建重定向。

我嘗試使用該應用程序的相同重定向,它的工作。乾杯!