Learn TORNADO with Real Code Examples
Updated Nov 25, 2025
Code Sample Descriptions
1
Tornado Simple Counter API
import tornado.ioloop
import tornado.web
count = 0
class CounterHandler(tornado.web.RequestHandler):
async def get(self):
self.write({'count': count})
class IncrementHandler(tornado.web.RequestHandler):
async def post(self):
global count
count += 1
self.write({'count': count})
class DecrementHandler(tornado.web.RequestHandler):
async def post(self):
global count
count -= 1
self.write({'count': count})
class ResetHandler(tornado.web.RequestHandler):
async def post(self):
global count
count = 0
self.write({'count': count})
app = tornado.web.Application([
(r'/counter', CounterHandler),
(r'/counter/increment', IncrementHandler),
(r'/counter/decrement', DecrementHandler),
(r'/counter/reset', ResetHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Demonstrates a simple Tornado REST API with a counter using async handlers and in-memory state.
2
Tornado Hello World API
import tornado.ioloop
import tornado.web
class HelloHandler(tornado.web.RequestHandler):
async def get(self):
self.write({'message': 'Hello World'})
app = tornado.web.Application([
(r'/', HelloHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
A minimal Tornado API returning Hello World.
3
Tornado JSON Echo
import tornado.ioloop
import tornado.web
import json
class EchoHandler(tornado.web.RequestHandler):
async def post(self):
data = json.loads(self.request.body)
self.write(data)
app = tornado.web.Application([
(r'/echo', EchoHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
A POST endpoint that echoes JSON data.
4
Tornado Query Parameter Example
import tornado.ioloop
import tornado.web
class GreetHandler(tornado.web.RequestHandler):
async def get(self):
name = self.get_argument('name', 'Guest')
self.write({'message': f'Hello {name}'})
app = tornado.web.Application([
(r'/greet', GreetHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Using query parameters to greet users.
5
Tornado Route Parameter Example
import tornado.ioloop
import tornado.web
class UserHandler(tornado.web.RequestHandler):
async def get(self, user_id):
self.write({'id': int(user_id), 'name': f'User {user_id}'})
app = tornado.web.Application([
(r'/users/(\d+)', UserHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Returns user info based on URL parameter.
6
Tornado Middleware Logging
import tornado.ioloop
import tornado.web
class LogMiddleware(tornado.web.RequestHandler):
async def prepare(self):
print(f'{self.request.method} {self.request.uri}')
class IndexHandler(LogMiddleware):
async def get(self):
self.write({'message': 'Check console for logs'})
app = tornado.web.Application([
(r'/', IndexHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Simple middleware to log requests in Tornado.
7
Tornado Async Delay Example
import tornado.ioloop
import tornado.web
import asyncio
class AsyncHandler(tornado.web.RequestHandler):
async def get(self):
await asyncio.sleep(1)
self.write({'message': 'Async response'})
app = tornado.web.Application([
(r'/async', AsyncHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
An async route returning data after a delay.
8
Tornado 404 Example
import tornado.ioloop
import tornado.web
class DefaultHandler(tornado.web.RequestHandler):
def prepare(self):
self.set_status(404)
self.write({'error': 'Not Found'})
app = tornado.web.Application([], default_handler_class=DefaultHandler)
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Custom 404 error response.
9
Tornado Combined Routes Example
import tornado.ioloop
import tornado.web
import json
count = 0
class LogHandler(tornado.web.RequestHandler):
async def prepare(self):
print(f'{self.request.method} {self.request.uri}')
class EchoHandler(LogHandler):
async def post(self):
data = json.loads(self.request.body)
self.write(data)
class CounterHandler(LogHandler):
async def get(self):
self.write({'count': count})
async def post(self, action):
global count
if action == 'increment': count += 1
elif action == 'decrement': count -= 1
elif action == 'reset': count = 0
self.write({'count': count})
app = tornado.web.Application([
(r'/echo', EchoHandler),
(r'/counter', CounterHandler),
(r'/counter/(increment|decrement|reset)', CounterHandler)
])
if __name__ == '__main__':
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Logging, JSON echo, and counter in a single Tornado app.