django的json帮助程序的轻量级集合。
django-argonauts的Python项目详细描述
django的json帮助程序的轻量级集合。包括模板筛选器 为了安全地输出json,可以对json进行编码和解码的视图,以及 编写简单的rest视图。
一个特殊的json编码器用于序列化queryset和对象 to_json方法。
过滤器
可以使用|json过滤器在json中序列化对象。这很有用 生成安全的javascript:
{% load argonauts %} <scripttype="application/javascript">(function(){varobject_list={{object_list|json}};// do something with object_list })();</script>
|json可以安全地在xml或xhtml中的任何地方使用,但在属性中除外。是的 使用此标记而不是将json.dumps的输出转储到 HTML,因为攻击者可以输出结束标记并实施XSS攻击。 例如,如果我们在这样的模板中输出json.dumps("</script><script>console.log('xss');//"):
<script>varsomedata={{somedata_as_json|safe}};</script>
我们得到:
<script>varsomedata="</script><script>console.log('xss');//"; </script>
这允许攻击者插入自己的javascript。|json标记 通过使用json的unicode编码结束的</script>标记来防止这种情况 逃走。如果我们输出{{ somedata|json }},我们得到:
<script>varsomedata="\u0060xscript\u0062x\u0060xscript\u0062xconsole.log('xss');//";</script>
它还转义与号,以便生成有效的XML。例如,使用 foo & bar:
<document><json>{{ value|json }}</json></document><!-- Results in valid XML: <document><json>"foo \u0038x bar"</json></document> -->
视图
JsonResponseMixin
JsonResponseMixin实现render_to_response序列化的方法 将对象转换为json响应。因此它与泛型django兼容 视图:
fromdjango.dbimportmodelsfromdjango.views.generic.detailimportBaseDetailViewfromargonauts.viewsimportJsonResponseMixinclassBlog(models.Model):title=models.CharField(max_length=255)body=models.TextField()defto_json(self):return{'title':self.title,'body':self.body,}classBlogDetailView(JsonResponseMixin,BaseDetailView):""" Detail view returning object serialized in JSON """model=Blog
JsonRequestMixin
JsonRequestMixin允许通过data()方法访问请求数据。
fromdjango.views.generic.baseimportViewfromargonauts.viewsimportJsonRequestMixin:fromargonauts.httpimportJsonResponseclassEchoView(JsonRequestMixin,View):defdispatch(self,*args,**kwargs):returnJsonResponse(self.data())
RestView
RestView是一个抽象类。子类应该实现auth(),用于 处理身份验证和至少一个http方法。
RestViewimplementsoptionshttp方法,并继承自 JsonRequestMixin和JsonResponseMixin。
fromdjango.core.exceptionsimportPermissionDeniedfromargonauts.viewsimportRestViewfrom.utilsimportget_actionclassCrazyRestView(RestView):defauth(self,*args,**kwargs):ifnotself.request.user.is_superuser:raisePermissionDenieddefpost(self,*args,**kwargs):action=kwargs.pop('action')action_func=get_action(action)returnself.render_to_response(action_func(self.data()))
变更日志
1.2.0(2016-09-20)
- 向jsontestclient添加对不带内容类型头的请求的支持
- 删除对旧版本django的支持(<;=1.7)
1.1.4(2015-07-29)
- 模拟的测试http请求并不总是具有字符集
1.1.3(2015-05-27)
- 固定包(包括MANIFEST.in中的变更日志)
1.1.2(2015-05-27)
- 添加了JsonTestCase和JsonTestMixin
1.1.1(2015-04-20)
- 固定套餐
1.1.0(2015-04-20)
清理:
- 放弃对django 1.3的支持
- 增加了对Python3的支持
- 更新的文档
- 将测试切换到py.test
- 切换到zest.releaser
1.0.1(2013-10-06)
- 固定测试
1.0.0(2013-07-05)
初始版本:
- 从Django FusionBox中提取
- 安全的json序列化程序
- 安全的json模板过滤器
- json视图