Django库,可以将任何东西转换为json
项目描述
安装
-
使用pip安装lib
pip install jsonate
- OR -
将"jsonate"目录放在您的python路径中的某个位置
-
将"jsonate"添加到您的
INSTALLED_APPS
(在settings.py文件中)
用法
在模板中
{% load jsonate_tags %}
{{ anything|jsonate }}
这对于在数据属性中嵌入数据以便与jQuery等JavaScript库一起使用特别有用(注意jsonate-attr与jsonate|escape相同)
<div id="user-widget" data-user="{{ user|jsonate_attr }}"></div>
<script>
...
user_data = $("#user-widget").data('user');
...
</script>
或直接在javascript中使用...
<script>
var user_data = {{ user|jsonate }};
</script>
在Python中
from jsonate import jsonate
# querysets
json = jsonate(User.objects.all())
# values
json = jsonate(User.objects.values())
# model instances
json = jsonate(User.objects.get(email="my_email@gmail.com"))
Jsonate将日期时间转换为iso格式,以便在javascript中轻松解析
# formatted response for ease of reading...
>>> print jsonate(User.objects.all()[0])
{
"username": "asdfasdf",
"first_name": "asdf",
"last_name": "asdf",
"is_active": false,
"email": "asdf@example.com",
"is_superuser": false,
"is_staff": false,
"last_login": "2011-08-22T19:14:50.603531",
"id": 5,
"date_joined": "2011-08-22T19:14:50.220049"
}
字段 / 排除 -- 序列化选项
您可以在模型的元选项中指定哪些字段应该被序列化。这会影响模型实例和查询集的序列化,就像Admin一样!
示例
from django.db import models
class MyModel(models.Model):
normal_info = models.CharField(max_length=10)
sensitive_info = models.CharField(max_length=10)
class Meta:
jsonate_exclude = ('sensitive_info',)
# this would also work:
# jsonate_fields = ('normal_info',)
默认情况下,在django.contrib.auth.models
中的User模型在序列化查询集或实例时会被猴子补丁以排除密码字段
如果您想根据每个案例指定要序列化的字段,请使用values()
代替。例如:
>>> jsonate(User.objects.values("username", "password"))
... '[{"username": "someuser", "password": "sha1$f26b2$d03a6123487fce20aabcdef0987654321abcdef0"}]'
注意:这显然不是一个真正的密码或盐:)
您还可以在您的模型上指定一个to_json()
方法,以更紧密地控制序列化。
当Jsonate序列化一个对象时,如果找到了to_json()
方法,它将始终使用该方法。该方法可以返回Jsonate可以序列化的任何对象(注意避免无限循环)。
示例
import time
from django.db import models
class MyModel(models.Model):
normal_info = models.CharField(max_length=10)
sensitive_info = models.CharField(max_length=10)
def to_json(self):
return {"normal_info": self.normal_info, "serialized_at": time.time()}
…
from jsonate import jsonate
my_model = MyModel(
normal_info="hi mom",
sensitive_info="My Social Security number is: ###-##-####"
)
jsonate(my_model)
# {"normal_info": "hi mom", "serialized_at": 1345233658.29246}
JsonateField
JsonateField类似于非常受欢迎的JSONField项目中的简单JSONField。唯一的区别是JsonateField使用Jsonate JSON序列化器,这使得它比其他JSONField实现更健壮。
示例
from django.db import models
from jsonate.fields import JsonateField
class Customer(models.Model):
extra_data = JsonateField(blank=True, null=True)
…
customer = Customer()
customer.extra_data = {
"height": 65,
"weight": 115,
}
customer.save()
不要问我为什么你会在意客户的身高和体重。
在表单中
如果您想验证Json输入,有一个验证器
from django import forms
from jsonate.form_fields import JsonateValidator
class MyForm(forms.Form):
json_input = forms.CharField(validators=[JsonateValidator])
...但是您可能应该直接使用JsonateFormField(它使用验证器)
from django import forms
from jsonate.form_fields import JsonateFormField
class MyForm(forms.Form):
json_input = JsonateFormField()
在管理界面中
如果您在模型中使用JsonateField,您可能希望输入在管理界面中得到验证(使用JsonateFormField)
from django.contrib import admin
from myapp.models import MyModel
# Add this to your imports:
from jsonate.fields import JsonateField
from jsonate.form_fields import JsonateFormField
class MyModelAdmin(admin.ModelAdmin):
# Add this to your ModelAdmin:
formfield_overrides = {
JsonateField: {'form_class': JsonateFormField }
}
JsonateResponse
JsonateResponse
是HttpResponse的子类,几乎以完全相同的方式工作,除了它接受任何对象作为其数据,而不是仅接受字符串。它返回结果json作为“application/json”媒体类型。
示例
from jsonate.http import JsonateResponse
def my_view(request):
...
return JsonateResponse(request.user)
# response contains:
{"username": "asdfasdf", "first_name": "asdf", "last_name": "asdf", "is_active": false, "email": "asdf@example.com", "is_superuser": false, "is_staff": false, "last_login": "2011-08-22T19:14:50.603531", "id": 5, "date_joined": "2011-08-22T19:14:50.220049"}
装饰器
JsonateResponse
非常棒,但生活可以变得更加简单!受django-annoying中的ajax_request装饰器的启发,@jsonate_request
装饰器将尝试序列化视图返回的任何内容(通过JsonateResponse),并以“application/json”媒体类型返回HttpResponse。
它不会尝试序列化HttpResponse。
示例
@jsonate_request
def my_view(request):
form = MyForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect("/some/path/")
else:
return form.errors
在有效的输入下,重定向HTTPResponse将直接通过,不被修改。
如果有表单错误,响应将返回类似以下内容
{
"username": [
"This username is already taken"
],
"email": [
"Please enter a valid email."
]
}
项目详情
jsonate-0.7.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9fc3f4b57f26b3f614485e214e81ab4e04ef71c817d149291de42f8ff79dac8e |
|
MD5 | 744ff208608467f8d974ea39d65036ae |
|
BLAKE2b-256 | c5c0a0903d8e6dc8ef49eb39dbb2a7e99b92e9bcd3914743b8a40086c5b41623 |