render函数和redirect函数的区别+反向解析
render函數(shù)和redirect函數(shù)的區(qū)別+反向解析
1、視圖函數(shù):一定是要包含兩個(gè)對(duì)象的(render源碼里面有HttpResponse對(duì)象)
??request對(duì)象:-----》所有的請(qǐng)求信息
? HttpResponse:-----》響應(yīng)的內(nèi)容(字符串)
2、get請(qǐng)求發(fā)送數(shù)據(jù):http://127.0.0.1:8000/login.html?user=asd&pwd=asd
?重點(diǎn):request里包含哪些數(shù)據(jù)
1、request.GET:?GET請(qǐng)求的數(shù)據(jù),如果沒有數(shù)據(jù)是一個(gè)空字典 ? ?{}
2、request.POST:POST請(qǐng)求的數(shù)據(jù) ,如果沒有數(shù)據(jù)是一個(gè)空字典 ?{}
3、request.method:請(qǐng)求方式:GET 或 POST
4、請(qǐng)求某個(gè)鍵下多個(gè)值時(shí):request.POST.getlist("hobby")
? ? ? ? ? ??5、 request.path?: 請(qǐng)求路徑(只會(huì)拿到路徑,不拿數(shù)據(jù)) ? ?
??請(qǐng)求url:http://127.0.0.1:8000/index.html/23?a=1
?path:request.path:/index.html/23
? ? ? ? ? ? 6、 ?request.get_full_path()??:請(qǐng)求路徑(路徑和數(shù)據(jù)都會(huì)拿到)
?請(qǐng)求url:http://127.0.0.1:8000/index.html/23?a=1
?request.get_full_path():/index.html/23?a=1
render函數(shù)和redirect函數(shù)的區(qū)別
render:只會(huì)返回頁面內(nèi)容,但是未發(fā)送第二次請(qǐng)求
redirect:發(fā)揮了第二次請(qǐng)求,url更新
具體實(shí)例說明
render:
redirect:
?
反向解析
在使用Django 項(xiàng)目時(shí),一個(gè)常見的需求是獲得URL 的最終形式,以用于嵌入到生成的內(nèi)容中(視圖中和顯示給用戶的URL等)或者用于處理服務(wù)器端的導(dǎo)航(重定向等)。
人們強(qiáng)烈希望不要硬編碼這些URL(費(fèi)力、不可擴(kuò)展且容易產(chǎn)生錯(cuò)誤)或者設(shè)計(jì)一種與URLconf 毫不相關(guān)的專門的URL 生成機(jī)制,因?yàn)檫@樣容易導(dǎo)致一定程度上產(chǎn)生過期的URL。
換句話講,需要的是一個(gè)DRY 機(jī)制。除了其它有點(diǎn),它還允許設(shè)計(jì)的URL 可以自動(dòng)更新而不用遍歷項(xiàng)目的源代碼來搜索并替換過期的URL。
獲取一個(gè)URL 最開始想到的信息是處理它視圖的標(biāo)識(shí)(例如名字),查找正確的URL 的其它必要的信息有視圖參數(shù)的類型(位置參數(shù)、關(guān)鍵字參數(shù))和值。
Django 提供一個(gè)辦法是讓URL 映射是URL 設(shè)計(jì)唯一的地方。你填充你的URLconf,然后可以雙向使用它:
- 根據(jù)用戶/瀏覽器發(fā)起的URL 請(qǐng)求,它調(diào)用正確的Django 視圖,并從URL 中提取它的參數(shù)需要的值。
- 根據(jù)Django 視圖的標(biāo)識(shí)和將要傳遞給它的參數(shù)的值,獲取與之關(guān)聯(lián)的URL。
第一種方式是我們?cè)谇懊娴恼鹿?jié)中一直討論的用法。第二種方式叫做反向解析URL、反向URL 匹配、反向URL 查詢或者簡(jiǎn)單的URL 反查。
在需要URL 的地方,對(duì)于不同層級(jí),Django 提供不同的工具用于URL 反查:
- 在模板中:使用url 模板標(biāo)簽。
- 在Python 代碼中:使用
django.core.urlresolvers.reverse()?函數(shù)。 - 在更高層的與處理Django 模型實(shí)例相關(guān)的代碼中:使用
get_absolute_url()?方法。
例子:
考慮下面的URLconf:
from django.conf.urls import urlfrom . import viewsurlpatterns = [#...url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),#...
] 根據(jù)這里的設(shè)計(jì),某一年nnnn對(duì)應(yīng)的歸檔的URL是/articles/nnnn/。
你可以在模板的代碼中使用下面的方法獲得它們:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a><ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul> 在Python 代碼中,這樣使用:
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirectdef redirect_to_year(request):# ...year = 2006# ...return HttpResponseRedirect(reverse('news-year-archive', args=(year,))) 如果出于某種原因決定按年歸檔文章發(fā)布的URL應(yīng)該調(diào)整一下,那么你將只需要修改URLconf 中的內(nèi)容。
在某些場(chǎng)景中,一個(gè)視圖是通用的,所以在URL 和視圖之間存在多對(duì)一的關(guān)系。對(duì)于這些情況,當(dāng)反查URL 時(shí),只有視圖的名字還不夠。
?
例子中:
分析:想我們一開始寫的硬編碼,也就是吧action要跳轉(zhuǎn)的路徑寫死了。但是像淘寶,天貓等都會(huì)經(jīng)常更新新東西,,那么你的頁面上的url路徑也會(huì)時(shí)不時(shí)的變化。但是如果有特別多的商品,那么你就得去服務(wù)端一個(gè)一個(gè)的改,這樣顯得很麻煩,那么有沒有一種機(jī)制幫我們解決問題呢?那就按照我下面的辦法解決。就把url路徑寫活了。
1、首先給url起一個(gè)別名。
2、然后在login.html中寫上{% ?url ‘別名’’ ?%} ? ?,如果在頁面中點(diǎn)擊查看元素,它會(huì)變成login.html,,,當(dāng)然我的是分發(fā)了,,就會(huì)變成test/login.html
3、這樣你就可以修改你的正則了,,因?yàn)樗前凑談e名走的,不會(huì)影響。
urls.py
login.html
查看元素的結(jié)果:
?
?這樣的好處是:無論你怎么改你要匹配的url,只要你寫上了別名。在html實(shí)現(xiàn)了模板語法,就會(huì)去找別名對(duì)應(yīng)的那個(gè)url,以后不管你怎么改url都沒事,就寫活了,就不像一開始寫的硬編碼了。
轉(zhuǎn)載于:https://www.cnblogs.com/xiao-xue-di/p/9715206.html
總結(jié)
以上是生活随笔為你收集整理的render函数和redirect函数的区别+反向解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电镀多少钱啊?
- 下一篇: ES6变量常量字符串数值