2012-10-15 23 views
10

'dan eksik Aşağıdaki kodda görüldüğü üzere, kayıt için numaralı bir belgem var, bu da çalışmasını POST. Benim web tarayıcısından URL eriştiğinizdeTornado - '_xsrf' argümanı 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) 

, ben göndererek bundan sonra ben ": Yasak 403" olsun, bir kayıt formu olsun.

Konsol günlüğü:

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 

bu hata ne anlama geliyor ve nasıl düzeltirim? Teşekkürler.

cevap

16

Hayalinizdeki siteler için geçici sitelerden oluşan çerezleri etkinleştirilmiş (varsayılan olarak açıktır).

Tornado's XSRF is here

Bunu düzeltmek için ayarlar bölümünden kapatın:

settings = { 
    "xsrf_cookies": False, 
} 

Not: Normalde bu kapatmak istemiyorum ve normalde böyle bir şablonda HTML oluşturma olurdu: Lütfen XSRF çerezini ekleyen xsrf biti not edin.

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

--- DÜZENLEME aşağıdaki yorumlar --- Yerine :

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

veya daha iyi:

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

(ve koyun şablonları dizininizde)

+0

'xsrf_form_html()' adının tanımlı olmadığı bir hata ortaya çıkıyor. Bazı ithalatlara ihtiyacım var mı? Varsa, şablonuma nasıl eklerim? – missingfaktor

+0

Herhangi bir özel ithalata ihtiyacınız yoktur. Xsrf_form_html() öğesinin yalnızca bir Şablonda çalışacağını unutmayın. Yukarıda gönderdiğiniz kod bir şablon değil. –

+0

İşte benim Python kodum - https://www.refheap.com/paste/5955, ve işte benim şablonum - https://www.refheap.com/paste/5956. – missingfaktor

0

Bir çakışma var: get'u nasıl yaparsınız ve formda method="post"? Eğer get kullanırsanız error 403

var neden bu, o zaman bir xsrf korunmaya ihtiyacı olmayacaktır. Başka, bunu XSRF bunu render html gizli etiketi bulacaksınız

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

olarak formu ilanı sonrasında ekleyin.