Аргумент Tornado - '_xsrf' отсутствует в POST
Как видно из следующего кода, для регистрации у меня есть 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="[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)
Когда я обращаюсь к URL-адресу из своего веб-браузера, я получаю регистрационную форму, после отправки которой я получаю "403: Запрещено".
Журнал консоли:
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
Что означает эта ошибка и как ее исправить? Спасибо.
Ответы
Ответ 1
Я предполагаю, что в ваших настройках вы включили файлы cookie подделок подкачки
(по умолчанию он включен).
Торнадо XSRF здесь
Чтобы исправить это, отключите его в настройках:
settings = {
"xsrf_cookies": False,
}
Примечание. Обычно вы не хотите отключать это, и обычно вы будете генерировать HTML в шаблоне следующим образом: Обратите внимание на бит xsrf, который добавляет файл 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>
--- ИЗМЕНИТЬ следующие комментарии ---
Вместо:
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")
(и поместите его в каталог шаблонов)
Ответ 2
есть конфликт:
как вы делаете get
и в форме, которую вы положили method="post"
? это почему error 403
если вы используете get
, вам не понадобится защита xsrf
. else, вы добавляете его после объявления формы как
<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.