1. 视图函数
- 视图函数,简称视图,是一个简单的Python函数,它接受Web请求而且返回Web响应,本质就是一个函数
- 视图的参数
- 一个HTTPResponse实例
- 经过正则表达式组获取的位置参数
- 经过正则表达式组获取的关键字参数
- 在应用目录下默认有views.py文件, 通常视图都定义在此文件中
- 若是处理功能过多,可将函数定义到不一样的py文件中
- 视图的对象
- HTTPResponse对象
- HTTPRequest对象
2. HTTPRequest对象
HTTP应用的信息是经过 请求报文 和 响应报文 传递的,其中 请求报文 由客户端发送,其中包含和许多的信息,而 django 将这些信息封装成了 HttpRequest 对象,该对象由 HttpRequest 类建立。每个请求都会生成一个 HttpRequest 对象,django会将这个对象自动传递给响应的视图函数,通常视图函数约定俗成地使用 request 参数承接这个对象。php
2.1 request属性
- HTTPRequest.GET
- 一个相似于字典的对象,包含 HTTP GET 的全部参数。详情请参考 QueryDict 对象
- HTTPRequest.POST
- 一个相似于字典的对象,若是请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
- POST 请求能够带有空的 POST 字典 —— 若是经过 HTTP POST 方法发送一个表单,可是表单中没有任何的数据,QueryDict 对象依然会被建立。所以,不该该使用 if request.POST 来检查使用的是不是POST 方法;应该使用 if request.method == "POST"
- 若是使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
- 键值对的值是多个的时候,好比checkbox类型的input标签,select标签,须要用:request.POST.getlist("hobby")
- HTTPRequest.body
- 一个字符串,表明请求报文的主体。在处理非 HTTP 形式的报文时很是有用,例如:二进制图片、XML,Json等。
- 若是要处理表单数据的时候,推荐仍是使用 HttpRequest.POST 。
- HTTPRequest.path
- HTTPRequest.method
- 一个字符串,表示请求使用的HTTP 方法。必须使用大写。
- HTTPRequest.encoding
- 一个字符串,表示提交的数据的编码方式(若是为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
- 属性是可写的,你能够修改它来修改访问表单数据使用的编码。接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
- 若是知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
- HTTPRequest.META
- 一个标准的Python 字典,包含全部的HTTP 首部。具体的头部信息取决于客户端和服务器
- HTTPRequest.FILES
- 一个相似于字典的对象,包含全部的上传文件信息。
- FILES 中的每一个键为
<input type="file" name="" />
中的name,值则为对应的数据。
- FILES 只有在请求的方法为POST 且提交的
<form>
带有enctype="multipart/form-data" 的状况下才会包含数据。不然,FILES 将为一个空的相似于字典的对象。
- filename: 上传文件名,用字符串表示
content_type: 上传文件的Content Type
content: 上传文件的原始内容
- HTTPRequest.COOKIES
- 一个标准的Python 字典,包含全部的cookie。键和值都为字符串。
- HTTPRequest.session
- 一个既可读又可写的相似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
- HttpRequest.user(用户认证组件下使用)
待整理
- HttpRequest.path_info
- 一个字符串,在某些 Web 服务器配置下,主机名后的 URL 部分被分红脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的Web 服务器是什么。使用它代替 path 可让代码在测试和开发环境中更容易地切换。
- request.path 与 request.get_full_path()
- '''
- 请求url:http://127.0.0.1:8000/index.html/23?a=1
- '''
- request.path :
- request.path结果为:/index.html/23
-
- request.get_full_path()
- request.get_full_path()结果为:/index.html/23?a=1
2.2 request方法
- HttpRequest.get_full_path()
- 返回 path,若是能够将加上查询字符串。例如:"/music/bands/the_beatles/?print=true"
- HttpRequest.is_ajax()
- 若是请求是经过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是不是字符串'XMLHttpRequest'。
- 大部分现代的 JavaScript 库都会发送这个头部。若是你编写本身的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 能够工做。
- 若是一个响应须要根据请求是不是经过AJAX 发起的,而且你正在使用某种形式的缓存例如Django 的 cache middleware,你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应可以正确地缓存。
3. HTTPResponse对象
响应对象主要有三种形式:html
- HTTPResponse()
- render()
- rendiret()
3.1 HTTPResponse()
HTTPResponse返回响应的字符串,对于HttpRequest请求对象来讲,是由django自动建立的,可是,HttpResponse响应对象就必须咱们本身建立。每一个view请求处理方法必须返回一个HttpResponse响应对象。HttpResponse类在django.http.HttpResponse。render和redirect是在HTTPResponse对象上扩展的经常使用方法.python
3.1 render()
将一个模板页面中的模板语法进行渲染,最终渲染成一个html静态文件做为响应体返回给浏览器ajax
- render(request, template_name[, context])
- '''
- 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
- '''
参数:
- request: 用于生成响应的请求对象。
- template_name:要使用的模板的完整名称,可选的参数
- context:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它
- content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
- status:响应的状态码。默认为200。正则表达式
3.2 redirect()
参数:数据库
- 一个模型:将调用模型的get_absolute_url() 函数
-
- def my_view(request):
- ...
- object = MyModel.objects.get(...)
- return redirect(object)
- 一个视图,能够带有参数:将使用urlresolvers.reverse 来反向解析名称
- def my_view(request):
- ...
- return redirect('some-view-name', foo='bar')
- 一个绝对的或相对的URL,将原封不动的做为重定向的位置。
-
- def my_view(request):
- ...
- return redirect('/some/url/')
-
- def my_view(request):
- ...
- return redirect('http://example.com/')
- 默认返回一个临时的重定向;传递permanent=True 能够返回一个永久的重定向。
- def my_view(request):
- ...
- object = MyModel.objects.get(...)
- return redirect(object, permanent=True)
3.3 render与redirect
render: 只是返回页面内容,可是未发送第二次请求
redirect: 发送了第二次请求,url更新
django
总结:
- render返回一个登录成功后的页面,刷新该页面将恢复到跳转前页面。而redirect则不会
- 若是页面须要模板语言渲染,须要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登录成功页面,不会通过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登录成功后,会在url路由系统进行匹配,若是有存在的映射函数,就会执行对应的映射函数。
3.4 301和302以及重定向
- 1. 301和302的区别
- - 共同点:
- 301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址能够从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另外一个地址B)——这是它们的共同点。
- - 不一样点:
- 1. 301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向以后的网址;
- 2. 302表示旧地址A的资源还在(仍然能够访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。SEO302好于301.
-
- 2. 重定向缘由:
- 1. 网站调整(如改变网页目录结构);
- 2. 网页被移到一个新地址;
- 3. 网页扩展名改变(如应用须要把.php改为.Html或.shtml)。
- - 这种状况下,若是不作重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户获得一个404页面错误信息,访问流量白白丧失;
- - 再者某些注册了多个域名的网站,也须要经过重定向让访问这些域名的用户自动跳转到主站点等。