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

image-20220902104327746

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

image-20220902104459549

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

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

return HttpResponse("<h1>JiaRui<h1>",status=403)

image-20220902104734263

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

image-20220902105038966

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

image-20220902105245213

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

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

image-20220902105550967

(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方法变成字符串,括号里的参数可以使字符串里写成中文

image-20220902111012865

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

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

image-20220902111147702

为了方便,上述的操作过程可以用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 ``dict`` objects
      are allowed to be passed due to a security flaw before EcmaScript 5. See
      the ``safe`` parameter for more information.
    :param encoder: Should be a json encoder class. Defaults to
      ``django.core.serializers.json.DjangoJSONEncoder``.
    :param safe: Controls if only ``dict`` objects may be serialized. Defaults
      to ``True``.
    :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}])

image-20220902112127318

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

image-20220902112329944

(3)render

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

参数

  1. request:用于生成响应的请求对象

  2. template_name:要使用的模板的完整名称,可选的参数

  3. context:添加到模板上下文的一个字典,
    默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

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

image-20220902143303341

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

image-20220902143348969

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

image-20220902143436539

(4)redirect重定向

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

通过redirect方法实现重定向。

参数可以是:

  • 一个绝对的或相对的URL, 将原封不动的作为重定向的位置.
  • 一个url的别名: 可以使用reverse来反向解析url

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

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

image-20220902153828026

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

<form action="http://127.0.0.1:8090/JRrequest/auth" method="post">
  用户名<input type="text" name="user">
  密码<input type="password" name="pwd">
  <input type="submit" value="submit">
</form>

image-20220902154146210

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

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函数重定向的时候是没有响应内容的,但是有响应头

image-20220902155945361

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

image-20220902160140126

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

image-20220902172353676

注意

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

path("login",views.login)

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

image-20220902174639656

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

path("login/",views.login)

具体区别就是

image-20220902174856645

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

image-20220902175311600

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

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

APPEND_SLASH = False

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django_响应对象 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • linux使用php-ast方法

    php-ast php-cs-fixer PHP-CS-Fixer 是一个开源工具,它可以强制执行和检测违反 PHP 编码风格的行为。 使用预定义的规则,它可以使您拥有严格的编码风格,该风格由工具强制执行,因此您可以将时间花在更重要的事情上。 安装过程 在github上其实给出了很多种安装方式,我直接下载了php-cs-fixer.phar文件并将其存储在计…

    PHP 2023年4月17日
    00
  • django学习__1

    Django python网络编程回顾 之前我们介绍过web应用程序和http协议,简单了解过web开发的概念。Web应用程序的本质 接收并解析HTTP请求,获取具体的请求信息 处理本次HTTP请求,即完成本次请求的业务逻辑处理 构造并返回处理结果——HTTP响应 import socket server = socket.socket() server.b…

    Python开发 2023年4月2日
    00
  • Django_模型详解

    Django_模型ORM Django中内嵌了ORM框架,不需要直接编写SQL语句进行数据库操作,而是通过定义模型类,操作模型类来完成对数据库中表的增删改查和创建等操作。 O是object,也就类对象的意思。 R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思。 M是mapping,是映射的意思。 映射: 类:sql语句table表 类成…

    2023年4月2日
    00
  • Django_request学习

    Django_request (1)请求方式 这里使用一个接口测试软件postman 可以看到里面有非常多的发起请求的方式,最常用的就是GET和POST请求,但是这些方法无法在网页的url里显示 在学习request参数之前,django框架中首先接到浏览器发来的请求第一站是经过框架自带的wsgi.py文件 “”” WSGI config for djang…

    2023年4月2日
    00
  • phpt文件内容解析

    phpt测试文件说明 phpt文件用于PHP的自动化测试,这是PHP用自己来测试自己的测试数据用例文件。 测试脚本通过执行PHP源码根目录下的run-tests.php,读取phpt文件执行测试。 phpt文件包含 TEST,FILE,EXPECT 等多个段落的文件。在各个段落中,TEST、FILE、EXPECT是基本的段落, 每个测试脚本都必须至少包括这三…

    PHP 2023年4月19日
    00
  • django中间件以及自定义中间件

    middleware 中间件就是在目标和结果之间进行的额外处理过程,在Django中就是request和response之间进行的处理,相对来说实现起来比较简单,但是要注意它是对全局有效的,可以在全局范围内改变输入和输出结果,因此需要谨慎使用,否则不仅会造成难以定位的错误,而且可能会影响整体性能。 中间件有什么用 如果想要修改HttpRequest或者Htt…

    2023年4月2日
    00
  • python模拟股票的数据分析

    股票分析 需求:股票分析 使用tushare包获取某股票的历史行情数据。 输出该股票所有收盘比开盘上涨3%以上的日期。 输出该股票所有开盘比前日收盘跌幅超过2%的日期。 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何? import tushare as ts import pandas…

    2023年4月2日
    00
  • 爬虫学习1——request使用

    爬虫 什么是爬虫: – 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。 爬虫究竟是合法还是违法的? 在法律中是不被禁止 具有违法风险 善意爬虫 恶意爬虫 爬虫带来的风险可以体现在如下2方面:- 爬虫干扰了被访问网站的正常运营- 爬虫抓取了收到法律保护的特定类型的数据或信息 如何在使用编写爬虫的过程中避免进入局子的厄运呢? – 时常的优化自己…

    2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部