1 Using otrace with the Tornado web server¶
This brief tutorial illustrates the use of otrace with the asynchronous
Tornado web server using the demo program, tornademos/torna_trace.py
,
included in the distribution. It is assumed that Tornado is installed
in the system (or in the tornademos
directory).
1.1 Setup¶
For use with Tornado, otrace requires a couple of additional
options, hold_wrapper
and eventloop_callback
:
# Initialize OShell instance (to run on separate thread)
IO_loop = tornado.ioloop.IOLoop.instance()
trace_shell = OShell(locals_dict=locals(), globals_dict=globals(), allow_unsafe=True,
init_file="torna_trace.trc", new_thread=True,
hold_wrapper=tornado.gen.Task,
eventloop_callback=IO_loop.add_callback)
try:
# Start oshell
trace_shell.loop()
# Start tornado event loop
IO_loop.start()
except KeyboardInterrupt:
trace_shell.shutdown()
1.2 Holds¶
Since Tornado is a single-threaded asynchronous server, breakpoints would halt the server. However, using the asynchronous request handling supported by Tornado, one can hold the execution of a single request using a statement of the form:
@tornado.web.asynchronous
@tornado.gen.engine
...
yield traceassert(number != "77", label="hold_check", action="hold")
instead of setting a breakpoint. The hold trace event occurs
when the trace condition is false. The resume
command is used
to resume execution from a hold. Here’s an example where a hold
is triggered when a user enters the number 77 in the form:
tornademos$ ./torna_trace.py
Listening on port 8888
***otrace object shell (v0.30)*** (type 'help' for info)
globals> set trace_active True
trace_active = True
> rootW path=/?number=1
rootW path=/?number=77
GetHandler.get:hd-hold_check:21-06-24
> ls ~~
/osh/recent/holds/GetHandler.get/hd-hold_check/21-06-24
> cd ~~
GetHandler..06-24> ls
__down __trc number self
GetHandler..06-24> ls -l
__down = {__trc, __down, __up}
__trc = {thread, framestack, frame, related, funcname, context, argvalues, where, id, argstr}
number = u'77'
self = <__main__.GetHandler object at 0x10ac0d950>
GetHandler..06-24> resume
globals>
Note that we need to activate tracing explicitly by setting parameter
trace_active
to True to trace traceassert
calls. (This step is
not needed when the trace
command is used for tracing, because
tracing is automatically activated.)
1.3 /osh/web¶
The /osh/web
feature, used with Websockets and
some Javascript “glue code”, allows the otrace server console
to execute arbitrary Javacript commands on the client-side browser.
The demo program tornademos/chat_websock.py
is a modified version
of the chat demo program distributed with Tornado, using websockets.
If you run the program, and have one or more users chatting, you can
execute javascript commands in any user’s browser via the
/osh/web/username
directory:
tornademos$ ./chat_websock.py
chat_websock: Listening on 127.0.0.1:8888
***otrace object shell (v0.30)*** (type 'help' for info)
> cd /osh/web
web> ls
user1
web> set safe_mode False
safe_mode = False
web> cd user1
web..user1> $("body")
[object Object]
web..user1> $("body").css("background","red") // Change background to red
[object Object]
In chat_websock.py
, user input is handled by the input element
with id message.
The repeat
command can be used to monitor user’s typing in real time:
web..user1> $("#message")
[object Object]
web..user1> repeat "User is typing: "+$("#message").val()
Last modified: 2016-03-31