0

Tornado Webサーバーのハンドラーには、次のコードがあります。

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'

トルネードのsens配列が空だからだと思います。DBテーブルにセンサーを手動で追加すると、ページは正常に機能します。

if ... endブロックを{%ifセンサー%} ... {%end%}ブロックに入れると、ページが同時に変数sensを認識しなかったため、同じになります。

クエリ結果のsensが空の場合、if ... endステートメントの一部を除外するにはどうすればよいですか?または、Tornadoハンドラーでsens変数を初期化する必要がありますか?

どうもありがとうございます。私を助けてください!

編集

完全なトレースバックは次のとおりです。

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
4

1 に答える 1

1

完全なHTMLを入力してください。または、sensors.htmlの203行目が「for」ループの間にあるかどうかを確認してください。

{% for sens in sensors %}
............. # line 203
{% end %}
于 2012-11-16T11:50:20.137 に答える