2014-10-05 4 views
0

В моем коде есть что-то принципиально неправильное. Это мои обработчики торнадо с базовой аутентификацией и jinja2 в качестве шаблона . Следующие работы без частей momoko db.Momoko, Jinja2 и Tornado

class BaseHandler(tornado.web.RequestHandler): 
    @property 
    def db(self): 
     return self.application.db 
    def get_current_user(self): 
     return self.get_secure_cookie("user") 

class TemplateHandler(BaseHandler): 
    """Request handler for writing HTML templates.""" 
    def render(self, template_name, **kwargs): 
     """Renders a Jinja2 template.""" 
     kwargs['options'] = options.as_dict() 
     template = templates.environment.get_template(template_name) 
     html = template.render(kwargs) 
     self.write(html) 

class AuthLoginHandler(TemplateHandler): 
    def get(self): 
     try: 
      errormessage = self.get_argument("error") 
     except: 
      errormessage = "" 
     self.render("login.html", errormessage = errormessage) 

    def check_permission(self, password, username): 
     if username == "admin" and password == "admin": 
      return True 
     return False 

    def post(self): 
     username = self.get_argument("username", "") 
     password = self.get_argument("password", "") 
     auth = self.check_permission(password, username) 
     if auth: 
      self.set_current_user(username) 
      self.redirect(self.get_argument("next", u"/")) 
     else: 
      error_msg = u"?error=" + tornado.escape.url_escape("Login incorrect") 
      self.redirect(u"/auth/login/" + error_msg) 

    def set_current_user(self, user): 
     if user: 
      self.set_secure_cookie("user", tornado.escape.json_encode(user)) 
     else: 
      self.clear_cookie("user") 

class AuthLogoutHandler(TemplateHandler): 
    def get(self): 
     self.clear_cookie("user") 
     self.redirect(self.get_argument("next", "/")) 


class MainHandler(TemplateHandler): 
    @gen.engine 
    def get(self): 
     username = tornado.escape.xhtml_escape(self.current_user) 
     try: 
      cursor = yield momoko.Op(self.db.execute, 'SELECT * FROM products;') 
     except Exception as error: 
      self.write(str(error)) 
     res = 'Query results: '+''.join(str(cursor.fetchall())) 
     self.render("index.html", username = username, cip = self.request.remote_ip, res = res) 

Для зарегистрированного клиента, этот код должен выполнить базовый запрос, а затем распечатать результат в определенном месте ({{}} разреш) в шаблоне дзиндзя. Когда я пытаюсь запустить сервер, я получаю это:

линии 22, в визуализации kwargs [ 'опции'] = options.as_dict() AttributeError: 'модуль' объект не имеет атрибута 'as_dict'

ответ

0

Нам нужно будет увидеть ваши «импортные» заявления, чтобы знать, что не так. Я подозреваю, что у вас есть:

from tornado import options 

Но вам нужно:

from tornado.options import options 
+0

спасибо! Именно так, как вы подозревали. Новый импорт 'импорт JSON импорта tornado.web из смерча импорта гена из tornado.options импорт параметров из шаблонов импорта приложений импорт Момока импорт psycopg2 ' теперь говорит линии 25, в визуализации self.write (html) Файл "/usr/local/lib/python2.7/dist-packages/tornado-4.0.2-py2.7-linux-x86_64.egg/tornado/web.py", строка 652 , в записи raise RuntimeError («Невозможно записать() после финиша(). Может быть вызвано« RuntimeError: невозможно записать() после финиша(). e, вызванное использованием асинхронных операций без @asynchronous decorator. – toas939

+1

gen.coroutine вместо gen.engine | теперь он работает. Еще раз спасибо за помощь! – toas939

+0

Ах, я не поймал эту ошибку. gen.coroutine - это, по сути, * комбинация * gen.engine и "асинхронная". Но gen.engine устарел, теперь используйте gen.coroutine. –

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