Массив пустой или нет. Как выбрать для рендеринга с Торнадо страницу
В обработчике веб-сервера Tornado у меня есть этот код:
class NetworkSensorsHandler(BaseHandler):
# Requires authentication
@tornado.web.authenticated
@tornado.web.removeslash
def get(self, nid):
# Mandatory argument action = ['view' | 'edit']
# Used only for visualization purposes
action = self.get_argument('action').lower()
if action not in ['view', 'edit']:
raise tornado.web.HTTPError(404, "Unknown action: " + str(action))
# Retrieve the current user
usr = self.get_current_user()
usr_id = usr['id']
self.lock_tables("read", ['nets_permissions as n'])
perm = self.db.get("SELECT n.perm FROM nets_permissions as n \
WHERE n.network_id=%s AND n.user_id=%s", nid, int(usr_id))
self.unlock_tables()
# Check whether the user has access to the network
perms = self.check_network_access(nid, perm['perm'])
self.lock_tables("read", ['devices'])
# Retrieve the sensors
sens = self.db.query("SELECT * FROM devices \
WHERE network_id=%s", nid)
self.unlock_tables()
# get network info
net = self.get_network(nid);
# get the permissions on the network
writeable = self.get_network_access(net.id, PERM_WRITE)
#s['commands'] = sensors_config[net['ntype']][s['type']]['commands']
sens_config = sensors_config[net.ntype]
# Retrieve the current user
net_id = net['id']
# Retrieve the current rights
self.lock_tables("read", ['users as u', 'nets_permissions as m'])
user = self.db.query("SELECT u.id, u.name, n.perm FROM users as u LEFT OUTER JOIN (SELECT * FROM nets_permissions as m WHERE network_id=%s) as n on u.id = n.user_id WHERE (n.perm <> 3 or n.perm is NULL)", int(net_id))
self.unlock_tables()
# Render the networks page
self.render("sensors.html", sensors=sens, perms=perms, net=net, action=action, writeable=writeable, sens_config=sens_config, users=user)
Теперь на странице HTML у меня есть часть кода, как это:
{% for sens in sensors %}
.............
{% end %}
Но, очевидно, когда у меня есть некоторые датчики, а затем я их удаляю, после последнего удаления датчика я получаю эту ошибку:
UnboundLocalError: локальная переменная 'sens', на которую ссылаются до назначения
потому что массив чувств в Торнадо пуст. Если я добавлю датчик в таблицу БД вручную, страница будет работать нормально!
Если я вставлю блок if... end в блок {% if sensor%}...{% end %}, то же самое, потому что страница не распознала одновременно переменную sens.
Как можно исключить часть из оператора if... end, если результат запроса пуст? Или я должен инициализировать переменную sens в обработчике Tornado?
Большое спасибо. Пожалуйста, помогите мне!
РЕДАКТИРОВАТЬ
Полный возврат:
Traceback (most recent call last):
File "/usr/lib/python2.6/site-packages/tornado/web.py", line 988, in _execute
getattr(self, self.request.method.lower())(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/tornado/web.py", line 1739, in wrapper
return method(self, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/tornado/web.py", line 1096, in wrapper
return method(self, *args, **kwargs)
File "./wsn.py", line 699, in get
self.render("sensors.html", sensors=sens, perms=perms, net=net, action=action, writeable=writeable, sens_config=sens_config, users=user)
File "./wsn.py", line 349, in render
tornado.web.RequestHandler.render(self, *args, **kwargs)
File "/usr/lib/python2.6/site-packages/tornado/web.py", line 474, in render
html = self.render_string(template_name, **kwargs)
File "/usr/lib/python2.6/site-packages/tornado/web.py", line 586, in render_string
return t.generate(**args)
File "/usr/lib/python2.6/site-packages/tornado/template.py", line 253, in generate
return execute()
File "sensors_html.generated.py", line 363, in _execute
_tmp = sens.id # sensors.html:203 (via base.html:152)
UnboundLocalError: local variable 'sens' referenced before assignment
1 ответ
Можете ли вы поместить полный HTML, пожалуйста, или проверьте, находится ли строка 203 в вашем sensor.html между вашим циклом "for".
{% for sens in sensors %}
............. # line 203
{% end %}