15

次のコードに見られるように、私は に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)

Web ブラウザから URL にアクセスすると登録フォームが表示され、送信後に「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

このエラーの意味と修正方法を教えてください。ありがとう。

4

3 に答える 3

21

設定でクロスサイト リクエスト フォージェリ Cookie が有効になっていると思います (デフォルトではオンになっています)。

Tornado の XSRF はこちら

これを修正するには、設定でオフにします。

settings = {
    "xsrf_cookies": False,
}

注: 通常、これをオフにしたくはありません。通常は、次のようなテンプレートで HTML を生成します: XSRF Coo​​kie を追加する 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")

(そして、テンプレートディレクトリに置きます)

于 2012-10-16T14:31:35.353 に答える