Django 视图层
视图:视图函数/一个简单的Python函数,接受Web请求并返回Web响应;
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect import datetime
#视图函数 def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
一 HttpRequest对象
request常用属性
(1)GET
HttpRequest.GET #包含 HTTP GET 的所有参数。<QueryDict: {'a': ['1'], 'b': ['2']}>
(2)POST
HttpRequest.POST #求中包含表单数据,QueryDict: {'a': ['1'], 'b': ['2']}>
(3)body
HttpRequest.body #代表请求报文的主体
(4)path
HttpRequest.path #获取请求路径 (不含域名) 如 '/music/bands/'
(5)method
HttpRequest.method #返回请求方式
(6)encoding
HttpRequest.encoding #表示数据提交的编码方式
(7)META

HttpRequest.META #请求头信息,包含http首部 CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。 CONTENT_TYPE —— 请求的正文的MIME 类型。 HTTP_ACCEPT —— 响应可接收的Content-Type。 HTTP_ACCEPT_ENCODING —— 响应可接收的编码。 HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。 HTTP_HOST —— 客服端发送的HTTP Host 头部。 HTTP_REFERER —— Referring 页面。 HTTP_USER_AGENT —— 客户端的user-agent 字符串。 QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。 REMOTE_ADDR —— 客户端的IP 地址。 REMOTE_HOST —— 客户端的主机名。 REMOTE_USER —— 服务器认证后的用户。 REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。 SERVER_NAME —— 服务器的主机名。 SERVER_PORT —— 服务器的端口(是一个字符串)。
(8)FILES
HttpRequest.FILES #包含所有的上传文件信息。
(9)COOKIES
HttpRequest.COOKIES #包含所有的cookie。键和值都为字符串。
(10)session
HttpRequest.session #一个既可读又可写的类似于字典的对象,表示当前的会话。
(11)user

HttpRequest.use 一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。 如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。 例如: if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。 ------------------------------------------------------------------------------------- 匿名用户 class models.AnonymousUser django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点: id 永远为None。 username 永远为空字符串。 get_username() 永远返回空字符串。 is_staff 和 is_superuser 永远为False。 is_active 永远为 False。 groups 和 user_permissions 永远为空。 is_anonymous() 返回True 而不是False。 is_authenticated() 返回False 而不是True。 set_password()、check_password()、save() 和delete() 引发 NotImplementedError。 New in Django 1.8: 新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。r
request常用方法
(1)get_full_path()
HttpRequest.get_full_path() #返回路径+数据 例如:"/music/bands/the_beatles/?print=true&ask=1"
(2)is_ajax()
HttpRequest.is_ajax() 判断是否是ajax请求

如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'。 大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。 如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware, 你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。
三 HttpResponse对象
响应三剑客:
- HttpResponse() 传送字符串
- render() 传送html,模板语法
- redirect() 重定向
1 HttpResponse( )
HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单. 如:HttpResponse('ok')
2 render()
render(request, template_name,{key :value})
第一个参数:用于生成响应的请求对象
第二个参数:模板文件,使用模板的完整名字(包括后缀名)
第三个参数:模板语法,给模板传递数据
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
(******)render执行流程
1 找文件,读取文件 2 遇到模板语法就获取数据,并渲染数据; 3 交给浏览器渲染页面
3 redirect()
redirect('路径')
(****执行流程)
key :两次请求
1 浏览器发起一次请求 ,执行到redirect 重定向; 2 服务器发送一个响应,其中的状态码是301或者302,响应头包含location:指定路径; 3 浏览器获得响应后,获取到location的值,即指定路径,把该路径作为请求路径,发起第二次请求. 4 服务器接到请求,请响应信息发送给浏览器.

301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取
(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301

1)网站调整(如改变网页目录结构); (2)网页被移到一个新地址; (3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。 这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的 网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。