日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

django外调用url_Django url

發布時間:2024/7/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。