12

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

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

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

  1. 我访问了我的多线程网站 www.mysite.com/name/robert,chrome 发送了一个 GET 请求(假设这个请求是一个文本文件)
  2. webapp2 抓取这个“文本文件”并将其转换为 webapp2.Request。webapp2 还创建了一个新的 webapp2.Response。
  3. 以某种方式将请求 url 提供给路由器进行匹配(通过 webapp2 或响应)。一个适当的 RequestHandler 被实例化。使用适当的参数调用 RequestHandler 的 get() 方法。
  4. 在此期间,只有一个请求和一个响应。
  5. get() 方法调用 response.out.write("hello world") 将“hello world”添加到响应正文?
  6. get() 方法调用 self.redirect('/foo')
  7. 事情发生了
  8. get() 方法调用 self.out.write("bye world")
  9. 响应被发送到客户端,其中包含 hello world、添加了什么食物、再见世界

初始 get 函数的示例:

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

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

抱歉,如果这有点拗口,我已经尝试解释我想知道的内容:)

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

4

1 回答 1

11

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

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

于 2012-09-14T10:07:31.070 回答