一、 urls.py的作用(項(xiàng)目目錄下的urls.py為根配置)
1、 URL配置(URL conf)就像是Django所支撐網(wǎng)站的目錄。它的本質(zhì)是URL模式以及要為該URL模式調(diào)用的視圖函數(shù)之間的映射表。以這樣的方式告訴Django,對(duì)于那個(gè)URL調(diào)用那段代碼。url的加載就是從根配置文件中開始。
2、注意事項(xiàng):
- 當(dāng)一個(gè)請(qǐng)求來到時(shí),首先先到項(xiàng)目目錄下的urls.py(根URLconf模塊)中,查找相應(yīng)的路由規(guī)則。
在urls.py中urlpatterns是一個(gè)列表,它里面的每個(gè)元素就是一個(gè)路由規(guī)則。 - 根配置模塊中,里面定義了urlpatterns變量。
- urlpatterns里面含有django.urls.path,django.urls.re_path對(duì)象。
按順序運(yùn)行每個(gè)url路由規(guī)則,在被第一個(gè)匹配的url的規(guī)則(模式)匹配后停止。一旦匹配成功,django導(dǎo)入并且調(diào)用給定的視圖。如果中間出錯(cuò)誤或則沒有匹配到相應(yīng)的路由規(guī)則,返回404。
二、url(路由規(guī)則)例子
1、在項(xiàng)目目錄下urls.py文件中寫路由規(guī)則

2、在項(xiàng)目目錄創(chuàng)建了一個(gè)views.py文件

3、在地址欄中輸入url來進(jìn)行訪問django服務(wù)器

三、 path方法的基本規(guī)則(重點(diǎn)):
1、示例:path('test/<xx>/',views.test)
- 使用尖括號(hào)(<>)從url中捕獲值。包含一個(gè)轉(zhuǎn)化器類型(converter type),將匹配任何字符串,當(dāng)然也包括了 / 字符。
- 當(dāng)前面的url匹配成功后就會(huì)調(diào)用后面的視圖函數(shù)。
2、基本格式:path(route,view,kwargs=None,name=None)
- route:是一個(gè)字符串形式的url規(guī)則。
- view:是一個(gè)視圖函數(shù)。
- kwargs:是一個(gè)額外參數(shù),傳遞給view,必須是一個(gè)字典形式。
- name:url的命名。
3、在url中捕獲參數(shù)
- 在url規(guī)則中可以使用'<對(duì)應(yīng)視圖函數(shù)的參數(shù)>'就可以捕獲url中的值,傳遞給相應(yīng)的視圖函數(shù)。
4、類型轉(zhuǎn)化器
- 主要將捕獲的url轉(zhuǎn)化為相應(yīng)的類型。
四、path方法中支持的轉(zhuǎn)換器
- str
匹配除了路徑分隔符(/)之外的非空字符串,這是默認(rèn)的形式。 - int
匹配正整數(shù),包含0。 - slug
匹配字母、數(shù)字以及橫杠、下劃線組成的字符串。 - uuid
匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。 - path
匹配任何非空字符串,包含了路徑分隔符。
五、轉(zhuǎn)換器的使用
1、設(shè)置url路由規(guī)則:
path('test/<int:xx>/',views.test3)#指定被捕獲的參數(shù)為整數(shù)類型。
2、在視圖中將獲取到的參數(shù)和參數(shù)的類型打印出來:
def test3(request,xx):
print(xx,type(xx))
return HttpResponse('hello %s'%xx)
注意:注意:xx名稱必須要一致。
3、完整示例:
path('detail/<pk>-<slug>/', views.detail) #可以用-來連接,但是參數(shù)必須位置相同。
def detail(request, pk, slug):
return HttpResponse('這是第%s個(gè)學(xué)生,%s太壞了'% (pk, slug))
六、re_path方法的正則匹配
1、urls.py文件中的代碼
re_path('^hello/$',views.test5),
re_path('^hello/(?P<yy>[0-9]+)/',views.test6),
2、views.py文件中的代碼
def test5(request):
return HttpResponse('這是用的re_path設(shè)置的')
def test6(request,yy):
print(yy,type(yy))
return HttpResponse('hello %s'%yy)
3、注意注意:
-
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students),當(dāng)分了組就要和位置參數(shù)一一對(duì)應(yīng),不分組和關(guān)鍵字參數(shù)一一對(duì)應(yīng)。 - django的url只搜索路徑部分,跟參數(shù)以及請(qǐng)求方法無關(guān)。
七、項(xiàng)目目錄下和app下的urls.py
1、一個(gè)url對(duì)應(yīng)一個(gè)視圖函數(shù),但我們的視圖越來越多時(shí),url也就越來越多。
2、include的作用:一個(gè)project有一個(gè)總的urls.py,各個(gè)app也可以自己建立自己的urls.py,用include()函數(shù)在project的urls.py文件進(jìn)行注冊(cè)。
3、include使用的例子如下:
- 項(xiàng)目目錄下的主urls.py
from django.contrib import admin
from django.urls import path,include
from . import views
urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls')),]
- 為APP中books里面的urls.py
from django.urls import path
from . import views
urlpatterns = [ path('index/',views.index), ]
- 為APP中books里面的views.py
from django.http import HttpResponse
def index(request):
return HttpResponse('這個(gè)book的首頁!!')
八、kwargs參數(shù)的作用
1、kwargs傳遞一個(gè)Python 字典作為額外的參數(shù)傳遞給視圖函數(shù)。
# 主urls.py文件
from django.contrib import admin
from django.urls import path,include
urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls'),{'switch':'true'}),]
2、Kwargs為字典類型可以傳遞額外的參數(shù)到views中使用,include的時(shí)候需要統(tǒng)一給下面的url一些參數(shù)的時(shí)候可以用此參數(shù)。并且視圖函數(shù)中可以通過關(guān)鍵字參數(shù)獲取到。
# 為APP中books里面的views.py
from django.http import HttpResponse
import datetime
def index(request,**kwargs):
if kwargs.get('switch') == 'true':
print(datetime.datetime.now())
return HttpResponse('這個(gè)book的首頁!!')
3、注意事項(xiàng)
-
在path,re_path方法中,可以向視圖函數(shù)傳遞一個(gè)kwargs字典參數(shù)。
當(dāng)kwargs中的key與url捕獲的key一致的時(shí)候,以kwargs中的key為主。
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students, kwargs={'swich': True})
ef students(request, year, month, swich):
return HttpResponse('這是%s年%s月%s'% (year,month, swich))
- 如果是在根配置urls.py中的話,即如下面所示:
urlpatterns = [ path('admin/', admin.site.urls), path('teacher/', include('teacher.urls'),kwargs={'swich': True})]
這樣就會(huì)給teacher子應(yīng)用的每條路由規(guī)則傳一個(gè){'swich': True}參數(shù),有的時(shí)候業(yè)務(wù)需求要。