{ "info": { "author": "Geonu Choi", "author_email": "6566gun@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "Nego\n====\n\nContent negotiation utilities for every web framework.\n\n\nHTTP Media Type\n---------------\n\n`Nego` Provides abstracted HTTP media type.\n\n\nMain Type & Sub Type\n~~~~~~~~~~~~~~~~~~~~\n\n``MediaType`` class parses raw media type string and split it into main/sub\ntype.\n\n >>> from nego import MediaType\n >>> MediaType('text/html')\n nego.MediaType('text/html')\n >>> MediaType('text/html').main_type\n 'text'\n >>> MediaType('text/html').sub_type\n 'html'\n >>> MediaType('application', 'json')\n nego.MediaType('application/json')\n\n\nParameters\n~~~~~~~~~~\n\n``MediaType`` class also parses parameters.\n\n >>> MediaType('application/json; charset=utf-8')\n nego.MediaType('application/json; charset=utf-8')\n >>> MediaType('application/json; charset=utf-8').params\n {'charset': 'utf-8'}\n >>> MediaType('application', 'json', dict(charset='utf-8'))\n nego.MediaType('application/json; charset=utf-8')\n >>> MediaType('text/html; q=0.8').quality\n 0.8\n\n\nWildcard & Matching\n~~~~~~~~~~~~~~~~~~~\n\nYou can use wildcard for media type.\n\n >>> MediaType('text/html') in MediaType('text/*')\n True\n >>> MediaType('text/*') in MediaType('text/html')\n False\n >>> MediaType('text/html') in MediaType('text/html')\n True\n >>> MediaType('text/html') in MediaType('application/*')\n False\n >>> MediaType('text/*') in MediaType('*/*')\n True\n\n\nContent Negotiation\n~~~~~~~~~~~~~~~~~~~\n\n`Nego` provides content negotiation by function\n`nego.media_type.choose_acceptable_media_type`.\n\n >>> from nego.media_type import choose_acceptable_media_type\n >>> jpeg_type = MediaType('image/jpeg')\n >>> png_type = MediaType('image/png')\n >>> html_type = MediaType('text/html; q=0.9')\n >>> json_type = MediaType('application/json; q=0.8')\n >>> choose_acceptable_media_type(\n ... [png_type, jpeg_type],\n ... [MediaType('text/html'), MediaType('application/*'),\n ... MediaType('image/*')]\n ... )\n nego.MediaType('image/png')\n >>> choose_acceptable_media_type(\n ... [json_type, html_type],\n ... [MediaType('text/html'), MediaType('application/*')]\n ... )\n nego.MediaType('text/html; q=0.9')\n\n\nRenderer\n--------\n\n`Renderer` renders a data into specific type of data. For example, you can make\na renderer that renders a data into json like ::\n\n import json\n\n from nego import Renderer\n\n class JSONRenderer(Renderer):\n __media_types__ = ['application/json']\n def render(self, data):\n return json.dumps(data)\n\nAnd also plain text renderer like ::\n\n class TextRenderer(Renderer):\n __media_types__ = ['text/plain']\n def render(self, data):\n return str(data)\n\nContent Negotiation\n~~~~~~~~~~~~~~~~~~~\n\n`Nego` also provides content negotiation using renderer by function\n`nego.renderer.best_renderer`.\n\n\n >>> json_renderer = JSONRenderer()\n >>> text_renderer = TextRenderer())\n >>> renderers = [json_renderer, text_renderer]\n >>> accept = 'application/json;q=0.9, text/plain;q=0.7'\n >>> acceptable_types = acceptable_media_types(accept)\n >>> renderer, media_type = best_renderer(acceptable_types, renderers)\n >>> renderer\n json_renderer\n >>> media_type\n nego.MediaType('application/json')\n >>> renderer.render(dict(foo='bar'))\n '{\"foo\": \"bar\"}'\n\nUsing with Web Frameworks\n-------------------------\n\nTornado\n~~~~~~~\n\nYou can use `Nego` with tornado by making mixin. ::\n\n class NegoMixin(object):\n renderers = [JSONRenderer(), TextRenderer()]\n\n def nego(self, obj):\n accept = self.request.headers.get('Accept', '*/*')\n acceptable_types = acceptable_media_types(accept)\n renderer, media_type = best_renderer(acceptable_types, renderers)\n body = renderer.render(obj)\n self.set_header('Content-Type', str(media_type))\n self.write(body)\n", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/hardtack/nego", "keywords": null, "license": "MIT LICENSE", "maintainer": null, "maintainer_email": null, "name": "nego", "package_url": "https://pypi.org/project/nego/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/nego/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/hardtack/nego" }, "release_url": "https://pypi.org/project/nego/0.1.0/", "requires_dist": null, "requires_python": null, "summary": "Content negotiation for every web frameworks.", "version": "0.1.0" }, "last_serial": 1630856, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "572960045967b3538339c29606c993eb", "sha256": "89ca61d571afca6640478478c95ba4cccfbbbcf7c6a501d8f3e3e0b04823c388" }, "downloads": -1, "filename": "nego-0.1.0.zip", "has_sig": false, "md5_digest": "572960045967b3538339c29606c993eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7754, "upload_time": "2015-07-13T08:24:10", "url": "https://files.pythonhosted.org/packages/cf/c6/5458a18f7ab290dd9bcaa80ea2385f4b38521d25b232ef7efae6af6f792e/nego-0.1.0.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "572960045967b3538339c29606c993eb", "sha256": "89ca61d571afca6640478478c95ba4cccfbbbcf7c6a501d8f3e3e0b04823c388" }, "downloads": -1, "filename": "nego-0.1.0.zip", "has_sig": false, "md5_digest": "572960045967b3538339c29606c993eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7754, "upload_time": "2015-07-13T08:24:10", "url": "https://files.pythonhosted.org/packages/cf/c6/5458a18f7ab290dd9bcaa80ea2385f4b38521d25b232ef7efae6af6f792e/nego-0.1.0.zip" } ] }