webapp2 重定向解释

Posted

技术标签:

【中文标题】webapp2 重定向解释【英文标题】:webapp2 redirect explained 【发布时间】:2012-09-07 04:14:06 【问题描述】:

我有时不确定如何使用webapp2.redirect。

有没有时候我应该使用 self.redirect("/blah") 而不是 return self.redirect("/blah")

这是我对时间线的理解/猜测:(有时我对响应对象是否执行某些操作或 webapp2 执行操作感到困惑)

    我访问我的多线程网站 www.mysite.com/name/robert,chrome 发送一个 GET 请求(假设此请求是一个文本文件) webapp2 抓取此“文本文件”并将其转换为 webapp2.Request。 webapp2 还会生成一个新的 webapp2.Response。 不知何故,请求 url 被提供给路由器进行匹配(要么 通过 webapp2 或响应)。一个合适的 RequestHandler 是 实例化。 RequestHandler 的 get() 方法被调用 适当的论据。 在这段时间里只有一个请求和一个 回应。 get() 方法调用 response.out.write("hello world") 添加 响应正文中的“hello world”? get() 方法调用 self.redirect('/foo') 发生了一些事情 get() 方法调用 self.out.write("bye world") 响应被发送到客户端,其中包含 hello world,添加了什么食物,bye world

初始get函数示例:

def get():
    self.write('hello world')
    self.redirect('/foo')
    self.write('bye world')

什么“发生了事情”?我想路由器找到/foo/的RequestHandler。 在调用 foo 的 requestHandlers get() 方法之前对 Request 和 Response 做了哪些修改。请求是否被删除并被新的 GET 请求替换?回复是否被删除并替换为新回复?初始请求处理程序中存在哪些上下文?代码执行是否返回到初始请求处理程序的 get 方法,如果是,是否已恢复可能存在的上下文?

对不起,如果这有点拗口,我已经尝试解释我想知道的:)

也许询问一些使用重定向的用例(做和不做)会更容易。

【问题讨论】:

【参考方案1】:

redirect 方法实际上只是设置响应状态和响应位置标头的一些有用的绒毛。在将响应发送到重定向之后的客户端之前,什么都不会发生。如果重定向后有更多您不想运行的代码,您可能希望返回调用重定向的结果,以避免运行更多代码。

源代码很容易阅读..http://webapp2.readthedocs.io/en/latest/_modules/webapp2.html#redirect

【讨论】:

所以客户端得到 302 并遵循重定向。这似乎效率低下(需要两个请求而不是一个)。如果每个人都被重定向到 /login,我会认为响应会返回登录表单并说它被重定向到一个响应中,而不是两个。 只是为了确认,直到客户端浏览器跟随重定向并向响应新位置标头发出新请求之后才会调用 foos get() 方法,这意味着可以在不同的位置调用 foos get 方法甚至服务器。 如果您想要一个内部重定向,您可以从您的代码中调用另一个处理程序方法,例如,我将在 post 处理程序中更新一些内容并返回 self.get() 作为响应。问题在于,您返回的内容与服务器要求的资源不同。如果这种情况没问题,那么,好的。如果您进行重定向,则浏览器(或蜘蛛)知道它正在获取什么。至于重定向和提供新的响应,浏览器不是这样工作的。确认:是的,你会失去“你好世界”和“再见世界”到以太(浏览器用户)

以上是关于webapp2 重定向解释的主要内容,如果未能解决你的问题,请参考以下文章

如何使用modelandview进行重定向

如何重定向 python 解释器输出并将其捕获到 C++ 程序中的字符串中?

Servlet跳转页面的重定向和转发

shell 基础

scripts: stdin, stdout和stderr的重定向的解释

使用 javascript 检测重定向 - 如何?