跳转到主要内容

Django库,可以将任何东西转换为json

项目描述

安装

  1. 使用pip安装lib

    pip install jsonate

    - OR -

    将"jsonate"目录放在您的python路径中的某个位置

  2. 将"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 (8.9 kB 查看哈希)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面