广州番禺Python, Java小班周末班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6
3.5.1 理解重定向
所谓重定向,是指将客户端请求重新定位到其它位置。为什么需要重新定位呢?因为资源在服务器的路径发生了变动,如果继续使用之前的请求路径,会找不到该资源。
HTTP协议中的重定向是指URL的重定向,当请求的资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,需要通过重定向的技术来重新访问。
HTTP协议中的重定向类型主要分为临时重定向与永久重定向,各自对应不同的HTTP状态码。临时重定向,顾名思义,指的是站点资源临时地迁移到新url,下表为常用的临时重定向状态码:
临时重定向 | 描述
|
302 | 对于GET,HEAD等幂等请求,会根据服务端响应的Location字段中的url重新发起请求。对于POST请求,大部分浏览器会将请求方式改为GET。 |
307 | 对于GET,HEAD等幂等请求,会根据服务端响应的Location字段中的url重新发起请求。对于POST请求,会询问客户端是否对新url再次发起POST请求。 |
永久重定向,顾名思义,指的是站点资源永久地迁移到新url,下表为永久重定向的状态码:
永久重定向 | 描述
|
301 | 对于GET,HEAD等幂等请求,会根据服务端响应的Location字段中的url重新发起请求。对于POST请求,部分浏览器会将请求方式改为GET。 |
3.5.2 django中的重定向类型
在django中使用HttpResponseRedirect进行临时重定向,使用HttpResponsePermanentRedirect来进行永久重定向,使用方法非常简单,只需传递新的url参数即可。url既可以硬编码的URL,也可以是完整的URL。
代码实例-使用HttpResponseRedirect进行临时重定向:
# 使用HttpResponseRedirect,需要从django.http模块中导出 from django.http import HttpResponseRedirect """ (1) 修改Html视图代码,临时重定向至/html5/ (2) 需要在urls.py再配置一个/html5/的路由 """ class Html(View): def get(self, request): # 直接传递硬编码的url return HttpResponseRedirect("/html5/") # 新增的视图类Html5 class Html5(View): title = "根据客户端的查询请求来响应不同的html" """ 查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议 """ def get(self, request): """ 获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容 """ label = request.GET.get('label', 'h1') content = request.GET.get('content', 'Hello Django') html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>". format(self.title, label, content) # 响应html文本给浏览器 return HttpResponse(html)
启动django服务器,在浏览器中访问http://127.0.0.1:8080/html/,可以发现地址迅速被修改成http://127.0.0.1:8080/html5/。
同时可以在命令行的输出中可以看到302的状态码:
[24/Aug/2020 16:21:33] "GET /html HTTP/1.1" 301 0
[24/Aug/2020 16:21:33] "GET /html/ HTTP/1.1" 302 0
[24/Aug/2020 16:21:33] "GET /html5/ HTTP/1.1" 200 114
代码实例-使用HttpResponsePermanentRedirect进行永久重定向:
# 使用HttpResponseRedirect,需要从django.http模块中导出 from django.http import HttpResponsePermanentRedirect """ (1) 修改Html视图代码,临时重定向至/html5/ (2) 需要在urls.py再配置一个/html5/的路由 """ class Html(View): def get(self, request): # 直接传递完整的url return HttpResponsePermanentRedirect("http://127.0.0.1:8080/html5/") # 新增的视图类Html5 class Html5(View): title = "根据客户端的查询请求来响应不同的html" """ 查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议 """ def get(self, request): """ 获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容 """ label = request.GET.get('label', 'h1') content = request.GET.get('content', 'Hello Django') html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>". format(self.title, label, content) # 响应html文本给浏览器 return HttpResponse(html)
也可以直接使用Django中的快捷函数redirect来进行重定向,通过参数permanent来控制是否永久重定向。permanent参数默认为False,表示临时重定向,传递True时表示永久重定向。
代码实例-使用redirect进行重定向:
from django.shortcuts import redirect """ (1) 修改Html视图代码,临时重定向至/html5/ (2) 需要在urls.py再配置一个/html5/的路由 """ class Html(View): def get(self, request): # 直接传递需重定向的硬编码url return redirect("/html5/") # 新增的视图类Html5 class Html5(View): title = "根据客户端的查询请求来响应不同的html" """ 查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议 """ def get(self, request): """ 获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容 """ label = request.GET.get('label', 'h1') content = request.GET.get('content', 'Hello Django') html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>". format(self.title, label, content) # 响应html文本给浏览器 return HttpResponse(html)
3.5.3 reverse:反向解析
在定义URL与视图的路由时,可以通过path或re_path函数中的name参数为URL取一个别名。利用django内置的reverse函数可以将url反向解析为URL:
# 使用reverse,需要从django.shortcuts 模块中导出 from django.shortcuts import redirect,reverse """ (1) 在urls.py中将Html5视图的别名设置为html5 """ class Html(View): def get(self, request): html5_url = reverse("html5") return redirect("/html5/")
通过reverse中的args参数或kwargs参数来传递参数给新的url。args以元组的形式传递参数,kwargs以字典的形式传递参数。
代码实例-使用reverse传递参数:
from django.shortcuts import redirect,reverse """ (1) 在urls.py中将Html5视图的别名设置为html5,同时在url中指定一个label的占位符 urls.py中的配置实例: path('html5/<label>/', blog.html5, name="html5"), """ class Html(View): def get(self, request): html5_url = reverse("html5",{"label": "article"}) return redirect(html5_url) class Html5(View): title = "根据客户端的查询请求来响应不同的html" """ 查询参数携带在url中,所以是对客户端的http get请求进行处理,对此不熟悉的读者,需要先学习下http协议 """ def get(self, request, label): """ 获取查询参数label,表示html标签,获取查询参数content,表示标签中的内容 """ content = request.GET.get('content', '使用reverse传递参数') html = "<html><head><title>{0}</title></head><{1}>{2}</{1}></html>".format(self.title, label, content) # 响应html文本给浏览器 return HttpResponse(html)
3.5.4 最具实力的小班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。
(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4) Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲
扫码免费领取Python学习资料:
已有2位薯条发表了看法:
访客 评论于 2020-09-29 23:52:23 回复
如果用重定向的代码, 输入网址http://127.0.0.1:8080/html/ 重定向到http://127.0.0.1:8080/html5/,但是显示404页面不存在。需要手动加label参数如http://127.0.0.1:8080/html5/h1/ 才能正常显示。
老师我想问的是为什么html5_url = reverse("html5",{"label": "article"}) 传的参数不能用
薯条老师 评论于 2020-10-07 09:44:13 回复
需要在urls.py中配置路由,reverse中的参数,需要在url中指定一个占位符