1. 程式人生 > >Django路由控制

Django路由控制

def add admin 體驗 分享 short 匹配 用戶體驗 擁有

簡單的路由配置

實例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路由控制