十三 Django-重定向机制

一、重定向

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:发送两次请求,地址栏发生改变
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342