zoukankan      html  css  js  c++  java
  • JsonResponse对象和QueryDict对象

    JsonResponse对象

    JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)

    from django.http import JsonResponse

    response = JsonResponse({'foo''bar'})
    print(response.content)

    b'{"foo": "bar"}'

    这个类是HttpRespon的子类,它主要和父类的区别在于:

    1. 它的默认Content-Type被设置为:application/json
    2. 第一个参数,data应该是一个字典类型,第二个参数,关键字safe,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple等。默认的safe参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。
    response = JsonResponse([123], safe=False)
    1. json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法。

    2. encoder默认为django.core.serializers.json.DjangoJSONEncoder,用于序列化数据。如果需要使用不同的JSON 编码器类,可以传递encoder参数给构造函数。response = JsonResponse(data, encoder=MyJSONEncoder)

    #如果这样返回,ajax还需要进行json解析
    #views.py
    return HttpResponse(json.dumps({"msg":"ok!"}))

    #index.html
    var data=json.parse(data)
    console.log(data.msg);

    使用HttpResponse对象来响应数据的时候,还可以通过content_type指定格式:

    return HttpResponse(json.dumps(data),content_type="application/json")
    #如果这样返回,两边都不需要进行json的序列化与反序列化,ajax接受的直接是一个对象

    #views.py
    from django.http import JsonResponse
    return JsonResponse({"msg":"ok!"})

    #index.html
    console.log(data.msg);

    QueryDict对象

    在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例。也就是说你可以按本文下面提供的方法操作request.POST和request.GET。

    request.POST或request.GET的QueryDict都是不可变,只读的。如果要修改它,需要使用QueryDict.copy()方法,获取它的一个拷贝,然后在这个拷贝上进行修改操作。

    方法

    QueryDict 实现了Python字典数据类型的所有标准方法,因为它是字典的子类

    与字典数据类型的不同之处:

    QueryDict实例化方法:

    注意:QueryDict的键值是可以重复的!

    QueryDict('a=1&a=2&c=3')
    <QueryDict: {'a': ['1''2'], 'c': ['3']}>

    如果需要实例化可以修改的对象,添加参数mutable=True。

    classmethod QueryDict.fromkeys(iterable, value='', mutable=False, encoding=None)[source]

    循环可迭代对象中的每个元素作为键值,并赋予同样的值(来至value参数)。

    QueryDict.fromkeys(['a''a''b'], value='val')
    <QueryDict: {'a': ['val''val'], 'b': ['val']}>
    QueryDict.update(other_dict)

    追加内容,而不是更新并替换它们。

    q = QueryDict('a=1', mutable=True)
    q.update({'a''2'})
    q.getlist('a')
    ['1''2']
    q['a'# returns the last
    '2'
    QueryDict.items()

    类似dict.items(),如果有重复项目,返回最近的一个,而不是都返回:

    q = QueryDict('a=1&a=2&a=3')
    q.items()
    [('a''3')]
    QueryDict.values()

    类似dict.values(),但是只返回最近的值:

    q = QueryDict('a=1&a=2&a=3')
    q.values()
    ['3']
    QueryDict.copy()[source]

    使用copy.deepcopy()返回QueryDict对象的副本。 此副本是可变的。

    QueryDict.getlist(key, default=None)

    返回键对应的值列表。 如果该键不存在并且未提供默认值,则返回一个空列表。

    QueryDict.setlist(key, list_)[source]

    list_设置给定的键。

    QueryDict.appendlist(key, item)[source]

    将键追加到内部与键相关联的列表中。

    QueryDict.setdefault(key, default=None)[source]

    类似dict.setdefault(),为某个键设置默认值。

    QueryDict.setlistdefault(key, default_list=None)[source]

    类似setdefault(),除了它需要的是一个值的列表而不是单个值。

    QueryDict.lists()

    类似items(),只是它将其中的每个键的值作为列表放在一起。 像这样:

    q = QueryDict('a=1&a=2&a=3')
    q.lists()
    [('a', ['1''2''3'])]
    QueryDict.pop(key)[source]

    返回给定键的值的列表,并从QueryDict中移除该键。 如果键不存在,将引发KeyError。 像这样:

    q = QueryDict('a=1&a=2&a=3', mutable=True)
    q.pop('a')
    ['1''2''3']
    QueryDict.popitem()[source]

    删除QueryDict任意一个键,并返回二值元组,包含键和键的所有值的列表。在一个空的字典上调用时将引发KeyError。 像这样:

    q = QueryDict('a=1&a=2&a=3', mutable=True)
    q.popitem()
    ('a', ['1''2''3'])
    QueryDict.dict()

    将QueryDict转换为Python的字典数据类型,并返回该字典。

    如果出现重复的键,则将所有的值打包成一个列表,最为新字典中键的值。

    q = QueryDict('a=1&a=3&a=5')
    q.dict()
    {'a': [1,3,5,]}
    QueryDict.urlencode(safe=None)[source]

    已url的编码格式返回数据字符串。 像这样:

    q = QueryDict('a=2&b=3&b=5')
    q.urlencode()
    'a=2&b=3&b=5'

    使用safe参数传递不需要编码的字符。 像这样:

    q = QueryDict(mutable=True)
    q['next'] = '/a&b/'
    q.urlencode(safe='/')
    'next=/a%26b/'

    StreamingHttpResponse类

    StreamingHttpResponse类被用来从Django响应一个流式对象到浏览器。如果生成的响应太长或者是占用的内存较大,这么做可能更有效率。 例如,它对于生成大型的CSV文件非常有用。

    StreamingHttpResponse不是HttpResponse的衍生类(子类),因为它实现了完全不同的应用程序接口。但是,除了几个明显不同的地方,两者几乎完全相同。

    `get_object_or_404()`

    get_object_or_404(klass, *args,* *kwargs)[source]

    常用于查询某个对象,找到了则进行下一步处理,如果未找到则给用户返回404页面。

    在后台,Django其实是调用了模型管理器的get()方法,只会返回一个对象。不同的是,如果get()发生异常,会引发Http404异常,从而返回404页面,而不是模型的DoesNotExist异常。

    必需参数

    • klass:要获取的对象的Model类名或者Queryset等;
    • **kwargs:查询的参数,格式应该可以被get()接受。

    范例:

    1.从MyModel中使用主键1来获取对象:

    from django.shortcuts import get_object_or_404

    def my_view(request):
        my_object = get_object_or_404(MyModel, pk=1)

    这个示例等同于:

    from django.http import Http404

    def my_view(request):
        try:
            my_object = MyModel.objects.get(pk=1)
        except MyModel.DoesNotExist:
            raise Http404("No MyModel matches the given query.")

    2.除了传递Model名称,还可以传递一个QuerySet实例:

    queryset = Book.objects.filter(title__startswith='M')
    get_object_or_404(queryset, pk=1)

    上面的示例不够简洁,因为它等同于:

    get_object_or_404(Book, title__startswith='M', pk=1)

    但是如果queryset来自其它地方,它就会很有用了。

    3.还可以使用Manager。 如果你自定义了管理器,这将很有用:

    get_object_or_404(Book.dahl_objects, title='Matilda')

    4.还可以使用related managers:

    author = Author.objects.get(name='Roald Dahl')
    get_object_or_404(author.book_set, title='Matilda')

    与get()一样,如果找到多个对象将引发一个MultipleObjectsReturned异常。

    `get_list_or_404()`

    get_list_or_404(klass, args, *kwargs)[source]

    这其实就是get_object_or_404多值获取版本。

    在后台,返回一个给定模型管理器上filter()的结果,并将结果映射为一个列表,如果结果为空则弹出Http404异常。

    必需参数

    • klass:获取该列表的一个Model、Manager或QuerySet实例。
    • **kwargs:查询的参数,格式应该可以被filter()接受。

    范例:

    下面的示例从MyModel中获取所有发布出来的对象:

    from django.shortcuts import get_list_or_404

    def my_view(request):
        my_objects = get_list_or_404(MyModel, published=True)

    这个示例等同于:

    from django.http import Http404

    def my_view(request):
        my_objects = list(MyModel.objects.filter(published=True))
        if not my_objects:
            raise Http404("No MyModel matches the given query.")
  • 相关阅读:
    使用hibernate实现树形结构无限级分类
    专家看台:盛大架构师周爱民回顾职业历程,分享十项建议
    开始运行命令大全
    rsvp.exe,AdskScSrv.exe ,avp.exe
    Web2.0 编程思想:16条法则
    李嘉诚:性格才是命运的决定因素
    中兴笔试题目
    管理Websphere的10个有用命令
    我的程序语言实践
    20200514:实现分布式Session的过程是怎样的?
  • 原文地址:https://www.cnblogs.com/wby-110/p/13382521.html
Copyright © 2011-2022 走看看