• django之HTTPResponse和JsonResponse详解


    HttpResponse对象

    Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase或其子类的对象。而HttpResponse则是HttpResponseBase用得最多的子类。那么接下来就来介绍一下HttpResponse及其子类,HttpResponse对象的属性和HTTPRequest对象的属性不同,HTTPResponse对象的属性是由服务端发送给浏览器的,所以很多属性都是由我们自己设置的。

    常用属性:

    1. content:返回的内容。
    2. status_code:返回的HTTP响应状态码。

    响应头:

    1. Content-Encoding:指定报文主体已经采用的编码方式,注意这个编码方式必须在request的Accept-Encoding中存在,否则客户端将无法解析报文主体。
    2. Content-Length:报文主体的长度。
    3. Transfer-Encoding:  用于指定传输报文主体时使用的编码方式,(传输过程中的编码格式,代理服务器之间)
    4. content_type:返回的数据的MIME类型,默认为text/html。浏览器会根据这个属性,来显示数据。如果是text/html,那么浏览器就会把content属性中的内容按照HTML格式解析,如果text/plain,那么就会显示一个纯文本。常用的Content-Type如下:
      • text/html(默认的,html文件)
      • text/plain(纯文本)
      • text/css(css文件)
      • text/csv  (csv文件)
      • text/javascript(js文件)
      • multipart/form-data(文件提交)
      • application/json(json传输)
      • application/xml(xml文件)
      • application/vnd.ms-excel  (excel文件)

    常用方法:

    1. set_cookie:用来设置cookie信息。后面讲到授权的时候会着重讲到。
    2. delete_cookie:用来删除cookie信息。
    3. writeHttpResponse是一个类似于文件的对象,可以用来写入数据到数据体(content)中,新写入的内容会在原先content之后。
    4. 设置响应头,通过设置字典的方式设置响应头,例如我们可以设置一些csrftoken相关验证信息到响应头:response['X-Access-Token'] = 'xxxx',我们也可以在response生成csv或者Excel文件时,设置相应的响应头来描述生成的文件信息:response['Content-Disposition'] = 'attachment;filename="abc.xls"'

    JsonResponse类:

    如果不使用JsonResponse,只使用HttpResponse,我们想要返回一个json字符串也是可行的,要点有两个:

    1、把content中要返回的内容是由json模块dumps成json字符串

    2、设置content_type为'application/json'

    示例代码如下:

    from django.http import HttpResponse

    def jsonresponse_view(request):
    person = {
    'name': 'xdm',
    'age': 19
    }
    person_str = json.dumps(person)
    response = HttpResponse(person_str , content_type='application/json; charset=utf-8')
    return response

     

    上面原生的方式可以解决返回json字符串的需求,注意使用HTTPResponse时,我们需要把返回的数据先dumps成json字符串。如果我们直接使用JsonResponse方式会更简单,实质上JsonResponse也是继承HttpResponse,其内部处理和上面我们演示的原理相同,也是把content内容先dumps成json字符串,content_type='application/json'这两个规则,此时,在使用时直接返回可以dumps的content数据即可,不需要自己再去做dumps操作。示例代码如下:

    from django.http import JsonResponse

    def jsonresponse_view(request):
    person = {
    'name': 'xdm',
    'age': 19
    }
    response = JsonResponse(person)
    return response

    默认情况下JsonResponse只能对字典进行dumps,如果想要对非字典的数据进行dumps,那么需要给JsonResponse传递一个safe=False参数。示例代码如下:

    from django.http import JsonResponse
    def index(request):
        persons = ['张三','李四','王五']
        return HttpResponse(persons)
    

    以上代码会报错,应该在使用HttpResponse的时候,传入一个safe=False参数,示例代码如下:

      return HttpResponse(persons,safe=False)



  • 相关阅读:
    Selenium的使用
    Redis防护建议
    爬虫文件存储-3:Redis
    爬虫文件存储-2:MongoDB
    爬虫文件存储-1:mysql
    爬虫文件存储:txt文档,json文件,csv文件
    Python MongoDB 教程
    使用Robo 3T 软件管理MongoDB数据库如何执行命令行shell
    使用Scrapy爬取图书网站信息
    解决Scrapy抓取中文网页保存为json文件时中文不显示而是显示unicode的问题
  • 原文地址:https://www.cnblogs.com/limaomao/p/9385176.html
Copyright © 2020-2023  润新知