Django路由控制
簡單的路由配置
實例1
創建應用app1,新建一個路徑index,修改urls.py文件
from django.contrib import admin
from django.urls import path
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
新建index視圖函數
from django.shortcuts import render, HttpResponse # create your views here def index(request): return HttpResponse('INDEX')
訪問首頁:
http://127.0.0.1:8000/index/
網頁顯示效果如下:
訪問這種路徑http://127.0.0.1:8000/index/xiao ,網頁提示404錯誤。
path相當於在路徑裏自動加上了^和$,如果要使用其他的正則匹配,可以使用re_path
實例2
如果想要網頁加上路徑,動態顯示年份,怎麽做呢?
這個時候,需要用到正則分組。當re_path檢測到分組時,會將分組的值傳給視圖函數
如果是無名分組,則作為位置參數傳入;如果是有名分組,作為關鍵字參數傳入
urls.py
urlpatterns = [ path('admin/', admin.site.urls), # path('index/', views.index), re_path('^index/$', views.index), # index(request) re_path(r'^articles/2003/$', views.special_year), # special_year(request) re_path(r'^articles/(\d{4})/$', views.article_year), # article_year(request,分組匹配的值) ]
views.py
def article_year(request,year):
return HttpResponse(year)
訪問url:http://127.0.0.1:8000/articles/2080/
網頁效果如下:
新增url,獲取月份,修改urls.py
urlpatterns = [ path('admin/', admin.site.urls), # path('index/', views.index), re_path('^index/$', views.index), # index(request) re_path(r'^articles/2003/$', views.special_year), # special_year(request) re_path(r'^articles/(\d{4})/$', views.article_year), # article_year(request,分組匹配的值) re_path(r'^articles/(\d{4})/(\d{2})/$', views.article_month), # article_month(request,value1,value2) ]
新增article_month視圖函數,它必須接收2個額外的參數,否則報錯
def article_month(request,year,month):
return HttpResponse('{}-{}'.format(year,month))
訪問url:http://127.0.0.1:8000/articles/2080/10/
網頁效果如下:
訪問url:http://127.0.0.1:8000
網頁提示404
這樣用戶體驗不好,怎麽辦呢?在index下面,加入以下的url規則
re_path('^$', views.index)
再次訪問頁面,輸出:
小結
- Django2中使用path和re_path,Django1中使用url
- 不需要捕獲參數時用path,需要捕獲參數時用re_path和url
- 無名分組使用位置參數傳入視圖函數,有名分組作為關鍵字參數傳入
- url前不需要加一個前導符^,因為每個url都有
- 正則表達式前面建議加上‘r‘,表示這個字符串時‘原始的‘,不需要轉義
路由分發
背景
一個Django項目裏有多個APP,共用一個url容易造成混淆,且不便於維護,一個APP的url出現問題可能造成整個url.py文件的崩潰,因此可以通過路由分發讓每個APP擁有自己單獨的url,方便後續的維護管理
實現
url.py裏面的說明
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
第一步:導入include方法,
在urls.py導入include
from django.urls import path,re_path,include
第二步:創建urls
在app1的目錄下創建urls.py,將urls.py的內容復制過去,修改
from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
re_path('^$', views.index),
re_path('^index/$', views.index), # index(request)
path('app1/', include('app1.urls')), # 表示把app1/下面的url都分發給app1.urls這個文件處理
]
再訪問http://127.0.0.1:8000/index/,提示404
因為路由分發了,訪問時,必須加上應用名http://127.0.0.1:8000/app1/index/
再增加一個應用app2,總的代碼如下:
總的urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/', include('app1.urls')), # 表示把app1/下面的url都分發給app1.urls這個文件處理
path('app2/', include('app2.urls')), # 表示把app2/下面的url都分發給app2.urls這個文件處理
]
app1下面的urls.py
from django.contrib import admin
from django.urls import path,include
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
app2下面的urls.py
from django.contrib import admin
from django.urls import path,include
from app2 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
app1下面的views.py
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('index in app1')
app2下面的views.py
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('index in app2')
小結
- 路由分發的目的是使url
解耦
,便於管理 - 在總的urls.py裏使用include,在各個APP目錄下創建單獨的urls.py
- 分發後訪問需要加上APP的名字
Django路由控制