PythonWeb框架要點(diǎn)、Django介紹、工程搭建、配置、靜態(tài)文件與路由
1.Python Web 框架要點(diǎn)
<1>Web應(yīng)用程序處理流程
? 中間層處理也叫做中間件處理,類似請求鉤子
<2>Web程序框架的意義
? 1>用于搭建Web應(yīng)用程序
? 2>免去不同Web應(yīng)用相同代碼部分的重復(fù)編寫,只需關(guān)心Web應(yīng)用核心的業(yè)務(wù)邏輯實(shí)現(xiàn)
<3>Web應(yīng)用程序的本質(zhì)
? 1>接收并解析HTTP請求,獲取具體的請求信息
? 2>處理本次HTTP請求,即完成本次請求的業(yè)務(wù)邏輯處理
? 3>構(gòu)造并返回處理結(jié)果——HTTP響應(yīng)
<4>Web框架學(xué)習(xí)方法
? 如何搭建工程程序
? ? ? 工程的組建
? ? ? 工程的配置
? ? ? 路由定義
? ? ? 視圖函數(shù)定義
? 如何獲取請求數(shù)據(jù)(操作request對象)
? 如何構(gòu)造響應(yīng)數(shù)據(jù)(構(gòu)造response對象)
? 如何使用中間層
? 框架提供的其他功能組件的使用
? ? ? 數(shù)據(jù)庫
? ? ? 模板
? ? ? 表單
? ? ? admin
<5>學(xué)習(xí)一個新的Web框架的步驟
? 1>如果有官網(wǎng),注冊成為他的開發(fā)者
? ? ? 很多都是注冊后才能得到app key,然后才能使用
? 2>進(jìn)入官網(wǎng),找案例demo,把源碼下載下來,看。
? 3>查看官方文檔
? ? ? 仔細(xì)看官方文檔,不懂就繼續(xù)看。
2.Django介紹
<1>簡介
Django,發(fā)音為[`d???ɡ??],是用python語言寫的開源web開發(fā)框架,并遵循MVC設(shè)計。勞倫斯出版集團(tuán)為了開發(fā)以新聞內(nèi)容為主的網(wǎng)站,而開發(fā)出來了這個框架,于2005年7月在BSD許可證下發(fā)布。這個名稱來源于比利時的爵士音樂家DjangoReinhardt,他是一個吉普賽人,主要以演奏吉它為主,還演奏過小提琴等。由于Django在近年來的迅速發(fā)展,應(yīng)用越來越廣泛,被著名IT開發(fā)雜志SDTimes評選為2013SDTimes100,位列"API、庫和框架"分類第6位,被認(rèn)為是該領(lǐng)域的佼佼者。
Django的主要目的是簡便、快速的開發(fā)數(shù)據(jù)庫驅(qū)動的網(wǎng)站。它強(qiáng)調(diào)代碼復(fù)用,多個組件可以很方便的以"插件"形式服務(wù)于整個框架,Django有許多功能強(qiáng)大的第三方插件,你甚至可以很方便的開發(fā)出自己的工具包。這使得Django具有很強(qiáng)的可擴(kuò)展性。它還強(qiáng)調(diào)快速開發(fā)和DRY(DoNotRepeatYourself)原則。
<2>特點(diǎn)
? 1>重量級框架
? ? ? 對比Flask框架,Django原生提供了眾多的功能組件,讓開發(fā)更簡便快速。
? ? ? 提供項(xiàng)目工程管理的自動化腳本工具
? ? ? 數(shù)據(jù)庫ORM支持(對象關(guān)系映射,英語:Object Relational Mapping)
? ? ? 模板
? ? ? 表單
? ? ? Admin管理站點(diǎn)
? ? ? 文件管理
? ? ? 認(rèn)證權(quán)限
? ? ? session機(jī)制
? ? ? 緩存
? 2>MVT模式
? ? ? 有一種程序設(shè)計模式叫MVC,其核心思想是分工、解耦,讓不同的代碼塊之間降低耦合,增強(qiáng)代碼的可擴(kuò)展性和可移植性,實(shí)現(xiàn)向后兼容。
? ? ? MVC的全拼為Model-View-Controller,最早由TrygveReenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀(jì)80年代為程序語言Smalltalk發(fā)明的一種軟件設(shè)計模式,是為了將傳統(tǒng)的輸入(input)、處理(processing)、輸出(output)任務(wù)運(yùn)用到圖形化用戶交互模型中而設(shè)計的。隨著標(biāo)準(zhǔn)輸入輸出設(shè)備的出現(xiàn),開發(fā)人員只需要將精力集中在業(yè)務(wù)邏輯的分析與實(shí)現(xiàn)上。后來被推薦為Oracle旗下Sun公司Java EE平臺的設(shè)計模式,并且受到越來越多的使用ColdFusion和PHP的開發(fā)者的歡迎。現(xiàn)在雖然不再使用原來的分工方式,但是這種分工的思想被沿用下來,廣泛應(yīng)用于軟件工程中,是一種典型并且應(yīng)用廣泛的軟件架構(gòu)模式。后來,MVC的思想被應(yīng)用在了Web開發(fā)方面,被稱為Web MVC框架。
? ? ? MVC模式說明(Model-View-Controller)
? ? ? ? ? ■ M全拼為Model,主要封裝對數(shù)據(jù)庫層的訪問,對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增、刪、改、查操作。
? ? ? ? ? ■ V全拼為View,用于封裝結(jié)果,生成頁面展示的html內(nèi)容。
? ? ? ? ? ■ C全拼為Controller,用于接收請求,處理業(yè)務(wù)邏輯,與Model和View交互,返回結(jié)果。
? ? ? Django的MVT(Model-View-Template)
? ? ? ? ? ■ M全拼為Model,與MVC中的M功能相同,負(fù)責(zé)和數(shù)據(jù)庫交互,進(jìn)行數(shù)據(jù)處理。
? ? ? ? ? ■ V全拼為View,與MVC中的C功能相同,接收請求,進(jìn)行業(yè)務(wù)處理,返回應(yīng)答。
? ? ? ? ? ■ T全拼為Template,與MVC中的V功能相同,負(fù)責(zé)封裝構(gòu)造要返回的html。
注:差異就在于黑線黑箭頭標(biāo)識出來的部分
<3>Django學(xué)習(xí)資料
? 官方網(wǎng)站
? Github源碼
? 1.11版英文文檔
? 1.11版中文文檔
? Django Book 教程
? Tange With Django 教程
3.工程搭建
<1>環(huán)境安裝
? 1>創(chuàng)建虛擬環(huán)境
? ? ? 注意需要聯(lián)網(wǎng)
? ? ? mkvirtualenv 虛擬環(huán)境名 -p python3
mkvirtualenv django_py3_1.11 -p python3
? 2>安裝Django
? ? ? 使用django 1.11.11版本,注意需要聯(lián)網(wǎng)
? ? ? 安裝最新版本
pip install django
? ? ? 安裝指定版本
pip install django==1.11.11
? 3>卸載Django
pip uninstall Django
? 4>查看Django版本:
python -c "import django; print(django.get_version())"
? 5>查看Django安裝路徑:
python -c "import sys; sys.path = sys.path[1:]; import django; print(django.__path__)"
? 6>復(fù)習(xí)虛擬環(huán)境和pip的命令
? ? ? 虛擬環(huán)境
? ? ? ? ? ■ 創(chuàng)建虛擬環(huán)境
? ? ? ? ? ? ? mkvirtualenv
? ? ? ? ? ■ 刪除虛擬環(huán)境
? ? ? ? ? ? ? rmvirtualenv
? ? ? ? ? ■ 進(jìn)入虛擬環(huán)境、查看所有虛擬環(huán)境
? ? ? ? ? ? ? workon
? ? ? ? ? ■ 退出虛擬環(huán)境
? ? ? ? ? ? ? deactivate
? ? ? pip
? ? ? ? ? ■ 安裝依賴包
? ? ? ? ? ? ? pip install
? ? ? ? ? ■ 卸載依賴包
? ? ? ? ? ? ? pip uninstall
? ? ? ? ? ■ 查看已安裝的依賴包
? ? ? ? ? ? ? pip list
? ? ? ? ? ■ 凍結(jié)當(dāng)前環(huán)境的依賴包
? ? ? ? ? ? ? pip freeze
<2>創(chuàng)建工程
在使用Flask框架時,項(xiàng)目工程目錄的組織與創(chuàng)建是需要我們自己手動創(chuàng)建完成的。
在django中,項(xiàng)目工程目錄可以借助django提供的命令幫助我們創(chuàng)建。
? 1>創(chuàng)建一個項(xiàng)目
? ? ? 創(chuàng)建工程的命令為:
? ? ? ? ? ■ django-admin startproject 工程名稱
? ? ? 例如:想要在桌面的code目錄中創(chuàng)建一個名為demo的項(xiàng)目工程,可執(zhí)行如下命令:
cd ~/Desktop/code
django-admin startproject demo
執(zhí)行后,會多出一個新目錄名為demo,此即為新創(chuàng)建的工程目錄。
? 2>工程目錄說明
? ? ? 查看創(chuàng)建的工程目錄,結(jié)構(gòu)如下
? ? ? ? ? ■ 與項(xiàng)目同名的目錄,此處為demo。
? ? ? ? ? ■ settings.py 是項(xiàng)目的整體配置文件。
? ? ? ? ? ■ urls.py 是項(xiàng)目的URL配置文件。
? ? ? ? ? ■ wsgi.py 是項(xiàng)目與WSGI兼容的Web服務(wù)器入口。
? ? ? ? ? ■ manage.py 是項(xiàng)目管理文件,通過它管理項(xiàng)目。
? 3>運(yùn)行開發(fā)服務(wù)器
? ? ? 在開發(fā)階段,為了能夠快速預(yù)覽到開發(fā)的效果,django提供了一個純python編寫的輕量級web服務(wù)器,僅在開發(fā)階段使用。
? ? ? 運(yùn)行服務(wù)器命令如下:
? ? ? ? ? ■ python manage.py runserver ip:端口
? ? ? ? ? ■ python manage.py runserver
? ? ? ? ? ■ 可以不寫IP和端口,默認(rèn)IP是127.0.0.1,默認(rèn)端口為8000。
? ? ? django默認(rèn)工作在調(diào)式Debug模式下,如果增加、修改、刪除文件,服務(wù)器會自動重啟。
? ? ? 按ctrl+c停止服務(wù)器。
<3>創(chuàng)建子應(yīng)用
在Web應(yīng)用中,通常有一些業(yè)務(wù)功能模塊是在不同的項(xiàng)目中都可以復(fù)用的,故在開發(fā)中通常將工程項(xiàng)目拆分為不同的子功能模塊,各功能模塊間可以保持相對的獨(dú)立,在其他工程項(xiàng)目中需要用到某個特定功能模塊時,可以將該模塊代碼整體復(fù)制過去,達(dá)到復(fù)用。
在Flask框架中也有類似子功能應(yīng)用模塊的概念,即藍(lán)圖Blueprint。
Django的視圖編寫是放在子應(yīng)用中的。
? 1>創(chuàng)建子應(yīng)用模塊目錄
? ? ? python manage.py startapp 子應(yīng)用名稱
? ? ? ? ? ■ python : python3解釋器 manage.py : 上?章創(chuàng)建項(xiàng)??程的時候, ?成的管理整個項(xiàng)?的?件
? ? ? ? ? ■ manage.py 為上述創(chuàng)建工程時自動生成的管理文件。
? ? ? ? ? ■ startapp : 創(chuàng)建?應(yīng)?的指令
? ? ? ? ? ■ ?應(yīng)?名稱 : 這個名稱可以??隨意定, ?般會根據(jù)項(xiàng)?需求來指定
? ? ? 例如,在剛才創(chuàng)建的demo工程中,想要創(chuàng)建一個用戶users子應(yīng)用模塊,可執(zhí)行:
cd ~/Desktop/code/demo
python manage.py startapp users
執(zhí)行后,可以看到工程目錄中多出了一個名為users的子目錄。
? 2>子應(yīng)用目錄說明
? ? ? 查看此時的工程目錄,結(jié)構(gòu)如下:
? ? ? admin.py 文件跟網(wǎng)站的后臺管理站點(diǎn)配置相關(guān)。
? ? ? apps.py 文件用于配置當(dāng)前子應(yīng)用的相關(guān)信息。
? ? ? migrations 目錄用于存放數(shù)據(jù)庫遷移歷史文件。
? ? ? models.py 文件用戶保存數(shù)據(jù)庫模型類。
? ? ? tests.py 文件用于開發(fā)測試用例,編寫單元測試。
? ? ? views.py 文件用于編寫Web應(yīng)用視圖。
? 3>注冊安裝子應(yīng)用
? ? ? 創(chuàng)建出來的子應(yīng)用目錄文件雖然被放到了工程項(xiàng)目目錄中,但是django工程并不能立即直接使用該子應(yīng)用,需要注冊安裝后才能使用。
? ? ? 在工程配置文件settings.py中,INSTALLED_APPS項(xiàng)保存了工程中已經(jīng)注冊安裝的子應(yīng)用,初始工程中的INSTALLED_APPS如下圖中的前6行
? ? ? ? ? ■ 注冊安裝一個子應(yīng)用的方法,即是將子應(yīng)用的配置信息文件apps.py中的Config類添加到INSTALLED_APPS列表中。
? ? ? ? ? ■ 例如,將剛創(chuàng)建的users子應(yīng)用添加到工程中,可在INSTALLED_APPS列表中添加'users.apps.UsersConfig'。
<4>創(chuàng)建視圖
同F(xiàn)lask框架一樣,Django也用視圖來編寫Web應(yīng)用的業(yè)務(wù)邏輯。
Django的視圖是定義在子應(yīng)用的views.py中的。
? 1>創(chuàng)建視圖函數(shù)
? ? ? 打開剛創(chuàng)建的users模塊,在views.py中編寫視圖代碼。
? 說明:
? ? ? 視圖函數(shù)的第一個傳入?yún)?shù)必須定義,用于接收Django構(gòu)造的包含了請求數(shù)據(jù)的HttpReqeust對象,通常名為request。
? ? ? 視圖函數(shù)的返回值必須為一個響應(yīng)對象,不能像Flask一樣直接返回一個字符串,可以將要返回的字符串?dāng)?shù)據(jù)放到一個HTTPResponse對象中。
? 2>定義路由URL
? ? ? 在子應(yīng)用中新建一個urls.py文件用于保存該應(yīng)用的路由。
? ? ? 在users/urls.py文件中定義路由信息。
from django.conf.urls import url
from . import views
# urlpatterns是被django自動識別的路由列表變量
urlpatterns = [
? ? # 每個路由信息都需要使用url函數(shù)來構(gòu)造
? ? # url(路徑, 視圖)
? ? url(r'^index/$', views.index),
]
? 3>在工程總路由demo/urls.py中添加子應(yīng)用的路由數(shù)據(jù)。
? ? ? 使用include來將子應(yīng)用users里的全部路由包含進(jìn)工程路由中;
? ? ? r'^users/' 決定了users子應(yīng)用的所有路由都已/users/開頭,如我們剛定義的視圖index,其最終的完整訪問路徑為/users/index/。
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
? ? url(r'^admin/', admin.site.urls),? # django默認(rèn)包含的
? ? # 添加
? ? url(r'^users/', include('users.urls')),
]
? 4>啟動運(yùn)行
? ? ? 重新啟動django程序
? ? ? python manage.py runserver
? ? ? 在瀏覽器中輸入網(wǎng)址127.0.0.1:8000/users/index/ 可看到返回的信息
4.配置、靜態(tài)文件與路由
<1>配置文件
? 1>BASE_DIR
? ? ? BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
? ? ? 當(dāng)前工程的根目錄,Django會依此來定位工程內(nèi)的相關(guān)文件,我們也可以使用該參數(shù)來構(gòu)造文件路徑。
? ? ? ? ? ■ ___file___ : 可以理解為當(dāng)前的?件
? ? ? ? ? ■ os.path.abspath ( ?件 ) : 獲取這個?件的絕對路徑
? ? ? ? ? ■ os.path.dirname( 路徑 ) : 獲取這個路徑的上?級路徑,
? ? ? ? ? ? ? 例如: path1 = os.path.dirname( 'c://home/setttings.py' )
? ? ? ? ? ? ? 那么獲取的結(jié)果為: path1 = 'c://home'
? ? ? ? ? ■ os.path.dirname( 路徑 ) : 再次獲取這個路徑的下?級路徑
? ? ? ? ? ■ 這樣獲取到的 BASE_DIR 其實(shí)就是當(dāng)前項(xiàng)?的根?錄.
? 2>DEBUG
? ? ? 調(diào)試模式,創(chuàng)建工程后初始值為True,即默認(rèn)工作在調(diào)試模式下。
? ? ? 作用:
? ? ? ? ? ■ 修改代碼文件,程序自動重啟
? ? ? ? ? ■ Django程序出現(xiàn)異常時,向前端顯示詳細(xì)的錯誤追蹤信息,例如
? ? ? ? ? ■ 而非調(diào)試模式下,僅返回Server Error (500)
? ? ? 注意:部署線上運(yùn)行的Django不要運(yùn)行在調(diào)式模式下,記得修改DEBUG=False。
? 3>本地語言與時區(qū)
Django支持本地化處理,即顯示語言與時區(qū)支持本地化。
本地化是將顯示的語言、時間等使用本地的習(xí)慣,這里的本地化就是進(jìn)行中國化,中國大陸地區(qū)使用簡體中文,時區(qū)使用亞洲/上海時區(qū),
初始化的工程默認(rèn)語言和時區(qū)為英語和UTC標(biāo)準(zhǔn)時區(qū)
LANGUAGE_CODE = 'en-us'? # 語言 英語
TIME_ZONE = 'UTC'? # 時區(qū)
將語言和時區(qū)修改為中國大陸信息
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
<2>靜態(tài)文件
? 我們?般會把項(xiàng)?中的CSS、圖?、js以及html等看做靜態(tài)?件。
? 靜態(tài)?件我們會放在?個靜態(tài)(static)?件夾中, 統(tǒng)?管理 我們在html??中調(diào)?時,需要指定靜態(tài)?件的路徑,故, Django中提供了?種?于配置靜態(tài)?件路徑的解析? 式。
? 靜態(tài)?件可以放在項(xiàng)?根?錄下,也可以放在應(yīng)?的?錄下,由于有些靜態(tài)?件在項(xiàng)?中是通?的,所以推薦放在項(xiàng)?的根?錄下,?便管理。
? 為了提供靜態(tài)文件,需要配置兩個參數(shù):
? ? ? STATICFILES_DIRS 存放查找靜態(tài)文件的目錄
? ? ? STATIC_URL 訪問靜態(tài)文件的URL前綴
? 1>在項(xiàng)目根目錄下創(chuàng)建static_files目錄來保存靜態(tài)文件。
? 2>在demo/settings.py中修改靜態(tài)文件的兩個參數(shù)為
STATIC_URL = '/static/'
STATICFILES_DIRS = [
? ? os.path.join(BASE_DIR, 'static_files'),
]
? 3>此時在static_files添加的任何靜態(tài)文件都可以使用網(wǎng)址 /static/文件在static_files中的路徑 來訪問了。
? 例如,我們向static_files目錄中添加一個index.html文件,在瀏覽器中就可以使用127.0.0.1:8000/static/index.html來訪問。
? 或者我們在static_files目錄中添加了一個子目錄和文件goods/detail.html,在瀏覽器中就可以使用127.0.0.1:8000/static/goods/detail.html來訪問。
? 注意
? ? ? Django 僅在調(diào)試模式下(DEBUG=True)能對外提供靜態(tài)文件。
? ? ? 當(dāng)DEBUG=False工作在生產(chǎn)模式時,Django不再對外提供靜態(tài)文件,需要是用collectstatic命令來收集靜態(tài)文件并交由其他靜態(tài)文件服務(wù)器來提供。(詳細(xì)在部署時會講)
<3>路由說明
? 1>路由定義位置
? ? ? Django的主要路由信息定義在工程同名目錄下的urls.py文件中,該文件是Django解析路由的入口。
? ? ? 每個子應(yīng)用為了保持相對獨(dú)立,可以在各個子應(yīng)用中定義屬于自己的urls.py來保存該應(yīng)用的路由。然后用主路由文件包含各應(yīng)用的子路由數(shù)據(jù)。
? ? ? 除了上述方式外,也可將工程的全部路由信息都定義在主路由文件中,子應(yīng)用不再設(shè)置urls.py。如:
from django.conf.urls import url
from django.contrib import admin
import users.views
urlpatterns = [
? ? url(r'^admin/', admin.site.urls),
? ? url(r'^users/index/$', users.views.index)
]
? 2>路由解析順序
? ? ? Django在接收到一個請求時,從主路由文件中的urlpatterns列表中以由上至下的順序查找對應(yīng)路由規(guī)則,如果發(fā)現(xiàn)規(guī)則為include包含,則再進(jìn)入被包含的urls中的urlpatterns列表由上至下進(jìn)行查詢。
? ? ? 在正則匹配的時候結(jié)尾加/$,比如 r'^say/$'
? ? ? 值得關(guān)注的由上至下的順序,有可能會使上面的路由屏蔽掉下面的路由,帶來非預(yù)期結(jié)果。例如:
urlpatterns = [
? ? url(r'^say', views.say),
? ? url(r'^sayhello', views.sayhello),
]
? 即使訪問sayhello/路徑,預(yù)期應(yīng)該進(jìn)入sayhello視圖執(zhí)行,但實(shí)際優(yōu)先查找到了say路由規(guī)則也與sayhello/路徑匹配,實(shí)際進(jìn)入了say視圖執(zhí)行。
? 提示:需要注意定義路由的順序,避免出現(xiàn)屏蔽效應(yīng)。
? 兩種解決?法:
? ? ? 第?種: 調(diào)整書寫順序
from django.conf.urls
import url from . import views
urlpatterns = [
# 1. 調(diào)整書寫順序
url(r'^sayhello', views.sayhello),
url(r'^say', views.say)
]
? ? ? 第?種: 調(diào)整正則書寫?式,推薦使用
from django.conf.urls
import url from . import views
urlpatterns = [
# 2.調(diào)整正則
url(r'^say/$', views.say),
url(r'^sayhello/$', views.sayhello)
]
? 3>路由命名
? ? ? 在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。
? ? ? 1.在使用include函數(shù)定義路由時,可以使用namespace參數(shù)定義路由的命名空間
? ? ? ? ? ■ 如url(r'^users/', include('users.urls', namespace='users'))
? ? ? ? ? ■ 命名空間表示,凡是users.urls中定義的路由,均屬于namespace指明的users名下。
? ? ? ? ? ■ 命名空間的作用:避免不同應(yīng)用中的路由使用了相同的名字發(fā)生沖突,使用命名空間區(qū)別開。
? ? ? 2.在定義子路由時,可以使用name參數(shù)指明路由的名字,如
urlpatterns = [
? ? url(r'^index/$', views.index, name='index'),
? ? url(r'^say', views.say, name='say'),
]
? 4>reverse反解析(逆向)
? ? ? 使用reverse函數(shù),可以根據(jù)路由名稱,返回具體的路徑,如:
from django.core.urlresolvers import reverse? # 注意導(dǎo)包路徑
def index(request):
? ? return HttpResponse("hello the world!")
def say(request):
? ? url = reverse('users:index')? # 返回 /users/index/
? ? print(url)
? ? return HttpResponse('say')
? ? ? 對于未指明namespace的,reverse(路由name)
? ? ? ? ? ■ 例如: 只指定了name='indexname', 沒有指定namespace,那么調(diào)?的時候可以寫成:
? ? ? ? ? ? ? url = reverse('indexname')也可以獲取到url的路徑:/users/index/
? ? ? 對于指明namespace的,reverse(命名空間namespace:路由name)
? ? ? ? ? ■ 例如:
? ? ? ? ? ? ? url(r'^users/', include(users.urls, namespace='indexnamespace'))
? ? ? ? ? ? ? url(r'^index/$', views.index, name='indexname')
? ? ? ? ? ? ? 使?reverse反解析: url = reverse('indexnamespace:indexname')
? ? ? ? ? ? ? 最后獲取的結(jié)果是: /users/index/
? 5>路徑結(jié)尾斜線/的說明
? ? ? Django中定義路由時,通常以斜線/結(jié)尾,其好處是用戶訪問不以斜線/結(jié)尾的相同路徑時,Django會把用戶重定向到以斜線/結(jié)尾的路徑上,而不會返回404不存在。如:
urlpatterns = [
? ? url(r'^index/$', views.index, name='index'),
]
? 用戶訪問 index 或者 index/ 網(wǎng)址,均能訪問到index視圖。
? 說明:
? ? ? 雖然路由結(jié)尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設(shè)計理念。
? ? ? 是否結(jié)尾帶/以所屬公司定義風(fēng)格為準(zhǔn)。
<4>App應(yīng)用配置
? 在每個應(yīng)用目錄中都包含了apps.py文件,用于保存該應(yīng)用的相關(guān)信息。
? 在創(chuàng)建應(yīng)用時,Django會向apps.py文件中寫入一個該應(yīng)用的配置類,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
? ? name = 'users'
? 我們將此類添加到工程settings.py中的INSTALLED_APPS列表中,表明注冊安裝具備此配置屬性的應(yīng)用。
? AppConfig.name 屬性表示這個配置類是加載到哪個應(yīng)用的,每個配置類必須包含此屬性,默認(rèn)自動生成。
? AppConfig.verbose_name 屬性用于設(shè)置該應(yīng)用的直觀可讀的名字,此名字在Django提供的Admin管理站點(diǎn)中會顯示,如
from django.apps import AppConfig
class UsersConfig(AppConfig):
? ? name = 'users'
? ? verbose_name = '用戶管理'
? 所以: ?般我們會在 UsersConfig ?件中添加上 verbose_name 屬性, 為admin管理站點(diǎn)提供應(yīng)?的信息.
<5>數(shù)據(jù)庫
? ? django服務(wù)器運(yùn)?成功后,項(xiàng)?中會多出?個服務(wù)器?件: db.sqlite3 這是因?yàn)? django默認(rèn)會對數(shù)據(jù)庫進(jìn)??持, 如果我們沒有配置數(shù)據(jù)庫, 那么django會??調(diào)?sqlite3這個數(shù)據(jù) 庫, 并且創(chuàng)建
? 注意:
? ? ? python2.x使用mysqldb連接mysql數(shù)據(jù)庫
? ? ? python3.x使用pymysq連接mysql數(shù)據(jù)庫
? ? ? 如果使用的是python3.x,需要先安裝pymysql
pip3 install pymysql
? ? ? 這個時候Django默認(rèn)的還是使用MySQLdb,使用pymysql代替MySQLdb
? ? ? 在站點(diǎn)(也就是和工程目錄同名的總應(yīng)用)的__init__.py文件中添加
import pymysql
pymysql.install_as_MySQLdb()
或者
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
? 然后python3 manage.py migrate成功
? 這樣Django站點(diǎn)就成功使用MySQL作為數(shù)據(jù)庫了
? 1>修改數(shù)據(jù)庫
DATABASES = {
? ? 'default': {
? ? ? ? # 'ENGINE': 'django.db.backends.sqlite3',
? ? ? ? # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
? ? ? ? 'ENGINE': 'django.db.backends.mysql',
? ? ? ? # 數(shù)據(jù)庫的名稱,在mysql中創(chuàng)建一個
? ? ? ? 'NAME': 'django',
? ? ? ? 'USER': 'root',
? ? ? ? 'PASSWORD': 'mysql',
? ? ? ? # 使用默認(rèn)主機(jī)、端口
? ? ? ? 'HOST': '',
? ? ? ? 'PORT': '',
? ? }
}
? 2>創(chuàng)建數(shù)據(jù)庫
打開mysql命令對話框,創(chuàng)建django數(shù)據(jù)庫
create database django charset=utf8;
? 3>運(yùn)行:
python manage.py migrate