django_响应对象

Django_响应对象

响应对象

响应对象有三种形式:
HttpResponse()
render()
Redirect()

(1) HttpResponse()

django服务器接收到客户端发来的请求之后,会将提交上来的数据封装成一个HttpResponse对象传给视图函数。视图函数在处理完相关逻辑之后,也需要一个返回响应给浏览器。而这个响应方式,我们必须通过返回HttpResponseBase或者其他子类的对象。

常用属性:

  1. content:返回内容
  2. status:响应状态码
  3. content_type:返回的数据的MIME类型,默认为 text/html 。浏览器会根据这个属性,来显示数据。如果是 text/html ,那么就会解析这个字符串,如果 text/plain ,那么就会显示一个纯文本
  4. 设置响应头: response[‘X-Access-Token’] = ‘xxxx’ 。
class HttpResponseBase:
"""
    An HTTP response base class with dictionary-accessed headers.

    This class doesn't handle content. It should not be used directly.

    Use the HttpResponse and StreamingHttpResponse subclasses instead.

"""

    status_code = 200

    def __init__(self, content_type=None, status=None, reason=None, charset=None, headers=None):
        self.headers = ResponseHeaders(headers or {})

打开HttpResponseBase类的源码可以看到构造属性中有上述的这些参数,默认status为200

django_响应对象

但是我们也可以自己设置不同的状态码

django_响应对象

同时我们也可以自己设置传输类型

默认的种类是text/html类型的文本,所以再加入某些标签的时候会被认作是html文本

return HttpResponse("JiaRui",status=403)

django_响应对象

显示出来的并不是 <h1>JiaRui</h1>,而是一个一级标题,如果想要得到完整的这个文本内容,需要加一个参数配置 content_type="text/plain"

django_响应对象

同时也可以设置响应头部分,浏览器在自动接收的时候就会默认设置好一些参数

django_响应对象

如果想自定义一些响应头就需要修改一下python代码

res = HttpResponse("JiaRui",content_type="text/plain")
res["regina"] = "my_wife"
return res

django_响应对象

(2)JsonResponse()

用来对象 dump 成 json 字符串,然后返回将 json 字符串封装成 Response 对象返回给浏览器。并且他的 Content-Type 是 application/json

from django.http import JsonResponse
dir = {
        'name':"regina",
        'age': 20
    }
    import json
    return HttpResponse(json.dumps(dir,ensure_ascii=False))
    因为不接受字典,所以先要用dumo方法变成字符串,括号里的参数可以使字符串里写成中文

django_响应对象

返回的确实是一个类似于字典类型的格式,但是如果我们想进一步变的更加条理,就需要把文本类型再改一下

return HttpResponse(json.dumps(dir,ensure_ascii=False),content_type="application.json")

django_响应对象

为了方便,上述的操作过程可以用JsonResponse格式统一替换掉

class JsonResponse(HttpResponse):
"""
    An HTTP response class that consumes data to be serialized to JSON.

    :param data: Data to be dumped into json. By default only  objects
      are allowed to be passed due to a security flaw before EcmaScript 5. See
      the  parameter for more information.

    :param encoder: Should be a json encoder class. Defaults to
      .core.serializers.json.DjangoJSONEncoder.

    :param safe: Controls if only  objects may be serialized. Defaults
      to .

    :param json_dumps_params: A dictionary of kwargs passed to json.dumps().

"""

    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if safe and not isinstance(data, dict):
            raise TypeError(
                'In order to allow non-dict objects to be serialized set the '
                'safe parameter to False.'
            )
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)
dir = {
        'name':"regina",
        'age': 20
    }
    return JsonResponse(dir)

得到的也是同样的效果,但是如果我们想传输一个字典列表的话,这种方法就不适用了

return JsonResponse([ {'name':"regina",'age': 20},{'name':"Jiarui",'age': 22}])

django_响应对象

如果想要得到这种形式的内容,就需要在把默认的safe参数改为false就可以了

django_响应对象

(3)render

render(request, template_name&#xFF0C;[context]&#xFF09;结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

参数

  1. request:用于生成响应的请求对象
  2. template_name:要使用的模板的完整名称,可选的参数
  3. context:添加到模板上下文的一个字典,
    默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

结合运用请求信息里面的知识点,首先在请求头里添加一个自定义的名字

django_响应对象
name = request.META.get("HTTP_NAME")
    return render(request,"regina.html",{'now':name})

django_响应对象

可以看到请求部分name改为了HTTP_NAME这个名字,然后获取它,渲染到我们的模板文件里就好

django_响应对象

(4)redirect重定向

当您使用Django框架构建Python Web应用程序时,您在某些时候必须将用户从一个URL重定向到另一个URL,

通过redirect方法实现重定向。

参数可以是:

  • 一个绝对的或相对的URL, 将原封不动的作为重定向的位置.

  • 一个url的别名: 可以使用reverse来反向解析url

首先我们创建一个登录验证的逻辑,通过路由分发转到一个登录页面

def login(request):
    return render(request,"login.html")

django_响应对象

然后通过这个提交转到一个叫做auth的视图函数进行验证,通过post方式进行提交


  用户名
  密码

django_响应对象

可以看到用户名和密码都打印出来了,这时就可以进行判断以及重定向

def auth(request):
    print(request.POST)
    name = request.POST.get("user")
    pwd = request.POST.get("pwd")
    if name == "zhangjiarui" and pwd == "regina":
        return redirect("/JRrequest/jr")
    else:
        return redirect("/ZJR/login")

auth函数重定向的时候是没有响应内容的,但是有响应头

django_响应对象

当状态码是302时,就说明要发起一个重定向了,并且此时的location代表重定向的路径。

django_响应对象

如果输入错误,想要获取的效果是提示并返回登录页面,添加一个渲染即可

django_响应对象

注意

在我们写路由的时候,往往会有 /的区别

path("login",views.login)

在这里是没有斜杠的,那么在浏览器访问的时候,多一个/一定会报错

django_响应对象

但假如说我们的路由里是带/的,那么无论我们访问浏览器是怎么写的,都不会有问题

path("login/",views.login)

具体区别就是

django_响应对象

如果本身就是带着/访问,那么就是一次访问,状态码是200,但如果访问的时候没有带/,那么将会有两次响应,服务器会帮客户端做一次重定向,补齐url里面的东西然后再进行提交

django_响应对象

首先下方的红框表示我们第一次访问的路径,没有带/,所以进行了第二次的重定向,但最终得到的效果是一样的。

如果想取消这个自动补全功能,在 setting.py里加一句

APPEND_SLASH = False

Original: https://www.cnblogs.com/ivanlee717/p/16650879.html
Author: ivanlee717
Title: django_响应对象

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582565/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 我经常听到人们说磁盘慢,网络很慢,这是从人类感知的角度来表达的。比如,把一个文件拷贝到硬盘上需要几分钟到几十分钟,足够我吃一顿饭;而从网上下载一部电影,有时需要几个小时,我可…

    Linux 2023年5月27日
    096
  • 分区表、文件系统等计算机基础知识

    开机固件 BIOS UEFI 特别老的BIOS不支持GPT分区 目前已取代BIOS 分区表类型 MBR GPT 1.不支持2TB以上的硬盘2.主分区不能超过4个3.可以通过建立扩展…

    Linux 2023年6月7日
    0101
  • linux版powershell中,tab补全,linux外部命令参数名,的模块介绍

    关键字 linux powershell pwsh 补全 complete bash zsh 摘要:linux用户的福音!在linux版powershell中,补全linux外部命…

    Linux 2023年5月27日
    094
  • SpringBoot-JDBC

    SpringBoot-JDBC 8.1 SpringData简介 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都…

    Linux 2023年6月14日
    0100
  • ASP已老,尚能饭否?

    我对ASP的感情,跟大海一样深。我用它实现了第一个动态网页,也用它做了毕业设计,毕业设计的名字是《毕业设计管理系统》(是不是有点绕)。在 PHP 和 ASP.NET、Java 高歌…

    Linux 2023年6月6日
    0110
  • 磁盘相关命令

    一、磁盘分区说明 原理介绍 Linux无论有多少分区,归根结底只有一个根目录,独立且唯一,Linux的每个分区都是用来组成整个文件系统的一部分 Linux使用一种载入处理方式,可以…

    Linux 2023年6月6日
    0117
  • 附028.Kubernetes_v1.20.0高可用部署架构二

    kubeadm介绍 kubeadm概述 kubeadm功能 本方案描述 部署规划 节点规划 初始准备 互信配置 其他准备 集群部署 相关组件包 正式安装 部署高可用组件I Keep…

    Linux 2023年6月13日
    0204
  • [20220811]奇怪的隐式转换问题(12c补充测试).txt

    [20220811]奇怪的隐式转换问题(12c补充测试).txt –//生产系统遇到一个奇怪的隐式转换问题,问题在于没有发生隐式转换,前面已经做了一些分析增加12c下的…

    Linux 2023年6月13日
    081
  • PyTorch介绍-保存和加载模型

    本节我们将会看到如何保存模型状态、加载和运行模型预测 import torch import torchvision.models as models 保存和加载模型权重 PyTo…

    Linux 2023年6月14日
    098
  • 页面国际化

    页面国际化 有的时候,我们的网站会去涉及中英文甚至多语言的切换,这时候我们就需要对页面进行国际化设计了。 6.1 准备工作 在IDEA中统一设置properties的编码格式 6….

    Linux 2023年6月14日
    0108
  • python 练习题:请利用循环依次对list中的每个名字打印出Hello, xxx!

    方法一: python;gutter:true; -<em>- coding: utf-8 -</em>- 请利用循环依次对list中的每个名字打印出Hel…

    Linux 2023年6月8日
    097
  • Redis基础教程

    redis基础教程 1、 string数据结构 a) SET server:name “fido” b) SETNX server:name1″…

    Linux 2023年5月28日
    083
  • linux挂载文件系统

    当使用光驱等硬件设备时,必须将其挂载到系统中,只有这样Linux才能识别。 1、给虚拟机中centos7系统添加一块新的硬盘,添加以后必须重启centos7才能生效 2、在root…

    Linux 2023年5月27日
    0100
  • netstat 命令查看端口状态详解

    转载请注明出处: netstat 可以查看服务器当前端口列表及指定端口的连接状态等; -t : 指明显示TCP端口,t是TCP的首字母。 -u : 指明显示UDP端口,u是UDP的…

    Linux 2023年6月14日
    081
  • 利用Tensorboard可视化模型、数据和训练过程

    在60分钟闪电战中,我们像你展示了如何加载数据,通过为我们定义的 nn.Module的子类的model提供数据,在训练集上训练模型,在测试集上测试模型。为了了解发生了什么,我们在模…

    Linux 2023年6月14日
    0111
  • mycat数据库集群系列之数据库多实例安装

    mycat 数据库集群系列之数据库多实例安装 最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考。本次系列终结大…

    Linux 2023年6月14日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球