Skip to main content

Negotiate: smart, simple content negotiation for Python web applications

Project description

Smart, simple content negotiation for Python web applications.

Content negotiation can be difficult to do well. Ideally, your code should be DRY, and you wouldn’t be repeating the same old boilerplate in multiple view methods in order to emit the same domain object in different formats. negotiate helps make your life even easier by allowing you to decorate your view methods with formatters that automatically translate your domain objects into the format requested by the client.

It’s really simple to use. Hopefully this example (for a Flask application) makes the main points clear:

# First, we write a couple of formatters that specify how to translate the
# output of the view function into a particular format. Here we define a
# JSON formatter and an HTML formatter that takes a template parameter.

from negotiate.flask import Formatter

class JSONFormatter(Formatter):
    format = 'json'
    mimetypes = ['application/json']

    def render(self, obj):
        return json.dumps(obj)

class HTMLFormatter(Formatter):
    format = 'json'
    mimetypes = ['text/html']

    def configure(self, template):
        self.template = template

    def render(self, obj):
        return render(self.template, **obj)

# Then, when building the application, we decorate the view function with the
# "negotiate" decorator, listing the formats in which this view is available.

from negotiate.flask import negotiate

@app.route('/posts/<id>')
@app.route('/posts/<id>.<format>')
@negotiate(JSONFormatter)
@negotiate(HTMLFormatter, template='post.html')
def view_post(id, format=None):
    post = Posts.by_id(id)

    if post is None:
        abort(404)
    if not g.user.authorize('read', post):
        abort(401)

    return {'post': post}

The result is a view action that will return an HTML version of the post by default (i.e. with Accept: */* and no explicit format), or if the .html extension is explicitly specified, or a JSON version of the post if the .json extension is given or Accept: application/json is sent with the request.

Support

negotiate currently supports Flask and Pylons, although adding support for other web frameworks should be pretty easy. Have a look at negotiate/flask.py and negotiate/pylons.py to see the small amount of integration code required.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

negotiate-0.0.1.tar.gz (4.9 kB view details)

Uploaded Source

File details

Details for the file negotiate-0.0.1.tar.gz.

File metadata

  • Download URL: negotiate-0.0.1.tar.gz
  • Upload date:
  • Size: 4.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for negotiate-0.0.1.tar.gz
Algorithm Hash digest
SHA256 8dbb81a77beda735605a1b16592291524912a7b94fe868c7404f80d901fb66f3
MD5 2fbd9f86d634d4ce690c63743489d5df
BLAKE2b-256 b65fe8905340f93d244508f7613c1e2efdd5f61dd79915e1294250789c0ab69f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page