十三 Django-重定向机制

2019-02-28  本文已影响3人  唯老

一、重定向

1、什么是重定向

服务器向浏览器发送一个302状态码以及一个Location消息头,浏览器收到返回消息会立即向重定向地址发出请求

2、为什么要使用重定向技术

  1. URL重定向技术,我们在网站建设中,时常会遇到需要网页重定向的情况:网站调整(如改变网页目录结构);网页被移到一个新地址;网页扩展名改变这种情况下;,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页 面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等
  2. 我们有些时候我们需要跳转站点外的网站,比如登录,第三方支付,
  3. 当您未登录并请求需要身份验证的URL(如Django管理员)时,Django会将您重定向到登录页面。当您成功登录时,Django会将您重定向到您最初请求的URL

3、重定向原理

image

4、特点

  1. 重定向地址可以是任意地址
  2. 重定向后浏览器的地址会发生变化
  3. 至少两次请求

5、注意

网页中如果有ajax请求不能使用重定向技术,因为重定向是浏览器机制

三、分类

1、临时重定向

302重定向又称之临时重定向或者暂时性转移

我们之前网站的域名是 a.com,现在替换成了 b.com。但是用户并不知道域名改了,所以还是在浏览器里输入 a.com,Web服务器在收到请求后,在响应中包含状态码 302 及 b.com。用户的浏览器在收到响应后,输入栏仍是显示旧网址,但是显示的是 b.com的内容。

2、永久重定向

顾名思义,301永久重定向应该是永久性的。永久重定向告诉浏览器,“您正在寻找的东西不再是这个地址。它现在在这个新的地址,它将再也不会在旧地址。“

永久重定向就像一个商店标志,上面写着:“我们搬家了。我们的新店就在附近。“这个改变是永久性的,所以下次你想去商店时,你会直接去新地址。

注意:永久重定向可能会产生意想不到的后果。在使用永久重定向之前完成本指南或直接跳到“永久重定向是永久性的”部分。

处理重定向时,浏览器的行为类似:当URL返回永久重定向响应时,此响应将被缓存。下次浏览器遇到旧URL时,它会记住重定向并直接请求新地址。

缓存重定向可以节省不必要的请求,从而提供更好,更快的用户体验。

此外,临时和永久重定向之间的区别与搜索引擎优化相关。

3、区别

  1. 临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎
  2. 302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。
  3. 而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。

四、使用

1、HttpResponseRedirect

  1. 说明
    HttpResponseRedirect 参数可以是绝对路径跟相对路径
  2. 示例代码
    def redi1(request):
        # 跳转站内的路径
        return HttpResponseRedirect('/')
        # 跳转站内的路径带参数
        # return HttpResponseRedirect('/user/change/?uid=1')
        #  站外不带参数
        # return HttpResponseRedirect('https://www.baidu.com/')
        #  站外带参数1
        # return HttpResponseRedirect('http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/3/')
        #  站外跳转带参数2
        # return HttpResponseRedirect('https://www.apiopen.top/satinApi?type=1&page=1')
    

2、redirect

  1. 概要
    redirect()函数用于重定向.是HttpResponseRedirect()的简写.,而且还和render在同一个模块下,方便导入,如果不需要使用HttpResponseRedirect构建复杂的返回的话使用这个很方便,因为redirect返回的就是HttpResponseRedirect对象,并且接受的参数有args,*kwargs,所以可以代替HttpResponseRedirect完成很多操作
  2. 函数
    redirect(to, *args, **kwargs)
    
  3. 参数说明
    • to
      1、一个绝对的或相对的URL,将按原样用于重定向位置。
      2、视图名称,可能使用参数:reverse()将用于反向解析名称。
      3、一个模型:模型的get_absolute_url()函数将被调用。
    • *args
      可变参数
    • **kwargs
      关键字参数
  4. 示例代码
    def redi2(request):
        # return redirect('/')
        # return redirect('https://www.apiopen.top/satinApi?type=1&page=2')
        # return redirect('/users/login/')
       # 配合reverse使用
        return redirect(reverse('login'))
    

3、reverse

  1. 说明
    反向解析名称
  2. 函数
     reverse('命名空间:别名',*args ,**kwargs)
    
  3. 参数说明
    • viewname
      1、视图函数的名字
      2、namespace:name
      ​ namespace是应用的命名空间
      ​ name是view视图的别名.
    • args
      元组类型,可变参数传递的值
    • *kwargs
      字典类型,可变参数传递的值
  4. 示例代码
       def redi2(request):
           # return redirect('/')
           # return redirect('https://www.apiopen.top/satinApi?type=1&page=2')
           # return redirect('/users/login/')
          # 配合reverse使用
           return redirect(reverse('login'))
    
  5. 命名空间
    # urls.py
    #在一级路由
    # namespace='user'  命名空间
    include('user_auth.urls', namespace='user') 
    # 二级路由
    url(r'login/', views.login_view, name='login'), 
    #也可以直接使用别名 # 注意不要在一级路由中使用命名空间 
    views.py
    def redi2(request):
        return redirect(reverse('user:login'))
    
  6. 使用别名
    # url.py
     url(r'login/', views.login_view, name='login'),
    # views.py
    def redi2(request):
        return redirect(reverse('login'))
    
  7. 包含参数
    # url.py
    url(r'list/(\d+)/(\d+)/', views.list, name='list'),
    #/list/10/1/
    # views.py
    def redi3(request):
        return redirect(reverse('list', args=(1, 10)))
    # 跳转的视图函数
    def list(request,page,size):
        return HttpResponse(page)
    
  8. 包含关键字参数
    # urls.py
    url(r'list/(?P<uid>\d+)/(?P<username>\d+)', views.list, name='list'),
    # views.py
    def redi3(request):
        return redirect(reverse('list', kwargs={'uid': '10','username':'老王'}))
    # 跳转的视图函数
    def list(request,uid,username):
        print(uid)
        print(username)
        return HttpResponse(username)
    

五、跟render的区别

  1. render:不会发送两次请求,相当于界面刷新,地址栏不会发生改变
  2. redirect:发送两次请求,地址栏发生改变
上一篇下一篇

猜你喜欢

热点阅读