{ "info": { "author": "IT Services, University of Oxford", "author_email": "infodev@it.ox.ac.uk", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "Content-negotiation framework for Django\n========================================\n\nThis project provides a simple and extensible framework for producing views\nthat content-negotiate in Django.\n\nPrerequisites\n-------------\n\nThis library depends on Django 1.3, which you can install using your package\nmanager on recent distributions, or using pip::\n\n pip install -r requirements.txt\n\n``pip`` is called ``pip-python`` on Fedora. It is generally provided by a\n``python-pip`` package.\n\nUsing\n-----\n\nTo define a view, do something like this::\n\n from django_conneg.views import ContentNegotiatedView\n\n class IndexView(ContentNegotiatedView):\n def get(self, request):\n context = {\n # Build context here\n }\n\n # Call render, passing a template name (without file extension)\n return self.render(request, context, 'index')\n\nThis will then look for a renderer that can provide a representation that\nmatches what was asked for in the Accept header.\n\nBy default ContentNegotiatedView provides no renderers, so the above snippet\nwould always return a 405 Not Acceptable to tell the user-agent that it\ncouldn't provide a response in a suggested format.\n\nTo define a renderer on a view, do something like this::\n\n import json\n\n from django.http import HttpResponse\n\n from django_conneg.decorators import renderer\n\n class JSONView(ContentNegotiatedView):\n @renderer(format='json', mimetypes=('application/json',), name='JSON')\n def render_json(self, request, context, template_name):\n # Very simplistic, and will fail when it encounters 'non-primitives'\n # like Django Model objects, Forms, etc.\n return HttpResponse(json.dumps(context), mimetype='application/json')\n\n.. note::\n ``django-conneg`` already provides a slightly more sophisticated JSONView;\n see below for more information.\n\nYou can render to a particular format by calling ``render_to_format()`` on the\nview::\n\n class IndexView(ContentNegotiatedView):\n def get(self, request):\n # ...\n\n if some_condition:\n return self.render_to_format(request, context, 'index', 'html')\n else:\n return self.render(request, context, 'index')\n \n\nForcing a particular renderer from the client\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBy default, a client can request a particular set of renderers be tried by\nusing the ``format`` query or POST parameter::\n\n GET /some-view/?format=json,yaml\n\nThe formats correspond to the ``format`` argument to the ``@renderer``\ndecorator.\n\nTo change the name of the parameter used, override\n``_format_override_parameter`` on the view class::\n\n class MyView(ContentNegotiatedView):\n _format_override_parameter = 'output'\n\n\nProviding fallback renderers\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nSometimes you might want to provide a response in some format even if the\nthose in the Accept header can't be honoured. This is useful when providing\nerror responses in a different format to the client's expected format. To do\nthis, set the ``_force_fallback_format`` attribute to the name of the format::\n\n class MyView(ContentNegotiatedView):\n _force_fallback_format = 'html'\n\nIf a client doesn't provide an Accept header, then you can specify a default\nformat with ``_default_format``::\n\n class MyView(ContentNegotiatedView):\n _default_format = 'html'\n\nBuilt-in renderer views\n~~~~~~~~~~~~~~~~~~~~~~~\n\n``django_conneg`` includes the following built-in renderers in the\n``django_conneg.views`` module:\n\n* ``HTMLView`` (renders a ``.html`` template with media type ``text/html``)\n* ``TextView`` (renders a ``.txt`` template with media type ``text/plain``)\n* ``JSONView`` (coerces the context to JavaScript primitives and returns as ``application/json``)\n* ``JSONPView`` (as ``JSONView``, but wraps in a callback and returns as ``application/javascript``)\n\nUsing these, you could define a view that renders to both HTML and JSON like this::\n\n from django_conneg.views import HTMLView\n\n class IndexView(JSONView, HTMLView):\n def get(self, request):\n # ...\n return self.render(request, context, 'index')\n\nAccessing renderer details\n--------------------------\n\nThe renderer used to construct a response is exposed as a ``renderer``\nattribute on the response object::\n\n class IndexView(JSONView, HTMLView):\n def get(self, request):\n # ...\n response = self.render(request, context, 'index')\n response['X-Renderer-Format'] = response.renderer.format\n return response \n\n\nRenderer priorities\n-------------------\n\nSome user-agents might specify various media types with equal levels of\ndesirability. For example, previous versions of Safari and Chrome `used to send\n`_\nan ``Accept`` header like this::\n\n application/xml,application/xhtml+xml,text/html;q=0.9,\n text/plain;q=0.8,image/png,*/*;q=0.5\n\nWithout any additional hints it would be non-deterministic as to whether XML or\nXHTML is served.\n\nBy passing a ``priority`` argument to the ``@renderer`` decorator you can\nspecify an ordering of renderers for such ambiguous situations::\n\n class IndexView(ContentNegotiatedView):\n @renderer(format='xml', mimetypes=('application/xml',), name='XML', priority=0)\n def render_xml(request, context, template_name):\n # ...\n\n @renderer(format='html', mimetypes=('application/xhtml+xml','text/html), name='HTML', priority=1)\n def render_html(request, context, template_name):\n # ...\n\nAs higher-numbered priorities are preferred, this will result in HTML always\nbeing prefered over XML in ambiguous situations.\n\nBy default, ``django-conneg``'s built-in renderers have a priority of 0, except\nfor ``HTMLView`` and ``TextView``, which each have a priority of 1 for the\nreason given above.\n\n\nImproved 40x response handling\n------------------------------\n\nDjango provides a couple of useful exceptions, ``Http404`` and\n``PermissionDenied``, which you may want to use in your application. However,\nit's only possible to customise the 404 site-wide (either by providing a\n``404.html`` template, or by setting ``handler404`` in your urlconf), and\nuntil Django 1.4 comes out, PermissionDenied will always result in a very\nspartan error page.\n\n``django-conneg`` provides an ``ErrorCatchingView`` which you can use as a\nmixin to customise the rendering of responses for these error situations::\n\n from django_conneg.views import HTMLView, ErrorCatchingView\n\n class IndexView(HTMLView, ErrorCatchingView):\n # ...\n\nYou can then customise error responses in one of the following ways:\n\n* overriding the ``conneg/(forbidden|not_found|not_acceptable).(html|txt) templates\n* overriding ``error_403``, ``error_404`` or ``error_406`` methods on the view\n* overriding the ``error_template_names`` attribute to specify a non-standard template name:\n\nIn the latter case, you can do something like::\n\n import httplib\n from django.util.datastructures import MergeDict\n from django_conneg.views import HTMLView, ErrorCatchingView\n\n class IndexView(HTMLView, ErrorCatchingView):\n # Provide a view-specific 404 page. Use MergeDict to use django_conneg's\n # defaults for other types of errors.\n error_template_names = MergeDict({httplib.NOT_FOUND: 'foo/404'},\n ErrorCatchingView.error_template_names)\n # ...\n\n\nRunning the tests\n-----------------\n\n``django-conneg`` has a modest test suite. To run it, head to the root of the\nrepository and run::\n\n django-admin test --settings=django_conneg.test_settings --pythonpath=.\n\nIf you don't have Django, you'll need to install it as detailed in the\nPrerequisites section above.\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/ox-it/django-conneg", "keywords": "REST", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-conneg", "package_url": "https://pypi.org/project/django-conneg/", "platform": "", "project_url": "https://pypi.org/project/django-conneg/", "project_urls": { "Homepage": "https://github.com/ox-it/django-conneg" }, "release_url": "https://pypi.org/project/django-conneg/0.11/", "requires_dist": null, "requires_python": "", "summary": "An implementation of content-negotiating class-based views for Django", "version": "0.11" }, "last_serial": 2643684, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "d3a518a36d59c4afd0aef5b2a35f5f53", "sha256": "8cf5e615b9a23851bc36f0dac832cff039fb7e1e2e2fee1071ff9a12c9beee52" }, "downloads": -1, "filename": "django-conneg-0.1.tar.gz", "has_sig": false, "md5_digest": "d3a518a36d59c4afd0aef5b2a35f5f53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6301, "upload_time": "2011-08-11T13:06:43", "url": "https://files.pythonhosted.org/packages/44/3b/92f085dba33b828189095c34a2e11b6f7f3d35d1231465f48552fc752f3c/django-conneg-0.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "da54b660ea2cac146f46921309415ee9", "sha256": "829aa350253a34f9ff351f0949483349bf2a343128f762f4eebfddaa2ece21bb" }, "downloads": -1, "filename": "django-conneg-0.1.2.tar.gz", "has_sig": false, "md5_digest": "da54b660ea2cac146f46921309415ee9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6339, "upload_time": "2011-08-11T13:30:26", "url": "https://files.pythonhosted.org/packages/be/42/d914bea9892ab2f3f8e4a4e59976bf753329b362662bc9d1f90afe2c0f73/django-conneg-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "f785c629aac547e77a35886780d3d5cd", "sha256": "8c635938d70679853384d194882febd0da93b67e57e89eaac775944aeb575047" }, "downloads": -1, "filename": "django-conneg-0.1.3.tar.gz", "has_sig": false, "md5_digest": "f785c629aac547e77a35886780d3d5cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6807, "upload_time": "2011-08-12T18:11:08", "url": "https://files.pythonhosted.org/packages/ba/95/e8a3b0db8b249aa7aa8dbd170f4c01acee87a0f27a98e6aaab0357dea7fc/django-conneg-0.1.3.tar.gz" } ], "0.10.0": [ { "comment_text": "", "digests": { "md5": "d7fb1fdfd70f600bbf6e1e6a04309a15", "sha256": "fa1abc86a2dfef1e5e1257624aaefdd8203d597b012f20a4b6bc8367380597a4" }, "downloads": -1, "filename": "django-conneg-0.10.0.tar.gz", "has_sig": false, "md5_digest": "d7fb1fdfd70f600bbf6e1e6a04309a15", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34932, "upload_time": "2014-10-10T14:20:17", "url": "https://files.pythonhosted.org/packages/da/e3/01b34241d13f4bd7f36db9b3e89373332f02a1e341383e6e52044c965481/django-conneg-0.10.0.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "5e83c2bdd533f3c84286424782e07ed7", "sha256": "4397f99c33e5adfd756ed375faec4849b39ba860cdbdcc933db29a6dd08a9926" }, "downloads": -1, "filename": "django-conneg-0.11.tar.gz", "has_sig": false, "md5_digest": "5e83c2bdd533f3c84286424782e07ed7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32054, "upload_time": "2017-02-15T12:42:21", "url": "https://files.pythonhosted.org/packages/ca/ec/4002d7be5d2e3df9b45578cef1bc422c3ab255ac8603b89c55abf0f7e052/django-conneg-0.11.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "a654bb1197f6b57e924e95604faac5f8", "sha256": "527f537f080f6fc6c211049e32eda241c98f7a440ae4a98ea816d804b70282c0" }, "downloads": -1, "filename": "django-conneg-0.2.tar.gz", "has_sig": false, "md5_digest": "a654bb1197f6b57e924e95604faac5f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6928, "upload_time": "2011-08-14T01:02:50", "url": "https://files.pythonhosted.org/packages/54/a5/2cabe730c9452ad402a51d9e4e8803069eb25f572c1d7fed817de0339d8b/django-conneg-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "4dfe5689f254db4683df24b3037e9d63", "sha256": "81cefb3f4ba5865398da5003336ef7c640641081d8a80aa2bb77cc8f5eba007e" }, "downloads": -1, "filename": "django-conneg-0.2.1.tar.gz", "has_sig": false, "md5_digest": "4dfe5689f254db4683df24b3037e9d63", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7130, "upload_time": "2011-08-15T01:54:40", "url": "https://files.pythonhosted.org/packages/74/66/8e3309d560340d48509de89784e8049306b60239b96f53f09646f230000a/django-conneg-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "861bbd01066652063d6300b23695039b", "sha256": "2667fa56947545a1f1dd877f88d250416e05fa67bd56171b9a83db2ab885fb8f" }, "downloads": -1, "filename": "django-conneg-0.2.2.tar.gz", "has_sig": false, "md5_digest": "861bbd01066652063d6300b23695039b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7159, "upload_time": "2011-08-15T22:42:41", "url": "https://files.pythonhosted.org/packages/97/57/5b464285f0279074cb14e4aa99cab35ddf77e433005d248410bb54e8cff0/django-conneg-0.2.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "c6d09a29079292a12369ab5932632563", "sha256": "e2271e3e8e3a315500f9adef012c4e857e7159361bdc527f7ec87c2eeb4e0e6f" }, "downloads": -1, "filename": "django-conneg-0.3.tar.gz", "has_sig": false, "md5_digest": "c6d09a29079292a12369ab5932632563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7299, "upload_time": "2011-08-24T13:23:30", "url": "https://files.pythonhosted.org/packages/a3/90/39ed2a5de6a798a9da599b22ca1777b326c489a44cb0a5a8edbb06c8788d/django-conneg-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "409dfc1c9bd8a61a59007a88ab72cd82", "sha256": "493391ad4ecd643baeec70672c87047374e70932d00e6ca6e2e78434057a462e" }, "downloads": -1, "filename": "django-conneg-0.4.tar.gz", "has_sig": false, "md5_digest": "409dfc1c9bd8a61a59007a88ab72cd82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7488, "upload_time": "2011-10-05T23:57:03", "url": "https://files.pythonhosted.org/packages/f6/59/b8b745426064aab260a74ecbbe6f0fd122fb93b5538264913ea3a37f6ffe/django-conneg-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "2478d76dd061156d6346f6ef421b1e50", "sha256": "2c3613d3ac938ab98dc4c63ee678cebd2eab6dd8115ef1deb165df95e97bd853" }, "downloads": -1, "filename": "django-conneg-0.5.tar.gz", "has_sig": false, "md5_digest": "2478d76dd061156d6346f6ef421b1e50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7460, "upload_time": "2011-11-08T17:24:20", "url": "https://files.pythonhosted.org/packages/4e/02/357090a23c9956f16d98862b2d71ac64ae4a4ed076a65a7905ad3b5d25ea/django-conneg-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "dc71640fad988d9a25bb3f200bdde490", "sha256": "873f6c7b500886f16ff6c3cb71bc9fab54b726d26cadabe7d699996aa8c2bd0e" }, "downloads": -1, "filename": "django-conneg-0.6.tar.gz", "has_sig": false, "md5_digest": "dc71640fad988d9a25bb3f200bdde490", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8928, "upload_time": "2012-01-03T10:54:45", "url": "https://files.pythonhosted.org/packages/fd/6e/ebfad75d669e096a693be7a30325771b440cac16d745f10cff9d117e46fe/django-conneg-0.6.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "772d537702f57576a542c51bdd12af69", "sha256": "49134a6c04b11ced9f1042baa1aa1cb354c541ef85158e50884813bb1056b66d" }, "downloads": -1, "filename": "django-conneg-0.7.2.tar.gz", "has_sig": false, "md5_digest": "772d537702f57576a542c51bdd12af69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14081, "upload_time": "2012-03-06T14:58:58", "url": "https://files.pythonhosted.org/packages/48/09/180d3ad9debe194c224ace0995f54c0702901db8e07adc76bad04db4aa68/django-conneg-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "bacaf67629a16cff561aab6f93119b10", "sha256": "af3abc1127ce7eb3cc8bfd341df90d6a3cab51bbc8b97d80f483ca652f0aa82d" }, "downloads": -1, "filename": "django-conneg-0.7.3.tar.gz", "has_sig": false, "md5_digest": "bacaf67629a16cff561aab6f93119b10", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15182, "upload_time": "2012-03-06T15:53:34", "url": "https://files.pythonhosted.org/packages/42/9e/b2c5b4f10a85f2f89cf3a445f3fad90be3113e7b4cad32f41b2e97868359/django-conneg-0.7.3.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "2225d41e9e38a1b18c6722a0cee3abcb", "sha256": "76144e660966ca9b15f6ab797de53216a0f456f1be71ddedc292335a9f2340a8" }, "downloads": -1, "filename": "django-conneg-0.8.tar.gz", "has_sig": false, "md5_digest": "2225d41e9e38a1b18c6722a0cee3abcb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16499, "upload_time": "2012-09-28T12:11:35", "url": "https://files.pythonhosted.org/packages/93/6c/47b66e66459447e80596edce27beb57459a5a681ed13a2eee541e2a82e30/django-conneg-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "989659335bb6a077de09a70b785aaafe", "sha256": "6cf23eff042401a259671159a0cacf33d1394a87d062af9c63439400aabc7f62" }, "downloads": -1, "filename": "django-conneg-0.9.tar.gz", "has_sig": false, "md5_digest": "989659335bb6a077de09a70b785aaafe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16871, "upload_time": "2012-11-09T14:24:01", "url": "https://files.pythonhosted.org/packages/55/c1/09da2a314f2cf87abb9d61d0ddb31261865510105d41061a78aaa8410647/django-conneg-0.9.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "9a34f66f7c8ff85854b7dc324abcd6f6", "sha256": "312a6be2b480636b5df045bde98d5cbac941dbdc9edee6f32e0da3d40c7c826b" }, "downloads": -1, "filename": "django-conneg-0.9.1.tar.gz", "has_sig": false, "md5_digest": "9a34f66f7c8ff85854b7dc324abcd6f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17990, "upload_time": "2012-11-16T15:14:33", "url": "https://files.pythonhosted.org/packages/26/8e/08151ec6671c649745a5fb715827ac0ea1522ffc9fd739c794fd81432f96/django-conneg-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "e82212c358011843b993a1dbd8825e58", "sha256": "7776e6eefac65f7f2c58d378ae870408e50dce53c90afdec871dc57988b4c00b" }, "downloads": -1, "filename": "django-conneg-0.9.2.tar.gz", "has_sig": false, "md5_digest": "e82212c358011843b993a1dbd8825e58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17985, "upload_time": "2012-11-16T15:33:36", "url": "https://files.pythonhosted.org/packages/13/1e/0e52dc0ef5f21937917259a1553556d5ea22fa6f8b7bd33dcc1337788f5c/django-conneg-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "1e8f04788e4b322d0099efb667945c6d", "sha256": "e367ddf34706ea28fd86b4630e053f2688d997317725d5439884846129dddda7" }, "downloads": -1, "filename": "django-conneg-0.9.3.tar.gz", "has_sig": true, "md5_digest": "1e8f04788e4b322d0099efb667945c6d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17989, "upload_time": "2012-11-23T09:13:33", "url": "https://files.pythonhosted.org/packages/87/f1/3a7b32c5f330ae1230a84608a912c6b140d804d00b7caf19e6d2867e6247/django-conneg-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "1053a0261183fa8f444728f44fc1bdc5", "sha256": "763f41c0b7f3cfba6b10f0bb923fab0396070fd89218511ecea654aa3c3d6cde" }, "downloads": -1, "filename": "django-conneg-0.9.4.tar.gz", "has_sig": false, "md5_digest": "1053a0261183fa8f444728f44fc1bdc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35165, "upload_time": "2013-11-28T22:27:24", "url": "https://files.pythonhosted.org/packages/18/2c/8ab6f41d030db8b583b4d799c26d73163d51de7c41a834c00333f9831a2d/django-conneg-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "ffc0c8c96eebec52f2a2f1e28cfe60f7", "sha256": "d979226def4942cd88213f7cf44fc492b7c7a8f6c4eb926bf4a9339fda268fa1" }, "downloads": -1, "filename": "django-conneg-0.9.5.tar.gz", "has_sig": false, "md5_digest": "ffc0c8c96eebec52f2a2f1e28cfe60f7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34910, "upload_time": "2014-03-07T22:48:29", "url": "https://files.pythonhosted.org/packages/7d/64/04dee084afb416515cbda48af254c37ce87631a51138c4b9e2f9e7223025/django-conneg-0.9.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5e83c2bdd533f3c84286424782e07ed7", "sha256": "4397f99c33e5adfd756ed375faec4849b39ba860cdbdcc933db29a6dd08a9926" }, "downloads": -1, "filename": "django-conneg-0.11.tar.gz", "has_sig": false, "md5_digest": "5e83c2bdd533f3c84286424782e07ed7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32054, "upload_time": "2017-02-15T12:42:21", "url": "https://files.pythonhosted.org/packages/ca/ec/4002d7be5d2e3df9b45578cef1bc422c3ab255ac8603b89c55abf0f7e052/django-conneg-0.11.tar.gz" } ] }