把request对象和response对象原理流程写一下

request对象

服务器端接收到http协议的请求,会根据报文信息构建HttpRequest对象

通过第一个参数,把该对象传递给视图函数

Request对象包含了如下的属性:

  • path属性:字符串。表示请求的页面的完整路径。
  • method属性:请求的方法。GET或POST

测试方法:

添加路由 booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
]

添加视图  booktest/views.py

def req(request):
print("path:", request.path)
print("method:", request.method)
return render(request, 'booktest/req.html')

添加模板     在templates/booktest/目录下创建req.html       templates/booktest/req.html

<body>
<a href="/booktest/req">测试GET</a><br/>
<form action="/booktest/req" method="POST">
<input type="submit" value="测试post">
</form>
</body>

settings中把CSRF去掉。 django3/settings.py

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)

访问 http://127.0.0.1:8080/booktest/req 点击GET链接则发送GET请求,点击POST按钮则发送POST请求

GET属性:包含了GET请求的所有参数

templates/booktest/req.html

<a href="/booktest/req?a=1&a=2&b=3">测试GET</a><br/>

booktest/views.py

def req(request):
print("path:", request.path)
print("method:", request.method)
print("GET:", request.GET)
return render(request, 'booktest/req.html')

POST属性:包含post请求方式的所有的参数

COOKIES属性:描述浏览器的cookies信息

templates/booktest/req.html

    <form action="/booktest/req" method="POST">
姓名:<input type="text" name="name"/><br/>
密码:<input type="password" name="password"/><br/>
爱好:<input type="checkbox" name="favor" value="eat">吃饭
<input type="checkbox" name="favor" value="sleep">睡觉
<input type="checkbox" name="favor" value="play">打豆豆<br/>
<input type="submit" value="测试post"/>

</form>

booktest/views.py

def req(request):
print("path:", request.path)
print("method:", request.method)
print("GET:", request.GET)
print("POST:", request.POST)
return render(request, 'booktest/req.html')

FILES属性:描述上传文件的信息

templates/booktest/req.html

<form action="/booktest/req" method="POST" enctype="multipart/form-data">
姓名:<input type="text" name="name"/><br/>
密码:<input type="password" name="password"/><br/>
爱好:<input type="checkbox" name="favor" value="eat">吃饭
<input type="checkbox" name="favor" value="sleep">睡觉
<input type="checkbox" name="favor" value="play">打豆豆<br/>
上传文件:<input type="file" name="file"/><br/>

<input type="submit" value="测试post"/>
</form>

booktest/view.py

def req(request):
print("path:", request.path)
print("method:", request.method)
print("GET:", request.GET)
print("POST:", request.POST)
print("FILES:", request.FILES)
print("COOKIES:", request.COOKIES)
return render(request, 'booktest/req.html')

is_ajax()方法:判断提交的方式是否用ajax来提交。如果用ajax来提交,则返回True;否则返回False

templates/booktest/req.html

<script type="text/javascript">
window.onload = function(){
ajax_test = document.getElementById("ajax_test");
ajax_test.onclick = function(){
// 1 创建XMLHttpRequest()对象
var xmlhttp = new XMLHttpRequest();
// 2 打开服务器
xmlhttp.open('get', '/booktest/req', true);
// 注册请求头
xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
// 4 注册回调函数
xmlhttp.onreadystatechange = function() {
console.log('回调了');
};
// 3 发送请求
xmlhttp.send(null);
};
};
</script>
<input type="button" id="ajax_test" value="测试ajax提交"/>

点击该按钮,即可发送ajax请求。

Response对象

HttpRequest对象是由Django内部核心自动创建的。

HttpResponse对象则是由程序员自己创建的

如果不调用模板,直接返回数据

def index(request):
return HttpResponse('hello')

如果要调用模板,则需要如下步骤:

1 加载模板。通过loader的get_template方法指定一个模板

2 渲染模板。

a 指定一个上下文对象,RequestContext()

b 用模板的render()方法接收上下文对象。作为HttpResponse()的参数

booktest/views.py

from django.http import HttpResponse
from django.template import loader, RequestContext def resp(request):
t1 = loader.get_template('booktest/resp.html')
context = RequestContext(request, {"text":"helloworld"})
return HttpResponse(t1.render(context))

templates/booktest/resp.html

<body>
{{text}}
</body>

上面的代码通过会被封装到一个函数render()中,所以我们一般简写为

from django.shortcuts import render
from django.http import HttpResponse def resp(request):
context = {"text":"helloworld"}
return render(request, "booktest/resp.html", context)

esponse对象有如下属性:

content:表示返回的内容。字符串类型。Body显示的部分(用户看到的浏览器显示的内容)

charset:response采用的编码字符集。字符串类型。如果不指定,默认是utf-8

status_code:状态码。200、404、500、……

content-type:输出的MIME类型。(多媒体。包括文本(text/html) 图片(image/jpg image/png) 音频(audio/mp3) 视频(video/mpeg4))

以上的内容都是通过浏览器输出给客户端的,本身不需要修改。

可以使用专业的抓包工具,比如Fiddler去查看更详细的请求头、响应头等信息。

Response对象有如下方法:

init():实例化HttpResponse对象

write(content):以文件的方式去写

flush():清空并输出缓存

set_cookie(key, value, max_age, expires):设置cookie。其中max_age和expires二者只需要设置一个值。

Django:视图views(二)的更多相关文章

  1. 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】

    此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...

  2. Django基础之视图(views)层、模板层

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

  3. 【Django笔记1】-视图(views)与模板(templates)

    视图(views)与模板(templates) 1,视图(views) ​ 将接收到的数据赋值给模板(渲染),再传递给浏览器.HTML代码可以直接放在views.py(文件名可任意更换),也可以放在t ...

  4. django 中的视图(Views)

    Views Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 然后返回HTTPResponse, http请求中产生两个核心对象: http ...

  5. django 视图模式

    一 视图 FBV --- function based view(基于函数视图) CBV --- class based view(基于类的视图函数) 二 请求方式 get post put/patc ...

  6. django基础之二

    一.什么是架构? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的We ...

  7. 1.2、Django 视图与网址__进阶

    Django 视图与网址进阶 1.1.简单使用: 把我们新定义的app加到settings.py中的INSTALL_APPS中 修改 HelloDjango/HelloDjango/settings. ...

  8. Django视图(一)

    Django视图(一) 一. 概述 作用:视图接受web请求,并相应请求 本质:视图是自定义的一个python中的函数 响应内容:正常视图,重定向视图,错误视图(404,500,400) 响应过程: ...

  9. 第一个Django应用 - 第三部分:Django视图和模板

    一.概述 一个视图就是一个页面,通常提供特定的功能,使用特定的模板.例如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 每篇博客的详细页面:博客的永久链接 基于年的博客页 ...

  10. [diango]理解django视图工作原理

    前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...

随机推荐

  1. OpenCV 学习笔记 06 SIFT使用中出现版权问题error: (-213:The function/feature is not implemented)

    1 错误原因 1.1 报错全部信息: cv2.error: OpenCV(4.0.1) D:\Build\OpenCV\opencv_contrib-4.0.1\modules\xfeatures2d ...

  2. SNFAutoupdater通用自动升级组件V2.0

    1.组件介绍 C/S构的特点是能充分发挥客户端的处理能力,很多工作可以由客户端处理后再提交给服务器,对应的优点就是客户端响应速度快模式客户端以其强大的功能,丰富的表现力受到相当大部分用户的青睐,但是客 ...

  3. php手册总结《类》

    手册页面: http://php.net/manual/zh/language.oop5.basic.php >> 类名 类名可以是任何非 PHP 保留字的合法标签.一个合法类名以字母或下 ...

  4. [svc]linux的ip命令操作接口和路由表

    参考: https://www.tecmint.com/ip-command-examples/ 学会linux的配置ip,配置网关,添加路由等命令 man ip man ip address man ...

  5. C# 创建 读取 更新 XML文件

    public static class XmlHelper { /// <summary> /// 读取节点值 /// </summary> /// <param nam ...

  6. 【Java】接口(interface)VS抽象类

    接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static f ...

  7. 【iCore4 双核心板_ARM】例程十:RTC实时时钟实验——显示时间和日期

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; ; ...

  8. select理解

    https://www.cnblogs.com/skyfsm/p/7079458.html

  9. net use错误原因解决(精辟)(转)

      (1)"发生系统错误 1326. 登录失败: 未知的用户名或错误密码." 在远程机的"控制面板-文件夹选项-查看-简单的文件共享",去掉选取,然后再尝试连接 ...

  10. InstrumentDriver,对iOS自动化测试说 Yes!

    InstrumentDriver 是 Mobile自动化小组最近实现的基于 instrument,针对 iOS 的自动化测试框架,目前支持 java 语言编写测试用例. 研究过iOS自动化测试的同学肯 ...