2012-10-15 7 views
10

Wie im folgenden Code zu sehen, habe ich eine GET für die Registrierung, die ihre Arbeit auf POST delegiert.Tornado - '_xsrf' Argument fehlt von 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) 

Wenn ich die URL von meinem Web-Browser zugreifen, bekomme ich ein Anmeldeformular, nach der Einreichung den ich „403: Verboten“ erhalten.

Konsolenprotokoll:

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 

Was bedeutet dieser Fehler, und wie kann ich es beheben? Vielen Dank.

Antwort

16

Ich stelle mir vor, Sie haben Cross-Site-Anfrage fälschen Cookies in Ihren Einstellungen aktiviert (standardmäßig ist es eingeschaltet).

Tornado's XSRF is here

Um dies zu beheben, schalten Sie ihn in Ihren Einstellungen ab:

settings = { 
    "xsrf_cookies": False, 
} 

Hinweis: Normalerweise Sie nicht wollen, diese deaktivieren und normalerweise würden Sie HTML-Code in einer Vorlage wie diese werden zu erzeugen: Bitte beachten Sie das xsrf-Bit, das den XSRF-Cookie hinzufügt.

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

--- EDIT folgende Kommentare --- Statt:

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

Do:

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

oder besser:

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

(und es ausdrückte in Ihrem Vorlagenverzeichnis)

+0

Es wird ein Fehler ausgegeben, dass der Name 'xsrf_form_html()' nicht definiert ist. Brauche ich etwas importieren? Wenn ja, wie füge ich es in meine Vorlage ein? – missingfaktor

+0

Sie brauchen keine speziellen Importe. Beachten Sie, dass xsrf_form_html() nur in einer Vorlage funktioniert. Der oben angegebene Code ist keine Vorlage. –

+0

Hier ist mein Python-Code - https://www.refheap.com/paste/5955, und hier ist meine Vorlage - https://www.refheap.com/paste/5956. – missingfaktor

0

gibt es einen Konflikt: wie machen Sie get und in der Form, die Sie setzen method="post"? Deshalb gibt es error 403

Wenn Sie get verwenden, benötigen Sie keinen xsrf Schutz. sonst ist es nach der Formulardeklaration Du als

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

so die XSRF Sie es einen versteckten Tag in gerenderten html finden.

Verwandte Themen