django外调用url_Django url
三 分組命名匹配
上面的示例使用簡單的正則表達式分組匹配(通過圓括號)來捕獲URL中的值并以位置參數形式傳遞給視圖。
在更高級的用法中,可以使用分組命名匹配的正則表達式組來捕獲URL中的值并以關鍵字參數形式傳遞給視圖。
在Python的正則表達式中,分組命名正則表達式組的語法是(?Ppattern),其中name是組的名稱,pattern是要匹配的模式。
下面是以上URLconf 使用命名組的重寫:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003), #注意正則匹配出來的內容是字符串,即便是你在url里面寫的是2003數字,匹配出來之后也是字符串
url(r'^articles/(\d{4})/$', views.year_archive),#year_archive(request,2003),小括號為分組,有分組,那么這個分組得到的用戶輸入的內容,就會作為對應函數的位置參數傳進去,別忘了形參要寫兩個了,明白了嗎?
url(r'^articles/(?P[0-9]{4})/$', views.year_archive),#某年的,(?P[0-9]{4})這是命名參數(正則命名匹配還記得嗎?),那么函數year_archive(request,year),形參名稱必須是year這個名字。而且注意如果你這個正則后面沒有寫$符號,即便是輸入了月份路徑,也會被它攔截下拉,因為它的正則也能匹配上
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),#某年某月的
url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$', views.article_detail), #某年某月某日的
]
這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字參數而不是位置參數傳遞給視圖函數。
例如,針對url?/articles/2017/12/相當于按以下方式調用視圖函數:
views.month_archive(request, year="2017", month="12"),year和month的位置可以換,沒所謂了,因為是按照名字來取數據的,還記得關鍵字參數嗎?
在實際應用中,使用分組命名匹配的方式可以讓你的URLconf 更加明晰且不容易產生參數順序問題的錯誤,但是有些開發人員則認為分組命名組語法太丑陋、繁瑣。
至于究竟應該使用哪一種,你可以根據自己的喜好來決定。
URLconf匹配的位置
URLconf 在請求的URL 上查找,將它當做一個普通的Python 字符串。不包括GET和POST參數以及域名。
例如,http://www.example.com/myapp/ 請求中,URLconf 將查找myapp/。
在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找myapp/。
URLconf 不檢查請求的方法。換句話講,所有的請求方法 —— 同一個URL的POST、GET、HEAD等等 —— 都將路由到相同的函數。
捕獲的參數永遠都是字符串
每個在URLconf中捕獲的參數都作為一個普通的Python字符串傳遞給視圖,無論正則表達式使用的是什么匹配方式。例如,下面這行URLconf 中:
url(r'^articles/(?P[0-9]{4})/$', views.year_archive),
傳遞到視圖函數views.year_archive()?中的year?參數永遠是一個字符串類型。
視圖函數中指定默認值
# urls.py中
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P[0-9]+)/$', views.page),
]
# views.py中,可以為num指定默認值
def page(request, num="1"):
pass
在上面的例子中,兩個URL模式指向相同的view - views.page - 但是第一個模式并沒有從URL中捕獲任何東西。
如果第一個模式匹配上了,page()函數將使用其默認參數num=“1”,如果第二個模式匹配,page()將使用正則表達式捕獲到的num值。
include其他的URLconfs(也叫URL分發)
問大家一個問題,views和models文件是不是都放在每一個app應用里面了啊,而urls.py這個文件放在哪了,是不是放在項目文件夾里面了,說明什么,說明是不是所有的app都在使用它,如果你一個項目有10個應用,沒有應用有100個url,那意味著你要在urls文件里面要寫多少條url對應關系,并且所有的app的url都寫在了這一個urls文件里面啊,這樣好嗎,當然也沒有問題,但是耦合程度太高了,所以django在url這里給你提供了一個分發接口,叫做include
#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文件
url(r'^app01/',include('app01.urls')), #別忘了要去app01這個應用下創建一個urls.py的文件,現在的意思是凡是以app01開頭的路徑請求,都讓它去找app01下的urls文件中去找對應的視圖函數,還要注意一點,此時這個文件里面的那個app01路徑不能用$結尾,因為如果寫了$,就沒辦法比配上app01/后面的路徑了
]
app01的urls.py的內容:(其實就是將全局的urls.py里面的內容copy一下,放到你在app01文件夾下創建的那個urls.py文件中,把不是這個app01應用的url給刪掉就行了)
from django.conf.urls import url
#from django.contrib import admin
from app01 import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^articles/2003/', views.special_case_2003,{'foo':'xxxxx'}),
url(r'^articles/(\d{4})/(\d{2})/', views.year_archive),
]
此時的目錄結構:
此時我們再訪問之前的articles相關的網址路徑的時候,就需要寫上app01開頭的了
正確輸入方式:
其實相當于做了什么呢,將網址http://127.0.0.1:8000/app01/articles/2003/,里面的路徑部分app01/articles/2003/,到項目的urls.py里面匹配,匹配到了app01/,然后拿著路徑剩余的部分articles/2003/去app01里面的urls.py文件里面進行匹配,找到對應的函數執行。
還要注意一點,看下面的$符號:
再來看:如果我們想通過輸入http://127.0.0.1:8000/app01/,看到app01這個應用的首頁,怎么辦?就像我現在輸入一個http://127.0.0.1:8000來查看網站的首頁,怎么辦,也就是說我后面不加任何路徑,就看你網址的首頁,怎么辦,一般網站的根路徑都是網站的首頁,對不對
看下面這種寫法可不可以:
views.py里面寫了這么個函數
輸入網址:
發現都跑到index這個函數里面去執行了,也就是說,全部被這個沒有匹配規則的url獲取到了,對不對
所以,正確的寫法,匹配根路徑的寫法:
url(r'^$', views.index),#以空開頭,還要以空結尾,寫在項目的urls.py文件里面就是項目的首頁,寫在應用文件夾里面的urls.py文件中,那就是app01的首頁
app01函數的內容:
還有注意一點,就是加app的時候,需要進行配置:
傳遞額外的參數給視圖函數(了解)
URLconfs 具有一個鉤子,讓你傳遞一個Python 字典作為額外的參數傳遞給視圖函數。
django.conf.urls.url()?函數可以接收一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。
例如:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),#注意,這就像一個命名分組一樣,你的函數里面的必須有一個形參,形參必須叫做foo才行。
]
在這個例子中,對于/blog/2005/請求,Django 將調用views.year_archive(request, year='2005', foo='bar')。
這個技術在Syndication 框架中使用,來傳遞元數據和選項給視圖。
總結
以上是生活随笔為你收集整理的django外调用url_Django url的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript小游戏_个人网站集成
- 下一篇: python getattr和getat