dy02項目配置和路由
1項目的配置
1.1配置文件
1.BASE_DIR為當前工程的根目錄
BASE_DIR = Path(__file__).resolve().parent.parent
# 意思是項目根目錄為文件所在路徑的父級目錄的父級目錄
Django會依此來定位工程內(nèi)的相關(guān)文件,我們也可以使用該參數(shù)來構(gòu)造文件路徑
2. DEBUG
調(diào)試模式,創(chuàng)建工程后初始值為True,即默認工作在調(diào)試模式下。
作用:
修改代碼文件,程序自動重啟
Django程序出現(xiàn)異常時,向前端顯示詳細的錯誤追蹤信息
而非調(diào)試模式下,僅返回Server Error (500)
注意:部署線上運行的Django不要運行在調(diào)式模式下,記得修改DEBUG=False
1.2本地語言與時區(qū)
Django支持本地化處理,即顯示語言與時區(qū)支持本地化。
本地化是將顯示的語言、時間等使用本地的習慣,這里的本地化就是進行中國化,中國大陸地區(qū)使用簡
體中文,時區(qū)使用亞洲/上海時區(qū),注意這里不使用北京時區(qū)表示。
初始化的工程默認語言和時區(qū)為英語和UTC標準時區(qū)
將語言和時區(qū)修改為中國大陸信息
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
# USE_TZ = True
2.靜態(tài)文件
項目中的CSS、圖片、js都是靜態(tài)文件。一般會將靜態(tài)文件放到一個單獨的目錄中,以方便管理。在
html頁面中調(diào)用時,也需要指定靜態(tài)文件的路徑,Django中提供了一種解析的方式配置靜態(tài)文件路
徑。靜態(tài)文件可以放在項目根目錄下,也可以放在應用的目錄下,由于有些靜態(tài)文件在項目中是通用
的,所以推薦放在項目的根目錄下,方便管理。
為了提供靜態(tài)文件,需要配置兩個參數(shù):
STATICFILES_DIRS 存放查找靜態(tài)文件的目錄
STATIC_URL 訪問靜態(tài)文件的URL前綴
在setting.py中修改靜態(tài)文件的兩個參數(shù)為
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static'
]
例如,我們向static目錄中添加一個index.html文件,在瀏覽器中就可以使用
127.0.0.1:8000/static/index.html來訪問。
注意
Django 僅在調(diào)試模式下(DEBUG=True)能對外提供靜態(tài)文件。
當DEBUG=False工作在生產(chǎn)模式時,Django不再對外提供靜態(tài)文件,需要是用collectstatic命令來收集
靜態(tài)文件并交由其他靜態(tài)文件服務器來提供。(詳細在部署時會講)
3.路由說明
3.1路由定義位置
URL是Web服務的入口,用戶通過瀏覽器發(fā)送過來的任何請求,都是發(fā)送到一個指定的URL地址,然后被響應。
Django奉行DRY主義,提倡使用簡潔、優(yōu)雅的URL,沒有.php或.cgi這種后綴,更不會單獨使用0、2097、1-1-1928、00這樣無意義的東西。
一、概述
URL路由在Django項目中的體現(xiàn)就是urls.py文件,這個文件可以有很多個,但絕對不會在同一目錄下。實際上Django提倡項目有個根urls.py,各app下分別有自己的一個urls.py,既集中又分治,是一種解耦的模式。
Django的主要路由信息定義在工程同名目錄下的urls.py文件中,該文件是Django解析路由的入口。
每個子應用為了保持相對獨立,可以在各個子應用中定義屬于自己的urls.py來保存該應用的路由。
然后用主路由文件包含各應用的子路由數(shù)據(jù)。
URLconf不檢查使用何種HTTP請求方法,所有請求方法POST、GET、HEAD等都將路由到同一個URL的同一個視圖。在視圖中,才根據(jù)具體請求方法的不同,進行不同的處理。
3.2路由解析順序
Django在接收到一個請求時,
從主路由文件中的urlpatterns列表中以由上至下的順序查找對應路由規(guī)
則,
如果發(fā)現(xiàn)規(guī)則為include包含,則再進入被包含的urls中的urlpatterns列表由上至下進行查詢。
值得關(guān)注的由上至下的順序,有可能會使上面的路由屏蔽掉下面的路由,帶來非預期結(jié)果。
例如:
app_name = 'books'
urlpatterns = [
path('index/',views.index,name='index'),
path('index00',views.ind),
]
即使訪問index00路徑,預期應該進入ind視圖執(zhí)行,但實際優(yōu)先查找到了indexy路由規(guī)則也與
index00/路徑匹配,實際進入了index視圖執(zhí)行。
3.3路由命名與resverse反解析
在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。
1) 在使用include函數(shù)定義路由時,可以使用namespace參數(shù)定義路由的命名空間,如
命名空間表示
path('books/', include('books.urls',namespace='books')),
凡是books.urls中定義的路由,均屬于namespace指明的books名下。
命名空間的作用:避免不同應用中的路由使用了相同的名字發(fā)生沖突,使用命名空間區(qū)別開。
2在定義普通路由時,可以使用name參數(shù)指明路由的名字,
如 reverse反解析
使用reverse函數(shù),可以根據(jù)路由名稱,返回具體的路徑,如:
from django.urls import reverse # 注意導包路徑
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('books:index') # 返回 /books/index/
print(url)
return HttpResponse('say')
對于未指明namespace的,reverse(路由name)
對于指明namespace的,reverse(命名空間namespace:路由name)
-
路徑結(jié)尾斜線/的說明
Django中定義路由時,通常以斜線/結(jié)尾,其好處是用戶訪問不以斜線/結(jié)尾的相同路徑時,Django會
把用戶重定向到以斜線/結(jié)尾的路徑上,而不會返回404不存在。如
用戶訪問 index 或者 index/ 網(wǎng)址,均能訪問到index視圖。
說明:
re_path(r'^users/', include('users.urls', namespace='users')),
雖然路由結(jié)尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設計理念。
是否結(jié)尾帶/以所屬公司定義風格為準。
from django.shortcuts import render,reverse,redirect
# 重定向的使用
def index2(request):
# return redirect('index')
return redirect(reverse('index'))
# return HttpResponse('index2')
Django如何處理請求
Django如何處理請求
當用戶請求一個頁面時,Django根據(jù)下面的邏輯執(zhí)行操作:
決定要使用的根URLconf模塊。通常,這是ROOT_URLCONF設置的值,但是如果傳入的HttpRequest對象具有urlconf屬性(由中間件設置),則其值將被用于代替ROOT_URLCONF設置。也就是說你可以自定義項目入口url是哪個文件!
加載該模塊并尋找可用的urlpatterns。 它是django.urls.path()或者django.urls.re_path()實例的一個列表。
依次匹配每個URL模式,在與請求的URL相匹配的第一個模式停下來。也就是說,url匹配是從上往下的短路操作,所以url在列表中的位置非常關(guān)鍵。
導入并調(diào)用匹配行中給定的視圖,該視圖是一個簡單的Python函數(shù)(被稱為視圖函數(shù)),或基于類的視圖。 視圖將獲得如下參數(shù):
一個HttpRequest 實例。
如果匹配的表達式返回了未命名的組,那么匹配的內(nèi)容將作為位置參數(shù)提供給視圖。
關(guān)鍵字參數(shù)由表達式匹配的命名組組成,但是可以被django.urls.path()的可選參數(shù)kwargs覆蓋。
如果沒有匹配到任何表達式,或者過程中拋出異常,將調(diào)用一個適當?shù)腻e誤處理視圖。(比如403,比如無任何反應)