Django视图层

1. 视图函数

  • 视图函数,简称视图,是一个简单的Python函数,它接受Web请求并且返回Web响应,本质就是一个函数
  • 视图的参数
    • 一个HTTPResponse实例
    • 通过正则表达式组获取的位置参数
    • 通过正则表达式组获取的关键字参数
  • 在应用目录下默认有views.py文件, 一般视图都定义在此文件中
  • 如果处理功能过多,可将函数定义到不同的py文件中
  • 视图的对象
    • HTTPResponse对象
    • HTTPRequest对象

2. HTTPRequest对象

HTTP应用的信息是通过 请求报文 和 响应报文 传递的,其中 请求报文 由客户端发送,其中包含和许多的信息,而 django 将这些信息封装成了 HttpRequest 对象,该对象由 HttpRequest 类创建。每一个请求都会生成一个 HttpRequest 对象,django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。

2.1 request属性

  1. HTTPRequest.GET
    • 一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象
  2. 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")
  3. HTTPRequest.body
    • 一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
    • 如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
  4. HTTPRequest.path
    • 一个字符串,表示请求的路径组件(不含域名)。
  5. HTTPRequest.method
    • 一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  6. HTTPRequest.encoding
    • 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
    • 属性是可写的,你可以修改它来修改访问表单数据使用的编码。接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
    • 如果知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
  7. HTTPRequest.META
    • 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器
  8. HTTPRequest.FILES
    • 一个类似于字典的对象,包含所有的上传文件信息。
    • FILES 中的每个键为<input type="file" name="" />中的name,值则为对应的数据。
    • FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。
    • filename: 上传文件名,用字符串表示
      content_type: 上传文件的Content Type
      content: 上传文件的原始内容
  9. HTTPRequest.COOKIES
    • 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
  10. HTTPRequest.session
    • 一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
  11. HttpRequest.user(用户认证组件下使用)
    待整理
  12. HttpRequest.path_info
    • 一个字符串,在某些 Web 服务器配置下,主机名后的 URL 部分被分成脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的Web 服务器是什么。使用它代替 path 可以让代码在测试和开发环境中更容易地切换。
  13. request.path 与 request.get_full_path()
  1. ''' 
  2. 请求url:http://127.0.0.1:8000/index.html/23?a=1 
  3. ''' 
  4. request.path :  
  5. request.path结果为:/index.html/23 
  6.  
  7. request.get_full_path() 
  8. request.get_full_path()结果为:/index.html/23?a=1 

2.2 request方法

  1. HttpRequest.get_full_path()
    • 返回 path,如果可以将加上查询字符串。例如:"/music/bands/the_beatles/?print=true"
  2. 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对象

响应对象主要有三种形式:

  • HTTPResponse()
  • render()
  • rendiret()

3.1 HTTPResponse()

HTTPResponse返回响应的字符串,对于HttpRequest请求对象来说,是由django自动创建的,但是,HttpResponse响应对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse响应对象。HttpResponse类在django.http.HttpResponse。render和redirect是在HTTPResponse对象上扩展的常用方法.

3.1 render()

将一个模板页面中的模板语法进行渲染,最终渲染成一个html静态文件作为响应体返回给浏览器

  1. render(request, template_name[, context]) 
  2. ''' 
  3. 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。 
  4. ''' 

参数:
- request: 用于生成响应的请求对象。
- template_name:要使用的模板的完整名称,可选的参数
- context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它
- content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
- status:响应的状态码。默认为200。

3.2 redirect()

参数:

  • 一个模型:将调用模型的get_absolute_url() 函数
  1.  
  2. def my_view(request): 
  3. ... 
  4. object = MyModel.objects.get(...) 
  5. return redirect(object) 
  • 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
  1. def my_view(request): 
  2. ... 
  3. return redirect('some-view-name', foo='bar'
  • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。
  1. # 硬编码URL 
  2. def my_view(request): 
  3. ... 
  4. return redirect('/some/url/'
  1. # 完整URL 
  2. def my_view(request): 
  3. ... 
  4. return redirect('http://example.com/'
  • 默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
  1. def my_view(request): 
  2. ... 
  3. object = MyModel.objects.get(...) 
  4. return redirect(object, permanent=True)   

3.3 render与redirect

render: 只是返回页面内容,但是未发送第二次请求
redirect: 发送了第二次请求,url更新


总结:

  • render返回一个登陆成功后的页面,刷新该页面将恢复到跳转前页面。而redirect则不会
  • 如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。

3.4 301和302以及重定向

  1. 1. 301和302的区别 
  2. - 共同点:  
  3. 301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。 
  4. - 不同点: 
  5. 1. 301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址; 
  6. 2. 302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。SEO302好于301. 
  7.  
  8. 2. 重定向原因: 
  9. 1. 网站调整(如改变网页目录结构); 
  10. 2. 网页被移到一个新地址; 
  11. 3. 网页扩展名改变(如应用需要把.php改成.Html或.shtml)。 
  12. - 这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失; 
  13. - 再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。 
posted @ 2018-07-12 14:32  LexSama  阅读(141)  评论(0编辑  收藏  举报