day64 url用法以及django的路由系统
?
此篇博客是以備后查的,用到的時(shí)候記得過來查找即可!
?
路由系統(tǒng):就是我們的django項(xiàng)目創(chuàng)建的時(shí)候自帶的那個(gè)urls.py
它本身里面是映射的對(duì)應(yīng)關(guān)系,一個(gè)大的列表里面,一個(gè)個(gè)元祖,元祖里面是url或者網(wǎng)址,對(duì)應(yīng)一個(gè)函數(shù),視圖函數(shù)(處理業(yè)務(wù)邏輯)
url配置(URLconf)就像django所支撐的網(wǎng)站目錄,它的本質(zhì)是URL與要為該URL調(diào)用的視圖函數(shù)之間的映射表
就像我們?cè)趧?chuàng)建django的時(shí)候系統(tǒng)自動(dòng)生成的那個(gè)url.py文件一樣,里面的url列表里面我們就是寫入了一個(gè)個(gè)的元祖,然后每一個(gè)元祖里面是url地址和與之對(duì)應(yīng)的那個(gè)函數(shù)名,我們使用這個(gè)url的時(shí)候就是要執(zhí)行那個(gè)函數(shù),
urlconf配置
基本格式如下:
from django.conf.urls import urlurlpatterns = [url(正則表達(dá)式, views視圖函數(shù),參數(shù),別名), ]django2.0版本中的路由系統(tǒng)已經(jīng)替換成了下面的寫法: from django.urls import pathurlpatterns = [path('articles/2003/', views.special_case_2003),path('articles/<int:year>/', views.year_archive),path('articles/<int:year>/<int:month>/', views.month_archive),path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]
在web中的參數(shù)傳遞有兩種方式,一種是寫到類或者是函數(shù)的參數(shù)中,同時(shí)在URL中也顯示出來,以‘?xxx=xxx’的方式顯示出來,還有一種就是隱性傳參的方式,用request.POST/GET.get()的方式獲取參數(shù)。
跟前端的交互方式也不一樣
參數(shù)說明:
正則表達(dá)式,一個(gè)正則表達(dá)式字符串,
正則表達(dá)式的url匹配模式,我們的正則是有分組的,如果是單純的分組的話,它的分好的每一個(gè)組都是位置參數(shù),我們的位置參數(shù)是使用
arg去接收的,
我們的分組是會(huì)有分組命名的,那么命好的名字就是關(guān)鍵字參數(shù),我們使用**kwargs來接收2我們的關(guān)鍵字傳參
views視圖函數(shù),一個(gè)可調(diào)用對(duì)象,通常為一個(gè)視圖函數(shù)或者一個(gè)指定視圖函數(shù)路徑的字符串
參數(shù):可選的要傳遞給視圖函數(shù)的默認(rèn)參數(shù)(字典形式)
別名:一個(gè)可選的name參數(shù)
正則表達(dá)式詳解
基本配置:
我們之前寫的那些url映射關(guān)系里面,都是寫死的,就是一個(gè)url我們對(duì)應(yīng)一個(gè)視圖函數(shù),這樣使用起來很不方便,
我們需要進(jìn)行優(yōu)化,把他們的規(guī)律掌握了之后,在一定范圍內(nèi)都使用一個(gè)視圖函數(shù),這樣就可以極大地提高我們的工作效率了
所以我們需要使用正則來找到他們的規(guī)律
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
?這里我們使用正則匹配的時(shí)候就是按照我們之前所學(xué)的那些正則的規(guī)則去一一匹配,
這里是沒有異議的
注意事項(xiàng):
分組命名匹配:
我們的上面的正則是無法取到該頁面的,需要進(jìn)行分組來執(zhí)行才可以得到我們需要的結(jié)果,傳參數(shù)的時(shí)候順序要一一對(duì)應(yīng), 我們使用的正則是有分組的,每個(gè)分組之間用()來分割,
上面的示例使用簡(jiǎn)單的正則表達(dá)式分組匹配(通過圓括號(hào))來捕獲URL中的值并以位置參數(shù)形式傳遞給視圖。
在更高級(jí)的用法中,可以使用分組命名匹配的正則表達(dá)式組來捕獲URL中的值并以關(guān)鍵字參數(shù)形式傳遞給視圖。
(?P<name>pattern)? ?====>這里面的(?)都是固定格式,P也是固定的,它就是分組命名的關(guān)鍵字,我們的P后面的<>存放我們自定義的分組的名字,
把上面的urlconf使用命名組重寫:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
?而我們的分組命名匹配寫到了我們的url里面,那樣我們的url因?yàn)榉纸M的原因,僅僅是因?yàn)榉纸M加上了括號(hào),意義就大不一樣了,它系統(tǒng)識(shí)別到了分組就會(huì)把分組的每一個(gè)組生成一個(gè)操作,這個(gè)操作就是每一個(gè)分組都是一個(gè)參數(shù),而且是直接傳遞過去的參數(shù),一旦我們刷新頁面的時(shí)候那個(gè)生成的分組的參數(shù)就自動(dòng)傳遞給了后端,而后端沒有接收到它的話就會(huì)報(bào)錯(cuò),提示你有關(guān)鍵字參數(shù)需要傳遞,而你沒有接收它,這就是問題所在,所以我們需要在我們的views函數(shù)里面加上參數(shù)去接收我們?cè)诜纸M里面的傳值操作,
我們的分組里面如果有命名的話,我們命的名字要和我們?cè)趘iews函數(shù)里面的接收的參數(shù)名保持一致或者我們直接就用到我們的**kwargs,來接收所有傳過來的關(guān)鍵字參數(shù),
?
我們的url配置參數(shù)里面的name屬性里面的值跟我們?cè)贖TML文件里面,form表單里面的action對(duì)應(yīng)的值是有關(guān)系的,這里就牽扯到了反向解析的問題,我們?yōu)榱耸褂脛?dòng)態(tài)的效果,需要使用到反向解析的概念,這里就牽扯到一個(gè)命名的問題,我們的命名是不可以出現(xiàn)重復(fù)的,但是我們這里可以解決命名重復(fù)的問題,那就涉及到命名空間的使用了,我們可以把這些名字都存放于一個(gè)空間里面,在這個(gè)空間里面我們不使用重復(fù)的名字就好,但是超過這個(gè)空間的范圍我們就可以使用到重復(fù)的name值了,
所以我們使用命名空間的話,我們需要在我們的HTML文件里面的action里面加上名稱空間的名字,這里使用:進(jìn)行拼接,我們上面提到的正則分組里面涉及到參數(shù)傳遞的問題,在views函數(shù)里面需要有參數(shù)傳遞,在對(duì)應(yīng)的HTML文件里面也需要有參數(shù)設(shè)定,參數(shù)使用我們?cè)诜纸M正則里面命名的那個(gè)參數(shù),也是鍵對(duì)值的方式,使用=連接,
還有就是我們的url網(wǎng)址輸入的時(shí)候,我們需要把我們自己的App里面的那個(gè)url地址和我們的django項(xiàng)目里面的url地址拼接到一起,輸入到網(wǎng)頁的地址欄里面,拼接的時(shí)候使用/分割,這樣就可得到我們的預(yù)期結(jié)果了.
?1,使用url的時(shí)候,注意我們的url地址拼接,在網(wǎng)址欄輸入時(shí)的地址拼接
2.注意正則匹配的時(shí)候我們的分組,以及分組命名,要跟我們的views視圖函數(shù)以及我們的HTML文件里面的 action對(duì)應(yīng)的值,以及里面的參數(shù)配置
urlconf匹配的位置
urlconf在請(qǐng)求的url上查找,將它作為一個(gè)普通的python字符串來使用,不包括get和post以及參數(shù)和域名
例如一個(gè)網(wǎng)址:http://www.example.com/myapp/ 這里面我們的urlconf只查找myapp/
在http://www.example.com/myapp/?page=3 請(qǐng)求中,URLconf 仍將查找myapp/。 后面的?就是分隔符,我們的請(qǐng)求網(wǎng)址截止到?后面就是參數(shù)了,而.com前則是域名,參數(shù)和域名我們都是不包括在內(nèi)的
?
捕獲的參數(shù)永遠(yuǎn)都是字符串,
每個(gè)在urlconf中捕獲的參數(shù)都作為一個(gè)普通的python字符串傳遞個(gè)視圖,無論正則表達(dá)式用什么樣的匹配方式得到結(jié)果,它的本質(zhì)是不會(huì)變的,都是字符串,
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),傳遞到視圖函數(shù)views.year_archive()?中的year?參數(shù)永遠(yuǎn)是一個(gè)字符串類型。
?
我們的url路由配置里面,如果遇到了CBV,類視圖函數(shù):
url(r'^login/$',views.LoginView.as_view),? ?# 這里我們解釋一下,如果是類視圖函數(shù)的話,我們的正則匹配的地址后面,要寫上我們的類名+View.as_view 這是固定格式,我們的類視圖函數(shù)需要繼承View,必須首字母大寫,固定格式.
視圖函數(shù)中指定默認(rèn)值:
# urls.py中
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# views.py中,可以為num指定默認(rèn)值
def page(request, num="1"):
pass
?
?
include其他的urlconfs:
#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.
#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:
from django.conf.urls import include, url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')), # 可以包含其他的URLconfs文件
]
?這里的應(yīng)用場(chǎng)景是,我們一個(gè)項(xiàng)目做成不是基于一個(gè)人,而是一整個(gè)團(tuán)隊(duì)的努力我們的團(tuán)隊(duì)里面是有分工合作的,既然牽扯到團(tuán)隊(duì)的話,我們需要分工合作,每個(gè)人負(fù)責(zé)不同的部分,一個(gè)人負(fù)責(zé)的片區(qū)我們可以把它放到一個(gè)類似于口袋的地方,我們一整個(gè)項(xiàng)目完成后,再后期需要有更新或者功能的完善等等都需要找到每個(gè)人自己負(fù)責(zé)的部分進(jìn)行修補(bǔ)或者更新,那么我們就需要找到那個(gè)口袋,
而我們的django項(xiàng)目里面的url配置參數(shù)里面,使用到include,后面加上括號(hào),在括號(hào)里面可以寫多個(gè)url路由系統(tǒng)參數(shù),[我們的django項(xiàng)目會(huì)有很多的app,每個(gè)小功能都是存放于app里面的,所以我們的app里面的url配置參數(shù)都按照每個(gè)人負(fù)責(zé)的部分來進(jìn)行劃分,放到專屬的include里面]這樣我們就可以很方便的找到自己負(fù)責(zé)的部分進(jìn)行操作了
格式是這樣寫的:url(r'^who/',include(aps_urls),? ?-------->我們這里的正則who就相當(dāng)于是前綴,我們需找到這個(gè)前綴下面的aps_urls,然后它里面可以寫很多的url配置參數(shù),我們?cè)趇nclude里面只能夠?qū)懸粋€(gè)url配置參數(shù),不可以寫多個(gè),規(guī)則就是這樣的,我們要遵守人家的規(guī)則,所謂的多個(gè)是在aps_urls里面寫多個(gè),而不是在include里面
?
傳遞額外的參數(shù)給視圖函數(shù):
URLconfs 具有一個(gè)鉤子,讓你傳遞一個(gè)Python 字典作為額外的參數(shù)傳遞給視圖函數(shù)。
django.conf.urls.url()?函數(shù)可以接收一個(gè)可選的第三個(gè)參數(shù),它是一個(gè)字典,表示想要傳遞給視圖函數(shù)的額外關(guān)鍵字參數(shù)。
?
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]
?
在此例中,對(duì)于/blog/2005/請(qǐng)求中,django將調(diào)用views.year_archive(request,year="2005",foo="bar"). 這個(gè)技術(shù)在syndication框架中使用,來傳遞元數(shù)據(jù)和選項(xiàng)給視圖
?
?
命名url和url反向解析[官方翻譯版]
在使用django項(xiàng)目是,一個(gè)常見的需求是獲得url的最終形式,以用于嵌入到生成的內(nèi)容中,(視圖中和顯示給用戶的內(nèi)容)或者用于處理服務(wù)器端的導(dǎo)航(重定向等).
我們編碼這些url費(fèi)力不可擴(kuò)展同時(shí)還容易產(chǎn)生錯(cuò)誤,如果涉及一種與urlconf不相關(guān)的專門的URL生成機(jī)制,因?yàn)檫@樣容易導(dǎo)致一定程度上產(chǎn)生過期的url
本質(zhì)上是需要一個(gè)DRY機(jī)制,它允許設(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模板標(biāo)簽
在python代碼中使用django.core.urlresolvers.reverse()函數(shù).
在高層的與處理django模型實(shí)例相關(guān)的代碼中,使用get_absolute_url()方法,
=========================================================================
?
簡(jiǎn)單來說就是給我們的url匹配規(guī)則起個(gè)名字,一個(gè)url匹配模式起一個(gè)名字,這樣我們以后就不需要寫死url代碼了,只需要通過名字來調(diào)用當(dāng)前的url,
例如:
url(r'^home', views.home, name='home'), # 給我的url匹配模式起名為 home url(r'^index/(\d*)', views.index, name='index'), # 給我的url匹配模式起名為index然后在HTML模板里面就這樣引用:{% url'home' %}
在views函數(shù)中可以這樣引用:
from django.urls import reverse
reverse("index", args=("2018", ))
考慮下面的urlconf:
from django.conf.urls import url
from . import views
urlpatterns =[
# ...
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.urls import reverse
from django.shortcuts import redirect
def redirect_to_year(request):
#...
year = 2005
#...
return redirect(reverse('news-year-archive', args=(year,)))
?
?
?
如果處于某種原因決定按年歸檔文章發(fā)布的url應(yīng)該調(diào)整一下,那么你將只需要修改urlconf中的內(nèi)容,在某些場(chǎng)景中,一個(gè)仕途上hi通用的,所以在url和視圖之間存在多對(duì)一的關(guān)系,對(duì)于這些情況,當(dāng)反查url時(shí),只有視圖的名字還不夠,
注意:
為了完成上面例子中的url反查,你將需要使用命名的url模式,url的名稱使用的字符串可以包含任何你喜歡的字符,不只限制在合法的python名稱,當(dāng)命名你的url模式時(shí),請(qǐng)確保使用的名稱不會(huì)與其他的應(yīng)用中名稱沖突,如果你的url模式叫做comment而另外一個(gè)應(yīng)用中也有一個(gè)同樣的名稱,當(dāng)你在模板中國使用這個(gè)名稱的時(shí)候不能保證將插入哪個(gè)url.
在url名稱中加上一個(gè)前綴,比如應(yīng)用的名稱,將減少?zèng)_突的可能,我們建議使用myapp-comment而不是commet
?
?
?
Django-2.0命名空間模式更新語法
project中的urls.py
from django.conf.urls import url, include
# 官網(wǎng)上的例子# 這是跟setting文件同級(jí)目錄的url文件 urls.py from django.urls import include, pathurlpatterns = [path('author-polls/', include('polls.urls', namespace='author-polls')), # 這里的路由隨意設(shè)定,include中的第一個(gè)參數(shù)必須要是app的名字.urls,第二個(gè)參數(shù)也隨意設(shè)定。path('publisher-polls/', include('polls.urls', namespace='publisher-polls')), ]
# 這是app下的URL文件, polls/urls.py from django.urls import pathfrom . import views
# 下面這一行是必須加上的,要有參數(shù)“app_name”,參數(shù)值建議寫app的名字(當(dāng)然了,你硬是要瞎寫個(gè)別的亂字符串,也不會(huì)報(bào)錯(cuò),只要不是空字符串就行),否則會(huì)報(bào)錯(cuò)
“”“
'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name
attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
”“” app_name = 'polls' urlpatterns = [path('', views.IndexView.as_view(), name='index'),path('<int:pk>/', views.DetailView.as_view(), name='detail'),... ]?
?
?
模板中引用:
{% url'app01:detail' pk=12 pp=99 %}
?
views中的函數(shù)引用
v=reverse('app01:detail', kwargs={'pk':11})
?
?==================================================================================================================================================我們之前寫的那些django項(xiàng)目里面,學(xué)生,班級(jí),老師的管理系統(tǒng),統(tǒng)統(tǒng)都是不規(guī)范的,那樣寫僅僅是為了便于我們?nèi)ダ斫?其實(shí)是有很多的問題的,雖然我們已經(jīng)理解了,然后還都實(shí)現(xiàn)了那些功能,感覺還挺開心的,
======================================================================================================
我們這里把url路由配置和視圖的知識(shí)點(diǎn)結(jié)合著一起整理到一塊,這樣便于記憶
?
現(xiàn)在我們需要把那些都推翻了,然后以一種更加規(guī)范更加合理的方式去寫出來,我們一般的項(xiàng)目都沒有直接寫到我們的django 項(xiàng)目里面的,都是寫到Django項(xiàng)目下面的app里面的,我們的templates是在創(chuàng)建django項(xiàng)目的時(shí)候就要自己手動(dòng)創(chuàng)建好的,用于存放我們的HTML頁面,然后我們創(chuàng)建的那些app就需要根據(jù)app的名字把對(duì)應(yīng)的需要用到的那些HTML文件歸類存放,用起來的時(shí)候會(huì)方便很多,我們命名的時(shí)候可以隨意起名,只要你知道你用的時(shí)候去哪里找就行,但是為了方便起見一般會(huì)給app所對(duì)應(yīng)的那個(gè)templates里面的內(nèi)層文件夾起同樣的名字,跟我們的App的名字一樣,然后我們?cè)趘iews里面寫視圖函數(shù)的時(shí)候在return部分要渲染HTML頁面,那個(gè)頁面我們可以就像之前一樣直接寫HTML的名字,你在運(yùn)行項(xiàng)目的時(shí)候pycharm會(huì)自動(dòng)給你把HTML頁面的前綴加上的,如果我們的templates下面的App對(duì)應(yīng)的文件夾名字有變動(dòng)的話,pycharm也會(huì)自動(dòng)給你把views視圖里面的return后面的渲染頁面給你自動(dòng)變更下面有截圖為例:
我們以后不一定就是使用pycharm寫項(xiàng)目,有可能是用其他的軟件去寫項(xiàng)目,所以我們最好是知道這一點(diǎn)然后養(yǎng)成習(xí)慣把它加上,畢竟系統(tǒng)是需要這個(gè)東西的,不然也不會(huì)給你自動(dòng)增加上
視圖:
我們的路由配置里面(urls.py文件即是)一個(gè)url網(wǎng)址對(duì)應(yīng)一個(gè)視圖函數(shù),我們的url網(wǎng)址一旦有一丁點(diǎn)的改動(dòng)都無法執(zhí)行視圖函數(shù),有一個(gè)舉例的場(chǎng)景里面,我們的博客管理系統(tǒng),我們前面的學(xué)生老師班級(jí)信息顯示內(nèi)容都是從數(shù)據(jù)庫里面取出數(shù)據(jù)然后把他們提交到前端頁面,這樣的話我們的博客如果數(shù)據(jù)量巨大的話,我們需要寫海量的復(fù)用性極高的代碼,這樣顯然是不科學(xué)的,在正常的工作環(huán)境中是不可能出現(xiàn)這樣的情況,所以我們不能夠這樣寫
首先我們需要解決url配置的問題,使用正則的話就可以把含有一定規(guī)律的url都概括到這樣一個(gè)正則里面,我們只要滿足這個(gè)正則的要求,就可以正常執(zhí)行那個(gè)url所對(duì)應(yīng)的視圖函數(shù),
?
如下所示:
urlpatterns=[
url(r'^text/$', views.text, name='text'),? # FBV方式 F(function,函數(shù))----B(base,基于)-----V(views, 視圖)======>基于函數(shù)的視圖
? 我們?cè)谶@里解釋一下這個(gè)url路由配置的意思,我們之前寫的例子里面就是一個(gè)url對(duì)應(yīng)一個(gè)視圖函數(shù),我們的r后面是自定義的url網(wǎng)址,后面的views是我們的App里面的views,我們的項(xiàng)目視圖函數(shù)都是寫到views里面的,他就是一個(gè)路徑的意思,我們之前直接寫到django項(xiàng)目里的時(shí)候就是直接把視圖函數(shù)里面的函數(shù)名寫到這里的,我們有App之后就需要把路徑指定一下,在函數(shù)名前面加上App的views路徑,,后面的name才是關(guān)鍵的重點(diǎn),我們的HTML頁面里面的acion里面跳轉(zhuǎn)的頁面就是使用的name里面的值,就是我們這里的路由配置里面的name里面的值下面有圖,會(huì)更易理解一些
]
?
上面使用的是FBV,
在視圖里面還有一個(gè)CBV,我們這里來詳解一下,C--class(類)B---base(基于),V---views(視圖)====>基于類的視圖
首先在url配置里面,我們來看一下它是怎么配置的
urlpatterns=[
url(r'^tes/$', aps.Tex.as_view(), name='tet'),? # 這里的as_view() 是對(duì)于請(qǐng)求做出判斷,判斷請(qǐng)求是什么方式,它本質(zhì)就是對(duì)于發(fā)送過來的請(qǐng)求進(jìn)行判斷,我們的應(yīng)用場(chǎng)景是在CBV里面,因?yàn)镃是class是類,類里面會(huì)有很多的方法,我們要在拿到這個(gè)請(qǐng)求的時(shí)候在這里對(duì)其進(jìn)行判斷,判斷是什么方式然后使用相應(yīng)的類里面的相應(yīng)的方法,而我們?cè)贔BV里面是不需要使用這一層判斷的,我們的FBV里面只有一個(gè)方法,沒得選,我們定義的是什么函數(shù)就使用什么函數(shù)方法去操作我們的請(qǐng)求,沒有選擇的余地也不需要選擇.
?] # 前面是正則匹配,后面是從app文件路徑里找到函數(shù)名,然后后面加上as_view(),這里是CBV里具有的特殊用法,后面的name就是我們上面所寫的方法一樣的,關(guān)聯(lián)我們的form表單里面的action,動(dòng)態(tài)改變網(wǎng)址
如圖所示:
?
?
分組匹配就不多贅述了,上面有詳解,本身也不是多難的概念
include
還有一個(gè)命名空間,以防止命名重復(fù)的問題,我們?cè)趗rl里面寫的name的值是不能夠重復(fù)的,除非我們可以把他們歸納到一個(gè)小范圍里面,就相當(dāng)于我們的一個(gè)一個(gè)小組,這個(gè)小組里面可以有一個(gè)人叫a,但是不能夠在這個(gè)組里有重名的,我們有另外一個(gè)小組,那個(gè)小組里面有一個(gè)人叫a,這樣的情況就可以,但是我們的同一個(gè)小組里面不能夠有重復(fù)的人叫a,這樣的話我們就可以有重復(fù)的名字了,至少在大范圍內(nèi)是可以有重復(fù)的
然后我們?cè)俜聪蚪馕?我們上面一直在重復(fù)一件事,就是我們的url里面的那個(gè)name所對(duì)應(yīng)的值是我們的HTML里面的form表單里面action所對(duì)應(yīng)的那個(gè)需要跳轉(zhuǎn)的頁面,那個(gè)頁面我是寫成了動(dòng)態(tài)的,我們的name是一個(gè)總稱,是我們的url路由系統(tǒng)里面正則的總稱,把它放到我們action里面之后,我們拿到這個(gè)name就可以去找到我們的正則里面的真實(shí)的地址,這里就是反向解析,也就是說我們name的值跟action值所對(duì)應(yīng)的這段關(guān)系就是反向解析的過程
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/2012-dream/p/8306083.html
總結(jié)
以上是生活随笔為你收集整理的day64 url用法以及django的路由系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java后台提供ios微信支付接口
- 下一篇: java信息管理系统总结_java实现科