1. 程式人生 > >Django--URL(路由層)

Django--URL(路由層)

一、django 靜態檔案配置

在配置檔案中settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

/templates/timer.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>python is
on the way:{{ data}}</h1> <script src="/static/jquery-3.3.1.js"></script> <script type="text/javascript"> $('h1').click(function () { $(this).css('color','red') }) </script> </body> </html>

靜態檔案配置優化

二、簡單得路由配置

U RL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL呼叫的檢視函式之間的對映表;

你就是以這種方式告訴Django,對於客戶端發來的某個URL呼叫哪一段邏輯程式碼對應執行。

 1、簡單的路由配置

 # 路徑配置:路徑url-------->試圖函式views

views.py新增:

def specical_case_2003(request):
    return  HttpResponse('special_case_2003')

import re
re.search('^articles/2003/$
', 'article/2003') # 可以匹配到 匹配開頭結尾 re.search('^articles/2003/$', 'article/2003/yun/1992') # 匹配不到 re.search('^articles/2003/', 'article/2003/yun/1991') # 可以匹配到 只匹配開頭

from django.urls import path,re_path

from app01 import views

urlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/([0-9]{4})/$', views.year_archive),
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

注意: 若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。 不需要新增一個前導的反斜槓,因為每個URL 都有。

例如,應該是^articles 而不是 ^/articles。 每個正則表示式前面的'r' 是可選的但是建議加上。它告訴Python 這個字串是“原始的” —— 字串中任何字元都不應該轉義 示例:

 

/articles/2005/03/ 請求將匹配列表中的第三個模式。Django 將呼叫函式views.month_archive(request, '2005', '03')。
/articles/2005/3/ 不匹配任何URL 模式,因為列表中的第三個模式要求月份應該是兩個數字。
/articles/2003/ 將匹配列表中的第一個模式不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。請像這樣自由插入一些特殊的情況來探測匹配的次序。
/articles/2003 不匹配任何一個模式,因為每個模式要求URL 以一個反斜線結尾。
/articles/2003/03/03/ 將匹配最後一個模式。Django 將呼叫函式views.article_detail(request, '2003', '03', '03')。

2、有名分組

上面的示例使用簡單的、沒有命名的正則表示式組(通過圓括號)來捕獲URL 中的值並以位置 引數傳遞給檢視。在更高階的用法中,

可以使用命名的正則表示式組來捕獲URL 中的值並以關鍵字 引數傳遞給檢視。 在Python 正則表示式中,命名正則表示式組的語法是(?Ppattern),

其中name 是組的名稱,pattern 是要匹配的模式。 下面是以上URLconf 使用命名組的重寫:

pattern  /'pæt(ə)n/  /ˈpætərn/ 模式、圖案;vt模仿

from django.urls import path,re_path

from app01 import views

urlpatterns = [
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),  # moth_archive(request,y=2009,m=12)
views.py中,def
moth_archive(request,y,m)位置引數位置寫錯不會造成出錯
def moth_archive(request,m,y)這樣寫也可以

re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

 ---------------

def month_archive(request,year,month):
    return HttpResponse(year+'-'+month)

 ------------------

def month_archive(request,month,year):
    return HttpResponse(year+'-'+month)

 

這個實現與前面的示例完全相同,只有一個細微的差別:捕獲的值作為關鍵字引數而不是位置引數傳遞給檢視函式。例如:

/articles/2005/03/ 請求將呼叫views.month_archive(request, year='2005', month='03')函式,而不是views.month_archive(request, '2005', '03')。
/articles/2003/03/03/ 請求將呼叫函式views.article_detail(request, year='2003', month='03', day='03')。