Usage Examples

Content-Type selection

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!

Bottle

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)

Flask

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)

Webapp2

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()

web.py

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()

Content-Type selection plus Exception Mapping

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'"]

Project Versions

Table Of Contents

Previous topic

mimerender’s documentation

Next topic

API

This Page