Django-视图层

Django-视图层

视图函数

    一个视图函数,简称视图,是一个简单的Python函数,它接受Web请求而且返回Web响应。响应能够是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片...任何东西均可以。不管视图自己包含什么逻辑,都要返回响应。php

    代码写在哪里也无所谓,只要它在你的Python目录下面。约定将视图放置在项目或应用程序目录中的名为views.py的文件中html

from django.shortcuts import render, HttpResponse, 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
  • 每一个视图函数都负责返回一个HttpResponse对象
  • 视图函数的名称并不重要,不须要用一个统一的命名方式来命名,以便让Django识别它。咱们将其命名为current_datetime,是由于这个名称可以精确地反映出它的功能

    视图层,熟练掌握两个对象便可:请求对象(HttpRequest)和响应对象(HttpResponse)ajax

HttpRequest对象

request属性

1. request.method

    一个字符串,表示HTTP请求方式:GET/POST

2. request.path

    一个字符串,表示请求路径(不含域名),例如:"/music/bands/the_beatles/"

3. request.GET

    一个相似于字典的对象,包含HTTP GET的全部参数,详情参考QueryDict对象

4. request.POST

    一个相似于字典的对象,若是请求中包含表单数据,刚将这些数据封装成QueryDict对象
POST请求能够带有空的POST字典:若是经过HTTP POST方法发送一个表单,可是表单没有任何数据,QueryDict对象依然会被建立。所以,不该该使用if request.POST 来检查使用的是不是POST方法;应该使用
if request.method == 'POST'
另外:若是使用POST上传文件的话,文件信息将包含在FILES属性中

获取request.GET/request.POST内容:
1) 若是 print(request.POST) # <QueryDict: {"user": ["ethan"], "pwd": ["123"]}>
user = request.POST.get("user") # ethan
pwd = request.POST.get("pwd") # 123

2)若是 print(requst.POST) # <QueryDict: {"user": ["ethan", "linda"], "pwd": ["123"]}>
user = request.POST.get("user") # linda 取最后一个

3)键值对的值是多个时,须要用 request.POST.getlist()

5. request.body 一个字符串,表明请求报文的主体(请求体原生数据,例如:b"user=Ethan&pwd=123")。在处理非HTTP形式的报文时很是有用,例如:二进制图片、XML、Json等。 可是,若是要处理表单数据时,推荐仍是使用request.POST 6. request.META 一个标准的Python字典,包含全部的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 —— 服务器的端口(是一个字符串)。   从上面能够看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 以外,请求中的任何 HTTP 首部转换为 META 的键时, 都会将全部字母大写并将链接符替换为下划线最后加上 HTTP_ 前缀。 因此,一个叫作 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。

request经常使用方法

1. request.get_full_path()

    返回完整path,例如:"/music/bands/the_beatles/?print=true"

2. request.is_ajax()

    返回True/False
    若是请求是经过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()
  • redirect()

    HttpResponse()括号内直接跟一个具体的字符串做为响应体。django

render()

    结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象浏览器

render(request, template_name[, context)

    参数:缓存

  • request:用于生成响应的请求对象
  • template_name:要使用的模板的完整名称,可选的参数
  • context:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它

    render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面做为响应服务器

redirect()

    特色: 两次请求ide

    传递要重定向的一个硬编码的URL函数

def my_view(request):
    ...
    return redirect("/some/url/")

    也能够是一个完整的URL

def my_view(request):
    ...
    return redirect("http://example.com/")
1)301和302的区别。

  301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址能够从响应的Location首部中获取
  (用户看到的效果就是他输入的地址A瞬间变成了另外一个地址B)——这是它们的共同点。

  他们的不一样在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向以后的网址;

  302表示旧地址A的资源还在(仍然能够访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301


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