2011-06-16 33 views
5

Este es mi código:Cómo cambiar la url usando 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' 

Quiero añadir un parámetro key cuando la URL de la página es /core/mypage/,

y la dirección URL del navegador web sería cambiado a http:www.ss.com/core/mypage/?key=value

Sin embargo, la url en el navegador no se cambia.

¿Qué puedo hacer?

Respuesta

3

El problema es que HttpRequest.path es un atributo simple. Cambiarlo no crea nuevas instrucciones para el navegador. Probablemente estés buscando el método redirect que obligará al navegador a ir a otro lugar.

+0

pero esto consumirá mucho rendimiento, es un salto de 302, ¿podemos cambiar el código del núcleo django? – zjm1126

+1

Solo hay dos formas de cambiar lo que el navegador del cliente muestra como una URL (que es lo que creo que está solicitando). El primero es usar redirecciones o encabezados para enviarlos a otra ubicación. El segundo es usar JS para redirigirlos. De cualquier manera, estás hablando de una actualización de página. Así es como funcionan los navegadores. – cwallenpoole

0

Prueba esto

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

pero esto consumirá mucho rendimiento, es un salto de 302, ¿podemos cambiar el código central de django? – zjm1126

+0

con la lógica en la pregunta, este será un bucle infinito de redirecciones ya que la solicitud aún comienza con 'core/mypage' – radtek

0

no he probado esto, pero trata de algo así como request.GET["key"] = val

Editar: o tal vez usar request.path_info en lugar de request.path

9

para que los Googlers - Probé con request.path_info. Si desea cambiar la URL en middlware, cambie request.path_info en process_request.

request.path_info = <change request.path_info> 

Tenga en cuenta que no sugiero o prohíbo el uso de esto. Solo digo que si quieres cambiar las URL, esta es la forma en que puedes.

+0

Aunque, en realidad, esta es la solicitud correcta, la URL del navegador no cambió. No creo que sea así sin una redirección. – radtek

1

El request.path_info no cambió la dirección URL en la barra de direcciones del navegador para mí, pero esta redirección hizo:

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 también proporciona una "vuelve a dirigir App" desde Django 1.3, que incluye lo siguiente middleware: 'django.contrib.redirects.middleware.RedirectFallbackMiddleware'. Vea redirects app documentation, le permite crear redirecciones desde la interfaz de administración.

Probé la misma redirección usando la aplicación y funcionó. ¡Aclamaciones!