把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. Adobe Photoshop for Mac(图像处理软件)破解版安装

    1.软件简介    Adobe Photoshop(简称 "PS")是 macOS 系统上一款由 Adobe Systems 开发和发行的图像处理软件.Photoshop 主要处理 ...

  2. Swift 弱引用与无主引用

    前言 Swift 提供了两种解决循环引用的方法,弱引用和无主引用. 弱引用和无主引用可以使循环中的一个实例引用另一个实例时不使用强引用. 1.弱引用 对生命周期中会变为 nil 的实例采用弱引用,也就 ...

  3. 让人非常easy误解的TCP拥塞控制算法

    正文 非常多人会觉得一个好的TCP拥塞控制算法会让连接加速,这样的观点是错误的.恰恰相反,全部的拥塞控制算法都是为了TCP能够在贪婪的时候悬崖勒马,大多数时候.拥塞控制是减少了数据发送的速度. 我在本 ...

  4. android用TextView实现跑马灯效果

    今天搞啦很久,其实很简单,就加几个属性就可以啦! 图如下 : 有的说要重写TextView方法,有的说要设置固定长度,但是我没重写也没有设置固定长度也弄出来啦!跑在2.3.3的手机上面.就是不知道其他 ...

  5. python学习之struct模块

    class struct.Struct(format) 返回一个struct对象(结构体,参考C). 该对象可以根据格式化字符串的格式来读写二进制数据. 第一个参数(格式化字符串)可以指定字节的顺序. ...

  6. supervisor详解

    1.什么是supervisor supervisor是用python写的一个进程管理工具,用来启动,重启,关闭进程. 2.supervisor的安装 pip install supervisor 3. ...

  7. 每日英语:Doc, Do I Need A Juice Cleanse?

    Some drink only vegetable juice. Others soak in Epsom salts. It's all in the pursuit of ridding the ...

  8. SDL获得屏幕属性及实现分析

    [时间:2017-05] [状态:Open] [关键词:sdl2,屏幕分辨率,显示区域,多媒体渲染,窗口,sdl2源码分析] 0 引言 本文的主要目标在于使用SDL2获得屏幕相关的属性,比如分辨率.屏 ...

  9. 推荐几个Windows工具软件: Stickies - 桌面贴

    主页: http://www.zhornsoftware.co.uk/stickies/index.html Stickies work like Post-it notes for your PC. ...

  10. 聊聊Python中的生成器和迭代器

    Python中有两个重要的概念,生成器和迭代器,这里详细记录一下. 1. 生成器 什么是生成器呢? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包 ...