A few examples on how to use mimerender with the different supported frameworks. Any of these will behave this way:
$ curl -iH "Accept: application/html" localhost:8080/x
...
Content-Type: text/html
...
<html><body>Hello, x!</body></html>
$ curl -iH "Accept: application/xml" localhost:8080/x
...
Content-Type: application/xml
...
<message>Hello, x!</message>
$ curl -iH "Accept: application/json" localhost:8080/x
...
Content-Type: application/json
...
{"message": "Hello, x!"}
$ curl -iH "Accept: text/plain" localhost:8080/x
...
Content-Type: text/plain
...
Hello, x!
from bottle import Bottle, run
try:
import simplejson as json
except ImportError:
import json
import mimerender
mimerender = mimerender.BottleMimeRender()
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
app = Bottle()
@app.route('/')
@app.route('/<name>')
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def greet(name='world'):
return {'message': 'Hello, ' + name + '!'}
if __name__ == "__main__":
run(app, host='localhost', port=8080)
from flask import Flask
try:
import simplejson as json
except ImportError:
import json
import mimerender
mimerender = mimerender.FlaskMimeRender()
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
app = Flask(__name__)
@app.route('/')
@app.route('/<name>')
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def greet(name='world'):
return {'message': 'Hello, ' + name + '!'}
if __name__ == "__main__":
app.run(port=8080)
import webapp2
try:
import simplejson as json
except ImportError:
import json
import mimerender
mimerender = mimerender.Webapp2MimeRender()
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
class Greet(webapp2.RequestHandler):
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def get(self, name):
if not name:
name = 'world'
return {'message': 'Hello, ' + name + '!'}
app = webapp2.WSGIApplication([
('/(.*)', Greet),
], debug=True)
def main():
from paste import httpserver
httpserver.serve(app, host='127.0.0.1', port='8080')
if __name__ == '__main__':
main()
import web
try:
import simplejson as json
except ImportError:
import json
import mimerender
mimerender = mimerender.WebPyMimeRender()
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
urls = (
'/(.*)', 'greet'
)
app = web.application(urls, globals())
class greet:
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def GET(self, name):
if not name:
name = 'world'
return {'message': 'Hello, ' + name + '!'}
if __name__ == "__main__":
app.run()
mimerender provides a helper decorator for mapping exceptions to HTTP Status Codes.
import webapp2
try:
import simplejson as json
except ImportError:
import json
import mimerender
mimerender = mimerender.Webapp2MimeRender()
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **kwargs: json.dumps(kwargs)
render_xml_exception = lambda exception: '<exception>%s</exception>'%exception
render_json_exception = lambda exception: json.dumps(exception.args)
class NotFound(Exception): pass
class Greet(webapp2.RequestHandler):
@mimerender.map_exceptions(
mapping=(
(ValueError, '500 Internal Server Error'),
(NotFound, '404 Not Found')
),
xml = render_xml_exception,
json = render_json_exception,
)
@mimerender(
xml = render_xml,
json = render_json,
)
def get(self, id_):
int_id = int(id_)
if int_id != 1:
raise NotFound('could not find item with id = %d' % int_id)
return dict(message='found it!')
app = webapp2.WSGIApplication([
('/(.*)', Greet),
], debug=True)
def main():
from paste import httpserver
httpserver.serve(app, host='127.0.0.1', port='8080')
if __name__ == '__main__':
main()
mimerender will take care of mapping ValueError and NotFound to the specified HTTP status codes, and it will serialize the exception with an acceptable Content-Type:
$ curl -iH "Accept: application/xml" localhost:8080/1
HTTP/1.0 200 OK
...
Content-Type: application/xml
...
<message>found it!</message>
$ curl -iH "Accept: application/xml" localhost:8080/2
HTTP/1.0 404 Not Found
...
Content-Type: application/xml
...
<exception>could not find item with id = 2</exception>
$ curl -iH "Accept: application/xml" localhost:8080/abc
HTTP/1.0 500 Internal Server Error
...
Content-Type: application/xml
...
<exception>invalid literal for int() with base 10: 'abc'</exception>
$ curl -iH "Accept: application/json" localhost:8080/1
HTTP/1.0 200 OK
...
Content-Type: application/json
...
{"message": "found it!"}
$ curl -iH "Accept: application/json" localhost:8080/2
HTTP/1.0 404 Not Found
...
Content-Type: application/json
...
["could not find item with id = 2"]
$ curl -iH "Accept: application/json" localhost:8080/abc
HTTP/1.0 500 Internal Server Error
...
Content-Type: application/json
...
["invalid literal for int() with base 10: 'abc'"]