gpt4 book ai didi

python - Django 隐藏重定向

转载 作者:行者123 更新时间:2023-12-02 04:50:45 25 4
gpt4 key购买 nike

我想创建一种应用内重定向机制,该机制不会完全重定向,而只是加载另一个 View 函数。假设我要继续 localhost:8000/a ,django 渲染 View , View 的最后一行显示

return HttpResponseRedirect('/b')

现在我的浏览器将转到 localhost:8000/b ,django 会渲染 View 并将其返回给我。

现在我只想在服务器端执行此操作。所以当我去 localhost:8000/a django 决定重定向到 /b ,它呈现 /b 的 View ,通过所有中间件等推送它(就像重定向一样)并返回响应而不需要任何重定向(如用户所见)。

我把这样的重定向称为HttpResponseSmartRedirect它看起来就像这样:

class HttpResponseSmartRedirect(HttpResponseRedirect):
pass

现在我想为此创建中间件(作为所有中间件的最后一个运行),即 process_response 上的中间件。检查响应是否是类 HttpResponseSmartRedirect 的实例。现在我的问题是 - 当我遇到这种情况时 - 如何使用 url 中的 View 实际生成响应?我可以通过使用 resolve() 轻松获得 View 功能来自urlsolvers ,但我不知道如何强制它通过所有中间件并创建与我通过随意重定向获得的响应相同的响应。最糟糕的方法就是调用 urllib2.get(url) ,但是那条线的样子让我想毁掉我的电脑。

关于如何在不被认为丑陋的情况下做得很好的任何想法urllib的?

最佳答案

您需要在 Django 请求处理代码的底部重新注入(inject)原始请求。

django.core.handlers.base 中的 BaseHandler.get_response 开始处理请求。

所以解决方案类似于(未经测试!):

from django.core.handlers.base import BaseHandler

class SmartRedirectMiddleware(object):
def process_response(self, request, response):
if isinstance(response, HttpSmartRedirectResponse):
handler = BaseHandler()
request.url = response.redirect_url
resp = handler.get_response(request)
return resp

对于实际使用,您需要一些针对重定向循环和无限递归的保护。

或者您可以以不同的方式解决问题 - 让浏览器根据重定向进行重新获取。如果需要不可见,则可以使用一些客户端 Javascript 轻松实现。

关于python - Django 隐藏重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com