В моем коде есть что-то принципиально неправильное. Это мои обработчики торнадо с базовой аутентификацией и 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'
спасибо! Именно так, как вы подозревали. Новый импорт 'импорт 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
gen.coroutine вместо gen.engine | теперь он работает. Еще раз спасибо за помощь! – toas939
Ах, я не поймал эту ошибку. gen.coroutine - это, по сути, * комбинация * gen.engine и "асинхронная". Но gen.engine устарел, теперь используйте gen.coroutine. –