【问题标题】:How to change the url using django process_request .如何使用 django process_request 更改 url。
【发布时间】:2023-04-04 07:16:01
【问题描述】:

这是我的代码:

class MobileMiddleware(object):

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

当页面url为/core/mypage/时,我想添加一个参数key

并且网页浏览器的网址将更改为http:www.ss.com/core/mypage/?key=value

但是浏览器中的url并没有改变。

我能做什么?

【问题讨论】:

    标签: python django url middleware


    【解决方案1】:

    request.path_info 并没有为我改变浏览器地址栏中的 url,但是这个重定向做了:

    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 1.3 开始,Django 还提供了一个“重定向应用程序”,其中包括以下中间件:'django.contrib.redirects.middleware.RedirectFallbackMiddleware'。请参阅redirects app documentation,它允许您从管理界面创建重定向。

    我使用该应用程序尝试了相同的重定向,并且成功了。干杯!

    【讨论】:

      【解决方案2】:

      对于 googlers - 我使用 request.path_info 进行了测试。如果要更改中间件中的 URL,请更改 process_request 中的 request.path_info。

      request.path_info = <change request.path_info>
      

      请注意,我不建议或禁止使用它。我只是说如果您想更改网址,这是您可以的方式。

      【讨论】:

      • 尽管这确实提出了正确的请求,但浏览器中的 url 并没有改变。我认为没有重定向就不会。
      【解决方案3】:

      我没有对此进行测试,但请尝试类似request.GET["key"] = val

      编辑:或者使用request.path_info代替request.path

      【讨论】:

        【解决方案4】:

        试试这个

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

        【讨论】:

        • 但是这样会消耗很多性能,是302跳转,能不能改一下django核心代码?
        • 按照问题中的逻辑,这将是一个无限循环的重定向,因为请求仍然以'core/mypage'开头
        【解决方案5】:

        问题在于HttpRequest.path 是一个普通属性。更改它不会对浏览器产生任何新的指令。您可能正在寻找 redirect 方法,它实际上会强制浏览器转到其他地方。

        【讨论】:

        • 但是这样会消耗很多性能,是302跳转,能不能改一下django核心代码?
        • 只有两种方法可以更改客户端浏览器显示为 URL 的内容(我认为这是您所要求的)。第一种是使用重定向或标头将它们实际发送到另一个位置。第二种是使用JS来重定向它们。无论哪种方式,您都在谈论页面刷新。这就是浏览器的工作原理。
        猜你喜欢
        • 2020-01-08
        • 2018-07-31
        • 2011-03-01
        • 2021-11-23
        • 2015-10-12
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多