2012-09-14 23 views
10

Đôi khi tôi không chắc chắn cách sử dụng webapp2.redirect.chuyển hướng webapp2 được giải thích

bao giờ Có một thời gian khi tôi nên sử dụng self.redirect("/blah") thay vì return self.redirect("/blah")

Đây là hiểu biết của tôi/đoán về thời gian-line: (đôi khi tôi là nhầm lẫn về nếu đối tượng phản ứng làm điều gì đó hoặc nếu webapp2 thực hiện nó)

  1. tôi ghé thăm trang web đa luồng www.mysite.com/name/robert tôi, chrome gửi một GET yêu cầu (cho phép giả định yêu cầu này là một tập tin văn bản)
  2. webapp2 lấy này "tập tin văn bản" và biến nó thành webapp2.Request. webapp2 cũng tạo một webapp2.Response mới.
  3. bằng cách nào đó url yêu cầu được cung cấp cho bộ định tuyến để đối sánh (hoặc theo webapp2 hoặc theo phản hồi). RequestHandler thích hợp là được khởi tạo. Phương thức get() của RequestHandler được gọi với các đối số thích hợp là .
  4. trong suốt thời gian này chỉ có một yêu cầu và một câu trả lời là .
  5. phương thức get() gọi response.out.write ("hello world") thêm "hello world" vào nội dung phản hồi?
  6. các get() phương pháp gọi self.redirect ('/ foo')
  7. Stuff xảy ra
  8. các get() phương pháp gọi self.out.write ("tạm biệt thế giới")
  9. phản ứng được gửi cho khách hàng có chứa hello world, những gì thực phẩm bổ sung, tạm biệt thế giới

dụ của hàm get ban đầu:

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

Điều gì "nội dung xảy ra"? Tôi cho rằng router tìm thấy/foo/RequestHandler. Những sửa đổi nào được đưa ra cho Yêu cầu và Phản hồi trước khi phương thức requestHandlers get() của foo được gọi là. Yêu cầu có bị xóa và được thay thế bằng yêu cầu GET mới không? Câu trả lời có bị xóa và được thay thế bằng một câu trả lời mới không? Ngữ cảnh gì vẫn tồn tại trong trình xử lý yêu cầu ban đầu? không thực hiện mã trở lại các trình xử lý yêu cầu ban đầu có được phương pháp và nếu như vậy là bối cảnh có thể đã tồn tại được khôi phục?

Xin lỗi Nếu đây là một chút của một mouthful, tôi đã cố gắng giải thích những gì tôi muốn biết :)

Có lẽ nó sẽ được dễ dàng hơn để yêu cầu một số trường hợp sử dụng (làm và không nên làm) của bằng cách sử dụng chuyển hướng thay thế.

Trả lời

10

Phương pháp chuyển hướng thực sự chỉ là một số loại lông tơ hữu ích xung quanh việc đặt trạng thái phản hồi và phản hồi tiêu đề Vị trí. Không có gì thực sự xảy ra cho đến khi phản hồi được gửi đến máy khách theo sau chuyển hướng. Bạn sẽ muốn trả lại kết quả của chuyển hướng cuộc gọi đơn giản để tránh nhiều mã đang được chạy nếu có nhiều hơn sau khi chuyển hướng mà bạn không muốn chạy.

Nguồn khá dễ đọc .. http://webapp2.readthedocs.io/en/latest/_modules/webapp2.html#redirect

+0

Vì vậy, khách hàng nhận 302 và theo dõi chuyển hướng. Điều đó có vẻ không hiệu quả (yêu cầu hai yêu cầu thay vì một yêu cầu).Nếu tất cả mọi người được chuyển hướng đến/đăng nhập nói, tôi đã nghĩ rằng phản hồi sẽ trả về biểu mẫu đăng nhập và nói rằng nó được chuyển hướng tất cả trong một phản hồi, thay vì hai. –

+1

chỉ để xác nhận, foos get() không được gọi cho đến sau khi trình duyệt của khách hàng thực hiện chuyển hướng với một yêu cầu mới để trả lời tiêu đề vị trí mới có nghĩa là foos nhận được phương thức có thể được gọi trên một máy chủ khác. –

+1

Nếu bạn muốn chuyển hướng nội bộ, bạn có thể gọi một phương thức xử lý khác từ mã của bạn, ví dụ: tôi sẽ cập nhật thứ gì đó trong trình xử lý bài và trả về self.get() làm câu trả lời. Vấn đề là bạn đang trả lại nội dung từ một tài nguyên khác với máy chủ được yêu cầu. Nếu đó là ok cho tình hình, sau đó, ok. Nếu bạn làm một chuyển hướng thì trình duyệt (hoặc spider) biết nó đang nhận được gì. Đối với chuyển hướng và cung cấp phản hồi mới, trình duyệt tốt không hoạt động theo cách đó. để xác nhận: có, và bạn sẽ mất "hello world" và "bye world" thành ether (đối với người dùng trình duyệt) – lecstor