龙卷风 - POST中缺少'_xsrf'参数

时间:2012-10-15 06:03:22

标签: python python-3.x tornado

从下面的代码中可以看出,我有一个GET用于注册,它将其工作委托给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="test@test.com"/>
                  </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)

当我从网络浏览器访问网址时,我会收到一份注册表格,提交后我会收到“403:Forbidden”。

控制台日志:

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

此错误的含义是什么?如何更正错误?感谢。

2 个答案:

答案 0 :(得分:18)

我想您在设置中启用了跨站点请求伪造Cookie (默认情况下已启用)。

Tornado's XSRF is here

要解决此问题,请在您的设置中将其关闭:

settings = {
    "xsrf_cookies": False,
}

注意:通常你不想关闭它,通常你会在这样的模板中生成HTML:请注意添加XSRF cookie的xsrf位。

 <form method="post" action="/register">
     <input name="user_name" value="test@test.com"/>
     <input name="password" type="password"/>
     <input type="submit" value="submit"/>
{% raw xsrf_form_html() %}
 </form>

---编辑以下评论--- 而不是:

  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")

或更好:

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

(并将其放在模板目录中)

答案 1 :(得分:0)

存在冲突: 你如何以get的形式制作method="post"?这就是error 403

的原因

如果您使用get,那么您将不需要xsrf保护。否则,您在表单声明后将其添加为

<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你会在渲染的html中找到它的隐藏标签。