把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. Mac Apache WebDav 服务器配置

    1.WebDav 服务器 基于 http 协议的 "文件" 服务器. 实现文件的上传/下载/修改/删除. WebDav 权限 授权信息的格式 BASIC (用户名:口令)base6 ...

  2. 如何永久删除git仓库中敏感文件的提交记录

    如何永久删除git仓库中敏感文件的提交记录 参考: 1. https://help.github.com/articles/remove-sensitive-data/

  3. curl 伪装来路(referer)

    curl -e http://vip.hihi.com http://test.image.ok.com/parcel/201704/1491035345125_971038.jpg 1xx.8x.3 ...

  4. 对ThreadLocal实现原理的一点思考

    前言 在<透彻理解Spring事务设计思想之手写实现>中,已经向大家揭示了Spring就是利用ThreadLocal来实现一个线程中的Connection是同一个,从而保证了事务.本篇博客 ...

  5. zookeeper频繁异常问题分析

    Reference: https://blog.csdn.net/xjping0794/article/details/77784171 1.1            操作系统信息1.1.1      ...

  6. 5. BERT算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

  7. 模仿Semaphore自定义自己的 信号量

    简介 这里模仿Semaphore,自定义自己的信号量,利用AQS共享模式 1.MySemaphore.java package com.jacky; import java.util.concurre ...

  8. 嵌入式开发之hi3519---PCIE DMA

    http://blog.csdn.net/abcamus/article/details/76167747 大话pcie dma http://blog.csdn.net/qingfengtsing/ ...

  9. MTK 自定义按键添加广播

    一.给自定义按键添加广播 修改PhoneWindowManager.java中的interceptKeyBeforeDispatching方法 /frameworks/base/policy/src/ ...

  10. [Node.js] 00 - Where do we put Node.js

    Ref: 前后端分离的思考与实践(五篇软文) 其实就是在吹淘宝自己的Midway-ModelProxy架构. 第一篇 起因 为了提升开发效率,前后端分离的需求越来越被重视, 同一份数据接口,我们可以定 ...