把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. 第三部分:Android 应用程序接口指南---第三节:应用程序资源---第一章 资源提供

    第1章 资源提供 你应该经常外部化你应用程序代码中的资源,比如图片.字符串等,这样有利于你独立处理这些资源.你也应该根据特定的设备配置提供一些可替代的资源,并且把他们分组保存在指定的路径名下.运行时, ...

  2. 判断一棵二叉树是否为AVL树

    思路:AVL树是高度平衡的二叉搜索树,这里为了清晰说明,分别判断是否为搜索树,是否为平衡树. struct TreeNode { struct TreeNode *left; struct TreeN ...

  3. goldengate–使用filter+@GETENV在线重新初始化指定的table

    goldengate–使用filter+@GETENV在线重新初始化指定的table 转载:http://www.easyora.net/blog/using_filter_getenv_functi ...

  4. redis竞汰数据同步问题解决

    Redis 面试的时候遇到过问Redis是如何解决“竞态条件”的,相关知识点总结一下. 乐观锁 所谓竞态条件,举个例子,一个代表点击数的数值hitcount,每个客户点击一次则+1. 没有事务的时候, ...

  5. Unity读取Excel文件(附源代码)

    今天想弄个Unity读取Excel的功能的,发现网上有许多方法,采用其中一种方法:加入库文件 Excel.dll 和ICSharpCode.SharpZipLib.dll库文件,(还有System.D ...

  6. ELK 性能(4) — 大规模 Elasticsearch 集群性能的最佳实践

    ELK 性能(4) - 大规模 Elasticsearch 集群性能的最佳实践 介绍 集群规模 集群数:6 整体集群规模: 300 Elasticsearch 实例 141 物理服务器 4200 CP ...

  7. rabbitmq启动异常table_attributes_mismatch

    rabbitmq启动异常table_attributes_mismatch 2017年01月09日 16:57:50 growithus 阅读数:18     [root@localhost rabb ...

  8. idea生成类注释和方法注释的正确方法

    系统:Mac OS idea版本:2017.3.1 ---------------- 生成类注释 打开Preferences Editor -> File and Code Templates ...

  9. java二叉树字典查询(qq 928900200)

    This assignment will help you practice and understand better the Binary Tree and Binary Search Tree ...

  10. .NET Memory Allocation Profiling with Visual Studio 2012

    .NET Memory Allocation Profiling with Visual Studio 2012 This post was written by Stephen Toub, a fr ...