2017-01-08 2 views
-1

Я новичок в развитии торнадо и веб-сервисов и в настоящее время реализую крошечную сеть для тренировки модуля торнадо.Tornado rediret incur ТипError: initialize() missing 1 обязательный позиционный аргумент: 'url'

Это код питона я использовал для моего сервера

import bcrypt 
import concurrent.futures 
#import MySQLdb 
#import markdown 
import os.path 
import re 
import subprocess 
#import torndb 
import tornado.escape 
from tornado import gen 
import tornado.httpserver 
import tornado.ioloop 
import tornado.options 
import tornado.web 
import unicodedata 
from tornado.options import define, options 

define("port",default=8889,help='run on the given port',type=int) 


class HomeHandler(tornado.web.RequestHandler): 

    def get(self): 
     #login here 
     self.render('index.html') 

    def post(self): 
     def readcodebook(codebook): 
      with open(codebook,'r+') as f: 
       CodeLines=f.read().split('\n') 
       combinations={} 
       for c in CodeLines: 
        if len(c)>0: 
         combinations[c.split('\t')[0]]=c.split('\t')[1] 
      return combinations 
     UserFile='/home/john/PyServer/Users/codebook.txt' 
     CodeBook=readcodebook(UserFile) 

     if self.get_argument("login") in CodeBook.keys(): 
      if CodeBook[self.get_argument("login")]==self.get_argument("password"): 
       #correct pwd 
       self.redirect(self.get_argument("next","/display/")) 
      else: 
       #incorrect pwd 
       self.render("index.html", error='incorrect password!') 
       return 
     else: 
      #user not found 
      self.render("index.html", error="account not found!") 
      return 


class DisplayHandler(tornado.web.RedirectHandler): 
    def get(self): 
     self.render("displaycontent.html") 
    pass 


class Application(tornado.web.Application): 
    def __init__(self): 
     handlers = [ 
      (r"/", HomeHandler), 
      (r"/display/", DisplayHandler), 
     ] 
     settings = dict(
      #blog_title=u"Tornado Blog", 
      template_path=os.path.join(os.path.dirname(__file__), "templates"), 
      static_path=os.path.join(os.path.dirname(__file__), "static"), 
      #ui_modules={"Entry": EntryModule}, 
      #xsrf_cookies=True, 
      #cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", 
      #login_url="/auth/login", 
      debug=True, 
     ) 
     tornado.web.Application.__init__(self,handlers,**settings) 

if __name__=="__main__": 
    tornado.options.parse_command_line() 
    http_server=tornado.httpserver.HTTPServer(Application()) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.instance().start() 

и это index.html для входа пользователя:

CSSFlow 
Login Form 
Previous 
Next 

    Twitter 
    Facebook 
    RSS 
    Newsletter 

<!DOCTYPE html> 
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> 
<!--[if IE 7]> <html class="lt-ie9 lt-ie8" lang="en"> <![endif]--> 
<!--[if IE 8]> <html class="lt-ie9" lang="en"> <![endif]--> 
<!--[if gt IE 8]><!--> <html lang="en"> <!--<![endif]--> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
    <title>Login Form</title> 
    <link rel="stylesheet" href="css/style.css"> 
    <!--[if lt IE 9]><script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]--> 
</head> 
<body> 
    <section class="container"> 
    <div class="login"> 
     <h1>Login to Web App</h1> 
     <form method="post" action="/"> 
     <p><input type="text" name="login" value="" placeholder="Username or Email"></p> 
     <p><input type="password" name="password" value="" placeholder="Password"></p> 
     <p class="remember_me"> 
      <label> 
      <input type="checkbox" name="remember_me" id="remember_me"> 
      Remember me on this computer 
      </label> 
     </p> 
     <p class="submit"><input type="submit" name="commit" value="Login"></p> 
     </form> 
    </div> 

    <div class="login-help"> 
     <p>Forgot your password? <a href="index.html">Click here to reset it</a>.</p> 
    </div> 
    </section> 

    <section class="about"> 
    <p class="about-links"> 
     <a href="http://www.cssflow.com/snippets/login-form" target="_parent">View Article</a> 
     <a href="http://www.cssflow.com/snippets/login-form.zip" target="_parent">Download</a> 
    </p> 
    <p class="about-author"> 
     &copy; 2012&ndash;2013 <a href="http://thibaut.me" target="_blank">Thibaut Courouble</a> - 
     <a href="http://www.cssflow.com/mit-license" target="_blank">MIT License</a><br> 
     Original PSD by <a href="http://www.premiumpixels.com/freebies/clean-simple-login-form-psd/" target="_blank">Orman Clark</a> 
    </section> 
</body> 
</html> 

    Live Demo 
    HTML Source 
    SCSS Source 

    Tweet 
    Share 

    View Article 
    Download 
    Download All 

90% Unlimited Downloads Choose from Over 300,000 Vectors, Graphics & Photos.ads via Carbon 

Сейчас проблема в том, что смерч будет сгенерировано исключение неперехваченное с описанием ниже и показывает, что ошибка 404 не найдена в веб-браузере, когда я нажимаю кнопку отправки в index.html с правильным именем пользователя и паролем:

[E 170108 11:21:55 http1connection:54] Uncaught exception 
    Traceback (most recent call last): 
     File "/home/gaobo/anaconda3/lib/python3.5/site-packages/tornado/http1connection.py", line 238, in _read_message 
     delegate.finish() 
     File "/home/gaobo/anaconda3/lib/python3.5/site-packages/tornado/httpserver.py", line 289, in finish 
     self.delegate.finish() 
     File "/home/gaobo/anaconda3/lib/python3.5/site-packages/tornado/web.py", line 2022, in finish 
     self.execute() 
     File "/home/gaobo/anaconda3/lib/python3.5/site-packages/tornado/web.py", line 2042, in execute 
     **self.handler_kwargs) 
     File "/home/gaobo/anaconda3/lib/python3.5/site-packages/tornado/web.py", line 183, in __init__ 
     self.initialize(**kwargs) 
    TypeError: initialize() missing 1 required positional argument: 'url' 

Может ли кто-нибудь здесь указать способ исправить эту проблему? Большое спасибо!

ответ

0

Tornado предлагает вам два способа выполнить перенаправление. Один использует RedirectHandler и другим способом, используя метод redirect RequestHandler.

На вашем примере выше вы смешали эти два пути, вызвав ошибку.

На вашем примере, так как вы используете второй путь (RequestHandler.redirect), чтобы выполнить перенаправление на displaycontent.html на успешной регистрации, вам необходимо заменить родительский класс DisplayHandler быть RequestHandler innstead из RedirectHandler.

например.

class DisplayHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.render("displaycontent.html") 

Также параметрами метода перенаправления должен быть только URL-адрес (или псевдоним), к которому вы хотите перенаправить.

например.

#correct pwd 
self.redirect("/display/") 

Если вы заинтересованы в некоторых более чтении на перенаправлении следовать этой link.

+0

Большое спасибо! с измененным параметром от tornado.web.RedirectHandler до tornado.web.RequestHandler, моя проблема может быть решена! – Buddhainside

Смежные вопросы