每个web框架的内容协商。
nego的Python项目详细描述
每个web框架的内容协商实用程序。
http媒体类型
nego提供抽象的http媒体类型。
主类型和子类型
MediaType类分析原始媒体类型字符串并将其拆分为main/sub 键入。
>>> from nego import MediaType >>> MediaType('text/html') nego.MediaType('text/html') >>> MediaType('text/html').main_type 'text' >>> MediaType('text/html').sub_type 'html' >>> MediaType('application', 'json') nego.MediaType('application/json')
参数
MediaType类还分析参数。
>>> MediaType('application/json; charset=utf-8') nego.MediaType('application/json; charset=utf-8') >>> MediaType('application/json; charset=utf-8').params {'charset': 'utf-8'} >>> MediaType('application', 'json', dict(charset='utf-8')) nego.MediaType('application/json; charset=utf-8') >>> MediaType('text/html; q=0.8').quality 0.8
通配符匹配
可以对媒体类型使用通配符。
>>> MediaType('text/html') in MediaType('text/*') True >>> MediaType('text/*') in MediaType('text/html') False >>> MediaType('text/html') in MediaType('text/html') True >>> MediaType('text/html') in MediaType('application/*') False >>> MediaType('text/*') in MediaType('*/*') True
内容协商
nego按功能提供内容协商 nego.media\u type.选择“可接受的媒体类型”。
>>> from nego.media_type import choose_acceptable_media_type >>> jpeg_type = MediaType('image/jpeg') >>> png_type = MediaType('image/png') >>> html_type = MediaType('text/html; q=0.9') >>> json_type = MediaType('application/json; q=0.8') >>> choose_acceptable_media_type( ... [png_type, jpeg_type], ... [MediaType('text/html'), MediaType('application/*'), ... MediaType('image/*')] ... ) nego.MediaType('image/png') >>> choose_acceptable_media_type( ... [json_type, html_type], ... [MediaType('text/html'), MediaType('application/*')] ... ) nego.MediaType('text/html; q=0.9')
渲染器
渲染器将数据渲染为特定类型的数据。例如,您可以 将数据呈现为json格式的呈现程序
import json from nego import Renderer class JSONRenderer(Renderer): __media_types__ = ['application/json'] def render(self, data): return json.dumps(data)
以及类似于
class TextRenderer(Renderer): __media_types__ = ['text/plain'] def render(self, data): return str(data)
内容协商
nego还提供了使用renderer by function的内容协商 nego.renderer.best_renderer。
>>> json_renderer = JSONRenderer() >>> text_renderer = TextRenderer()) >>> renderers = [json_renderer, text_renderer] >>> accept = 'application/json;q=0.9, text/plain;q=0.7' >>> acceptable_types = acceptable_media_types(accept) >>> renderer, media_type = best_renderer(acceptable_types, renderers) >>> renderer json_renderer >>> media_type nego.MediaType('application/json') >>> renderer.render(dict(foo='bar')) '{"foo": "bar"}'
与Web框架一起使用
龙卷风
你可以通过使用MIXIN来使用<引用> NEGO < > >龙卷风。class NegoMixin(object): renderers = [JSONRenderer(), TextRenderer()] def nego(self, obj): accept = self.request.headers.get('Accept', '*/*') acceptable_types = acceptable_media_types(accept) renderer, media_type = best_renderer(acceptable_types, renderers) body = renderer.render(obj) self.set_header('Content-Type', str(media_type)) self.write(body)