Django视图(python函数)

1.视图

  • 视图负责接受Web请求HttpRequest进行逻辑处理返回Web响应HttpResponse给请求者
  • 响应可以是一张网页的HTML内容,一个重定向,一个404错误等
  • 视图就是python中的函数
  • 视图一般被定义在“应用/views.py”文件中
  • 视图的第一个参数必须为HttpRequest实例,还可能包含下参数如
  • 通过正则表达式组获得的关键字参数
  • 通过正则表达式组获取的位置参数
  • 视图必须返回一个HttpResponse对象或子对象作为响应

 

 

  • 视图处理过程如下图:


  • 使用视图时需要进行两方面操作,两个操作不分先后
  • 配置URLconf
  • 在“应用/views.py”中定义视图

 

2.URLconf

 

配置

  • 定义urlpatterns列表,存储url()对象,这个名称是固定的
  • urlpatterns中的每个正则表达式在第一次访问它们时被编译,这使得运行很快

 

语法

  • 语法一:包含,一般在自定义应用中创建一个urls.py来定义url
  • 这种语法用于test3/urls.py中,目的是将应用的urls配置到应用内部,数据更清晰并且易于维护

url(正则,include('应用.urls'))

  • 语法二:定义,指定正则和视图的对应关系
  • 在应用内部创建urls.py文件,指定请求地址与视图的对应关系

url(正则,'视图名称')

  • 说明1:正则部分推荐使用r,表示字符串不转义,这样在正则表达式中使用\只写一个就可以
  • 说明2:不能在开始加反斜杠,推荐在结束加反斜杠

正确:index/
正确:index
错误:/index
错误:/index/

获取值

  • 请求的url被看做是一个普通的python字符串,进行匹配时不包括域名、get或post参数
  • 每个捕获的参数都作为一个普通的python字符串传递给视图
  • 如请求地址如下:

http://127.0.0.1:8000/1/?a=10

  • 去除掉域名和参数部分后,只剩下如下部分与正则匹配

/1/

  • 获取值需要在正则表达式中使用小括号,分为两种方式
  • 位置参数
  • 关键字参数
  • 注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式

方式一:位置参数

  • 直接使用小括号,通过位置参数传递给视图
  • 为了提取参数,修改上面的正则表达式如下

url(r'^(\d+)/$',views.show1),

方式二:关键字参数

  • 在正则表达式部分为组命名
  • 修改正则表达式如下
  • 其中?P部分表示为这个参数定义的名称为id,可以是其它名称,起名做到见名知意

url(r'^(?P<id1>\d+)/$',views.show1),

 

3.内置错误视图

  • Django内置处理HTTP错误的视图,主要错误及视图包括
  • 404错误:page not found视图,将请求地址进行url检测后,没有找到匹配的正则表达式
  • 500错误:server error视图,在视图中代码运行报错
  • 400错误:bad request视图,来自客户端的安全方面非法操作
  • 如果想看到错误视图而不是调试信息,需要修改配置/setting.py文件的DEBUG项

DEBUG =False
ALLOWED_HOSTS = ['*', ]

 

4.HttpReqeust对象

  • 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象,这个对象不需要我们创建,直接使用服务器构造好的对象使用就可以
  • 视图的第一个参数必须是HttpRequest对象
  • 在django.http模块中定义了HttpRequest对象的API

 

属性

  • 下面除非特别说明,属性都是只读的
  • path:一个字符串,表示请求的页面的完整路径,不包含域名
  • method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'
  •          在浏览器中给出地址发出请求采用get方式,如超链接
  •          在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求
  • encoding:一个字符串,表示提交的数据的编码方式
  •     如果为None则表示使用浏览器的默认设置,一般为utf-8
  •     这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
  • GET:一个类似于字典的对象,包含get请求方式的所有参数
  • POST:一个类似于字典的对象,包含post请求方式的所有参数
  • FILES:一个类似于字典的对象,包含所有的上传文件
  • COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
  • session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见“状态保持”

Http定义了与服务器交互的不同方法,最基本的方法有4种:GET,POST,PUT,DELETE。URL全称是资源描述符,可以认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,。所以GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。GET方法是通过改写URL的方式实现的。GET的数据利用URL?变量名=变量值的方法传输。可以用来用于传输一些不重要的数据。POST方法用于从客户端向服务器提交数据。使用POST方法时,URL不再被改写。数据位于http请求的主体。



 

 

5、QueryDict对象

  • 定义在django.http.QueryDict
  • HttpRequest对象的属性GET、POST都是QueryDict类型的对象
  • 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

 

方法get():根据键获取值

  • 如果一个键同时拥有多个值将获取最后一个值
  • 如果键不存在则返回None值,可以设置默认值进行后续处理

dict.get('',默认值)
可简写为dict['键']

  • 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值
  • 如果键不存在则返回空列表[],可以设置默认值进行后续处理

dict.getlist('',默认值)

 

5.1GET属性

  • 请求格式:在请求地址结尾使用?,之后以“键=值”的格式拼接,多个键值对之间以&连接
  • 例:网址如下

http://www.xinlang.cn/?a=10&b=20&c=python

  • 其中的请求参数为

a=10&b=20&c=python

  • 分析请求参数,键为'a'、'b'、'c',值为'10'、'20'、'python'
  • 在Django中可以使用HttpRequest对象的GET属性获得get方式请求的参数
  • GET属性返回QueryDict类型的对象,键和值都是字符串类型
  • 键是开发人员在编写代码时确定下来的
  • 值是根据数据生成的

 

5.2POST属性

  • 使用form表单请求时,method方式为post则会发起post方式的请求,需要使用HttpRequest对象的POST属性接收参数,POST属性返回QueryDict类型的对象
  • 问:表单form如何提交参数呢?
  • 答:控件name属性的值作为键,value属性的值为值,构成键值对提交
  • 如果控件没有name属性则不提交
  • 对于checkbox控件,name属性的值相同为一组,被选中的项会被提交,出现一键多值的情况
  • 键是控件name属性的值,是由开发人员编写的
  • 值是用户填写或选择的

 

 

6.HttpResponse对象

  • 视图在接收请求并处理后,必须返回HttpResponse对象或子对象
  • 在django.http模块中定义了HttpResponse对象的API
  • HttpRequest对象由Django创建,HttpResponse对象由开发人员创建

 

属性

  • content:表示返回的内容
  • charset:表示response采用的编码字符集,默认为utf-8
  • status_code:返回的HTTP响应状态码
  • content-type:指定返回数据的的MIME类型,默认为'text/html'

方法

  • init:创建HttpResponse对象后完成返回内容的初始化
  • set_cookie:设置Cookie信息
  • write:向响应体中写数据
  • cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪
  • max_age是一个整数,表示在指定秒数后过期
  • expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期
  • max_age与expires二选一
  • 如果不指定过期时间,则关闭浏览器过期

set_cookie(key, value='',max_age=None, expires=None)

  • delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生

 

调用模板简写函数render

  • 每次调用模板时都要执行加载、上下文、渲染三个步骤,为了简化操作,Django定义了render()函数封装了以上三个步骤的代码,定义在django.shortcuts模块中

 

6.1子类JsonResponse

  • 在浏览器中使用javascript发起ajax请求时,返回json格式的数据,此处以jquery的get()方法为例
  • 类JsonResponse继承自HttpResponse对象,被定义在django.http模块中
  • 接收字典作为参数
  • JsonResponse对象的content-type为‘application/json’

 

  • ajax代码执行过程如下
  • 1.发起请求
  • 2.服务器端视图执行
  • 3.执行回调函数


 

 

6.2子类HttpResponseRedirect

  • 当一个逻辑处理完成后,不需要向客户端呈现数据,而是转回到其它页面,如添加成功、修改成功、删除成功后显示数据列表,而数据的列表视图已经开发完成,此时不需要重新编写列表的代码,而是转到这个视图就可以,此时就需要模拟一个用户请求的效果,从一个视图转到另外一个视图,就称为重定向
  • Django中提供了HttpResponseRedirect对象实现重定向功能,这个类继承自HttpResponse,被定义在django.http模块中,返回的状态码为302

 

重定向简写函数redirect

  • 在django.shortcuts模块中为重定向类提供了简写函数redirect
  • 注:返回首页redirect('/')

 

 

 

7.状态保持

  • 浏览器请求服务器是无状态的。无状态指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议。根本原因是:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。
  • 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
  • 实现状态保持主要有两种方式:
  • 在客户端存储信息使用Cookie
  • 在服务器端存储信息使用Session

 

 

 

7.1Cookie

  • Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息。
  • Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
  • Cookie以键值对的格式进行信息的存储
  • Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问xinlan.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到xinlan.cn写的Cookie信息
  • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器
  • 典型应用:记住用户名,网站的广告推送
  • 说明:点击示例网址,这些广告推送的商品是基于你曾经在淘宝上点击的商品类别等条件筛选出来的,看上去这是在凤凰网上访问淘宝网的Cookie,但是事实不是这样的,一般是采用iframe标签嵌套一个淘宝的广告页面到凤凰网的页面上,所以淘宝的Cookie并没有被凤凰网读取到,而是依然交给淘宝网读取的,可以通过“开发者工具”查看元素

 

 

7.2Session

  • 对于敏感、重要的信息,建议要储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是Session

 

启用Session

  • Django项目默认启用Session
  • 打开配置/settings.py文件,在项MIDDLEWARE_CLASSES中启用Session中间件


  • 禁用Session:将Session中间件删除

 

存储方式

  • 打开配置/settings.py文件,设置SESSION_ENGINE项指定Session数据存储的方式,可以存储在数据库、缓存、Redis等
  • 存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

  • 存储在缓存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快

SESSION_ENGINE='django.contrib.sessions.backends.cache'

  • 混合存储:优先从本机内存中存取,如果没有则从数据库中存取

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

 

 

依赖于Cookie

  • 所有请求者的Session都会存储在服务器中,服务器如何区分请求者和Session数据的对应关系呢?
  • 答:在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sessionid后,会根据这个值找出这个请求者的Session
  • 结果:如果想使用Session,浏览器必须支持Cookie,否则就无法使用Session了
  • 存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置

 

 

对象及方法

  • 通过HttpRequest对象的Session属性进行会话的读写操作
  • 以键值对的格式写会话

request.session['']=

  • 根据键读取值

request.session.get('',默认值)

  • 清除所有会话,在存储中删除值部分

request.session.clear()

  • 清除会话数据,在存储中删除会话的整条数据

request.session.flush()

  • 删除会话中的指定键及值,在存储中只删除某个键及对应的值

del request.session['']

  • 设置会话的超时时间,如果没有指定过期时间则两个星期后过期
  • 如果value是一个整数,会话将在value秒没有活动后过期
  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
  • 如果value为None,那么会话永不过期

request.session.set_expiry(value)

 

 

使用Redis存储Session

  • 会话还支持文件、纯cookie、Memcached、Redis等方式存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非监督学习

非监督学习 1 什么是非监(unsupervised learning)督学习 无监督学习&#xff0c;就是不受监督的学习&#xff0c;一种自由的学习方式。该学习方式不需要先验知识进行指导&#xff0c;而是不断地自我认知&#xff0c;自我巩固&#xff0c;最后进行自我归纳&#xff0c;在机器学…

LeetCode 1250. 检查「好数组」(set / 最大公约数)

文章目录1. 题目2. 解题1. 题目 给你一个正整数数组 nums&#xff0c;你需要从中任选一些子集&#xff0c;然后将子集中每一个数乘以一个 任意整数&#xff0c;并求出他们的和。 假如该和结果为 1&#xff0c;那么原数组就是一个「好数组」&#xff0c;则返回 True&#xff1…

用户画像系统

用户画像系统 1 用户画像概述 1.1 什么是用户画像 用户画像就是对现实世界中用户的数学建模。现实世界的用户通过自己各种各样的行为&#xff0c;浏览购买&#xff0c;或者收藏&#xff0c;等等这些行为会把自己的兴趣爱好等体现在这些行为中&#xff0c;比如喜欢看书就会有…

编程思想:面向对象和面向过程

何谓面向对象&#xff1f;何谓面向过程&#xff1f;对于这编程界的两大思想&#xff0c;一直贯穿在我们学习和工作当中。我们知道面向过程和面向对象&#xff0c;但要让我们讲出来个所以然&#xff0c;又感觉是不知从何说起&#xff0c;最后可能也只会说出一句就是那样啦&#…

LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)

文章目录1. 题目2. 解题1. 题目 你还记得那条风靡全球的贪吃蛇吗&#xff1f; 我们在一个 n*n 的网格上构建了新的迷宫地图&#xff0c;蛇的长度为 2&#xff0c;也就是说它会占去两个单元格。 蛇会从左上角&#xff08;(0, 0) 和 (0, 1)&#xff09;开始移动。 我们用 0 表示…

Django模板(编写html代码

1.模板 用于编写html代码&#xff0c;还可以嵌入模板代码更快更方便的完成页面开发&#xff0c;再通过在视图中渲染模板&#xff0c;将生成最终的html字符串返回给客户端浏览器 模版致力于表达外观&#xff0c;一个视图可以使用任意一个模板&#xff0c;一个模板可以供多个视图…

用户画像之Spark ML实现

用户画像之Spark ML实现 1 Spark ML简单介绍 Spark ML是面向DataFrame编程的。Spark的核心开发是基于RDD&#xff08;弹性分布式数据集&#xff09;&#xff0c;但是RDD&#xff0c;但是RDD的处理并不是非常灵活&#xff0c;如果要做一些结构化的处理&#xff0c;将RDD转换成…

[Kaggle] Digit Recognizer 手写数字识别(神经网络)

文章目录1. baseline2. 改进2.1 增加训练时间2.2 更改网络结构Digit Recognizer 练习地址 相关博文&#xff1a; [Hands On ML] 3. 分类&#xff08;MNIST手写数字预测&#xff09; [Kaggle] Digit Recognizer 手写数字识别 1. baseline 导入包 import tensorflow as tf fr…

逻辑回归原理

逻辑回归原理 1 逻辑回归简介 logistic回归&#xff08;LR&#xff09;&#xff0c;是一种广义的线性回归分析模型&#xff0c;常用于数据挖掘&#xff0c;疾病预测&#xff0c;经济预测等方面。 优点&#xff1a;计算代价低&#xff0c;思路清晰易于理解和实现&#xff1b;…

LeetCode 956. 最高的广告牌(DP)

文章目录1. 题目2. 解题1. 题目 你正在安装一个广告牌&#xff0c;并希望它高度最大。 这块广告牌将有两个钢制支架&#xff0c;两边各一个。每个钢支架的高度必须相等。 你有一堆可以焊接在一起的钢筋 rods。 举个例子&#xff0c;如果钢筋的长度为 1、2 和 3&#xff0c;则…

Tensorflow线程队列与IO操作

目录 Tensorflow线程队列与IO操作 1 线程和队列 1.1 前言 1.2 队列 1.3 队列管理器 1.4 线程协调器 2 文件读取 2.1 流程 2.2 文件读取API&#xff1a; 3 图像读取 3.1 图像读取基本知识 3.2 图像基本操作 3.3 图像读取API 3.4 图片批处理流程 3.5 读取图片案例 …

LeetCode 1298. 你能从盒子里获得的最大糖果数(BFS)

文章目录1. 题目2. 解题1. 题目 给你 n 个盒子&#xff0c;每个盒子的格式为 [status, candies, keys, containedBoxes] &#xff0c;其中&#xff1a; - 状态字 status[i]&#xff1a;整数&#xff0c;如果 box[i] 是开的&#xff0c;那么是 1 &#xff0c;否则是 0 。 - 糖…

给javascript初学者的24条最佳实践

1.使用 代替 JavaScript 使用2种不同的等值运算符&#xff1a;|! 和 |!&#xff0c;在比较操作中使用前者是最佳实践。 “如果两边的操作数具有相同的类型和值&#xff0c;返回true&#xff0c;!返回false。”——JavaScript&#xff1a;语言精粹 然而&#xff0c;当使用和&a…

LeetCode 1614. 括号的最大嵌套深度

文章目录1. 题目2. 解题1. 题目 如果字符串满足一下条件之一&#xff0c;则可以称之为 有效括号字符串&#xff08;valid parentheses string&#xff0c;可以简写为 VPS&#xff09;&#xff1a; 字符串是一个空字符串 ""&#xff0c;或者是一个不为 "("…

[AngularJS]Chapter 1 AnjularJS简介

创建一个完美的Web应用程序是很令人激动的&#xff0c;但是构建这样应用的复杂度也是不可思议的。我们Angular团队的目标就是去减轻构建这样AJAX应用的复杂度。在谷歌我们经历过各种复杂的应用创建工作比如&#xff1a;GMail、Map和日历。我们认为我们有必要把这些经验总结下来…

LeetCode 1615. 最大网络秩(出入度)

文章目录1. 题目2. 解题1. 题目 n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。 每个 roads[i] [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。 两座不同城市构成的 城市对 的 网络秩 定义为&#xff1a;与这两座城市 直接 相连的道路总数。如果…

使用JSLint提高JS代码质量

随着富 Web 前端应用的出现&#xff0c;开发人员不得不重新审视并重视 JavaScript 语言的能力和使用&#xff0c;抛弃过去那种只靠“复制 / 粘贴”常用脚本完成简单前端任务的模式。JavaScript 语言本身是一种弱类型脚本语言&#xff0c;具有相对于 C 或 Java 语言更为松散的限…

Django工具:Git简介与基本操作

1.Git简介&#xff1a; 1.Git是目前世界上最先进的分布式版本控制系统 网址&#xff1a;http://github.com 2.总结git的两大特点&#xff1a; 版本控制&#xff1a;可以解决多人同时开发的代码问题&#xff0c;也可以解决找回历史代码的问题 分布式&#xff1a;Git是分布式…

LeetCode 1616. 分割两个字符串得到回文串

文章目录1. 题目2. 解题1. 题目 给你两个字符串 a 和 b &#xff0c;它们长度相同。 请你选择一个下标&#xff0c;将两个字符串都在 相同的下标 分割开。 由 a 可以得到两个字符串&#xff1a; aprefix 和 asuffix &#xff0c;满足 a aprefix asuffix &#xff0c;同理&am…

Kafka基础

Kafka基础 1 消息队列 1.1 什么是消息队列 消息队列&#xff08;MQ&#xff09;&#xff1a;消息队列&#xff0c;保存消息的队列。消息的传输过程中的容器&#xff1b;主要提供生产、消费接口供外部调用做数据的存储和获取。 1.2 为什么要有消息队列 当网站面对教大的流量…