Django

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容