2012-10-15 27 views
10

Như có thể thấy trong đoạn mã sau, tôi có GET để đăng ký, ủy quyền công việc của mình cho POST.Đối số Tornado - '_xsrf' bị thiếu trong POST

class RegistrationHandler(tornado.web.RequestHandler): 
    def get(self): 
     s = """ 
      <h1>Register</h1> 
       <form method="post" action="/register"> 
        <div> 
         <label>User</label> 
         <input name="user_name" value="[email protected]"/> 
        </div> 
        <div> 
         <label>password</label> 
         <input name="password" type="password"/> 
        </div> 
        <div> 
         <input type="submit" value="submit"/> 
        </div> 
       </form> 
     """ 
     self.write(s) 

    @log_exception() 
    def post(self): 
     user_name = self.request.arguments['user_name'] 
     password = self.request.arguments['password'] 
     log.debug('Registering user with credentials %r' % (user_name, password)) 
     with sa_session() as db_session: 
      User.register(user_name, password, db_session) 

Khi tôi truy cập URL từ trình duyệt web, tôi nhận được biểu mẫu đăng ký, sau khi gửi mà tôi nhận được "403: Bị cấm".

điều khiển đăng nhập:

2012-10-15 11:27:42,482 - __main__ - DEBUG - Starting server on port 8080 
2012-10-15 11:27:49,377 - root - INFO - 304 GET /register (127.0.0.1) 0.78ms 
2012-10-15 11:27:53,143 - root - WARNING - 403 POST /register (127.0.0.1): '_xsrf' argument missing from POST 
2012-10-15 11:27:53,144 - root - WARNING - 403 POST /register (127.0.0.1) 1.05ms 

không lỗi này có nghĩa là gì và làm thế nào để sửa chữa nó? Cảm ơn.

Trả lời

16

Tôi tưởng tượng bạn đã bật cookie giả mạo Cross-site trong cài đặt (theo mặc định là bật).

Tornado's XSRF is here

Để sửa lỗi này tắt nó trong các thiết lập của bạn:

settings = { 
    "xsrf_cookies": False, 
} 

Lưu ý: Thông thường bạn không muốn tắt chức năng này và thông thường bạn sẽ được tạo ra HTML trong một khuôn mẫu như thế này: Xin lưu ý bit xsrf thêm cookie XSRF.

<form method="post" action="/register"> 
    <input name="user_name" value="[email protected]"/> 
    <input name="password" type="password"/> 
    <input type="submit" value="submit"/> 
{% raw xsrf_form_html() %} 
</form> 

comments --- EDIT sau --- Thay vì:

def get(self): 
     loader = template.Loader("resources") 
     page_contents = loader.load('register_page.html').generate() 
     self.write(page_contents) 

Đỗ:

def get(self): 
    self.render("../resources/register_page.html") 

hoặc tốt hơn:

def get(self): 
    self.render("register_page.html") 

(và đặt nó trong thư mục mẫu của bạn)

+0

Nó đặt ra một lỗi mà tên 'xsrf_form_html()' không được xác định. Tôi có cần nhập khẩu không? Nếu có, làm cách nào để thêm nó vào mẫu của tôi? – missingfaktor

+0

Bạn không cần bất kỳ nhập khẩu đặc biệt nào. Lưu ý rằng xsrf_form_html() sẽ chỉ hoạt động trong Mẫu. Mã bạn đăng ở trên không phải là mẫu. –

+0

Đây là mã Python của tôi - https://www.refheap.com/paste/5955, và đây là mẫu của tôi - https://www.refheap.com/paste/5956. – missingfaktor

0

có xung đột: cách bạn tạo get và ở dạng bạn đặt method="post"? lý do tại sao có error 403

nếu bạn sử dụng get, khi đó bạn sẽ không cần bảo vệ xsrf. nếu không, bạn thêm nó sau khi khai báo biểu mẫu là

<form method="post" action="/register"> 
{% raw xsrf_form_html() %} # the 'raw' word is to force escape to be desactivated (it is by default activated) 

để xsrf bạn sẽ tìm thấy thẻ ẩn trong html được hiển thị.

Các vấn đề liên quan