Django框架的介紹
Django的官網(wǎng)
官方網(wǎng)址: http://www.djangoproject.com
中文文檔(第三方):
Django的離線文檔
解壓縮數(shù)據(jù)包 django-docs-1.11-en.zip
用瀏覽器打開 django-docs-1.11-en/index.html
Django的安裝
查看已安裝的版本
>>>importdjango
>>>print(django.VERSION)
(1,11,8,'final',0)
安裝
在線安裝
$ sudo pip3 install django? 安裝django的最新版本
或
$ sudo pip3 install django[==版本] 安裝django的指定版本
如:
$ sudo pip3 install django==1.11.8
離線安裝
下載安裝包:
安裝離線包
$ tar -xvf Django-1.11.8.tar.gz
$ cd Django-1.11.8
$ sudo python3 setup.py install
用wheel離線安裝
下載安裝包:
pip3 download -d /home/tarena/django_packs django==1.11.8
安裝離線包
$ pip3 install Django-1.11.8.whl
Django的卸載
$ pip3 uninstall django
Django 的開發(fā)環(huán)境
Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6(長期支持版本 LTS)
注: Django 1.11.x 不支持 Python 3.7
Django框架開發(fā)
創(chuàng)建項(xiàng)目的指令
$ django-admin startproject 項(xiàng)目名稱
如:
$ django-admin startproject mysite1
運(yùn)行
$ cdmysite1
$ python3manage.py runserver
# 或
$ python3manage.py runserver5000# 指定只能本機(jī)使用127.0.0.1的5000端口訪問本機(jī)
Django項(xiàng)目的目錄結(jié)構(gòu)
示例:
$ django-adminstartproject mysite1
$ treemysite1/
mysite1/
├── manage.py
└── mysite1
?? ├── __init__.py
?? ├── settings.py
?? ├── urls.py
?? └── wsgi.py
?
1directory,5files
項(xiàng)目目錄結(jié)構(gòu)解析:
manage.py
此文件是項(xiàng)目管理的主程序,在開發(fā)階段用于管理整個項(xiàng)目的開發(fā)運(yùn)行的調(diào)式
manage.py 包含項(xiàng)目管理的子命令, 如:
python3 manage.py runserver 啟動服務(wù)
python3 manage.py startapp 創(chuàng)建應(yīng)用
python3 manage.py migrate 數(shù)據(jù)庫遷移
...
mysite1 項(xiàng)目包文件夾
項(xiàng)目包的主文件夾(默認(rèn)與項(xiàng)目名稱一致)
__init__.py
包初始化文件,當(dāng)此項(xiàng)目包被導(dǎo)入(import)時此文件會自動運(yùn)行
wsgi.py
WSGI 即 Web Server Gateway Interface
WEB服務(wù)網(wǎng)關(guān)接口的配置文件觉鼻,僅部署項(xiàng)目時使用
urls.py
項(xiàng)目的基礎(chǔ)路由配置文件妇智,所有的動態(tài)路徑必須先走該文件進(jìn)行匹配
settings.py
Django項(xiàng)目的配置文件, 此配置文件中的一些全局變量將為Django框架的運(yùn)行傳遞一些參數(shù)
setting.py 配置文件,啟動服務(wù)時自動調(diào)用沪羔,
此配置文件中也可以定義一些自定義的變量用于作用全局作用域的數(shù)據(jù)傳遞
settings.py 文件介紹
https://docs.djangoproject.com/en/1.11/ref/settings/
BASE_DIR
用于綁定當(dāng)前項(xiàng)目的絕對路徑(動態(tài)計算出來的), 所有文件都可以依懶此路徑
DEBUG
用于配置Django項(xiàng)目的啟用模式, 取值:
True 表示開發(fā)環(huán)境中使用 調(diào)試模式(用于開發(fā)中)
False 表示當(dāng)前項(xiàng)目運(yùn)行在生產(chǎn)環(huán)境中(不啟用調(diào)試)
ALLOWED_HOSTS
設(shè)置允許訪問到本項(xiàng)目的網(wǎng)絡(luò)地址列表,取值:
[] 空列表,表示只有請求頭中host為127.0.0.1, localhost能訪問本項(xiàng)目
['*']缤骨,表示任何請求頭的host都能訪問到當(dāng)前項(xiàng)目
['192.168.1.3', '127.0.0.1'] 表示只有當(dāng)前兩個host頭的值能訪問當(dāng)前項(xiàng)目
注意:
如果要在局域網(wǎng)其它主機(jī)也能訪問此主機(jī),啟動方式應(yīng)使用如下模式:
python3 manage.py runserver 0.0.0.0:5000 # 指定網(wǎng)絡(luò)設(shè)備所有主機(jī)都可以通過5000端口訪問(需加ALLOWED_HOSTS = ['*'])
INSTALLED_APPS
指定當(dāng)前項(xiàng)目中安裝的應(yīng)用列表
MIDDLEWARE
用于注冊中間件
TEMPLATES
用于指定模板的配置信息
DATABASES
用于指定數(shù)據(jù)庫的配置信息
LANGUAGE_CODE
用于指定語言配置
取值:
英文 : "en-us"
中文 : "zh-Hans"
TIME_ZONE
用于指定當(dāng)前服務(wù)器端時區(qū)
取值:
世界標(biāo)準(zhǔn)時間: "UTC"
中國時區(qū) : "Asia/Shanghai"
ROOT_URLCONF
用于配置根級 url 配置 'mysite1.urls'
如:
ROOT_URLCONF = 'mysite1.urls'
注: 此模塊可以通過 from django.conf import settings 導(dǎo)入和使用
URL 介紹
url 即統(tǒng)一資源定位符 Uniform Resource Locator
作用:
用來表示互聯(lián)網(wǎng)上某個資源的地址鸥咖。
說明:
互聯(lián)網(wǎng)上的每個文件都有一個唯一的URL贞盯,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它杠氢。
URL的一般語法格式為:
protocol :// hostname[:port] / path [?query][#fragment]
如:
http://tts.tmooc.cn/video/showVideo?menuId=657421&version=AID201908#subject
說明:
protocol(協(xié)議)
http 通過 HTTP 訪問該資源昂勉。 格式 HTTP://
https 通過安全的 HTTPS 訪問該資源。 格式 HTTPS://
file 資源是本地計算機(jī)上的文件宪睹。格式: file:///
...
hostname(主機(jī)名)
是指存放資源的服務(wù)器的域名系統(tǒng)(DNS) 主機(jī)名愁茁、域名 或 IP 地址。
port(端口號)
整數(shù)亭病,可選鹅很,省略時使用方案的默認(rèn)端口;
各種傳輸協(xié)議都有默認(rèn)的端口號罪帖,如http的默認(rèn)端口為80促煮。
path(路由地址)
由零或多個“/”符號隔開的字符串邮屁,一般用來表示主機(jī)上的一個目錄或文件地址。路由地址決定了服務(wù)器端如何處理這個請求
query(查詢)
可選菠齿,用于給動態(tài)網(wǎng)頁傳遞參數(shù)佑吝,可有多個參數(shù),用“&”符號隔開绳匀,每個參數(shù)的名和值用“=”符號隔開芋忿。
fragment(信息片斷)
字符串,用于指定網(wǎng)絡(luò)資源中的片斷疾棵。例如一個網(wǎng)頁中有多個名詞解釋戈钢,可使用fragment直接定位到某一名詞解釋。
注: [] 代表其中的內(nèi)容可省略
視圖函數(shù)是用于接收一個瀏覽器請求并通過HttpResponse對象返回數(shù)據(jù)的函數(shù)陋桂。此函數(shù)可以接收瀏覽器請求并根據(jù)業(yè)務(wù)邏輯返回相應(yīng)的內(nèi)容給瀏覽器
視圖處理的函數(shù)的語法格式:
defxxx_view(request[,其它參數(shù)...]):
returnHttpResponse對象
參數(shù):
request用于綁定HttpRequest對象逆趣,通過此對象可以獲取瀏覽器的參數(shù)和數(shù)據(jù)
示例:
視圖處理函數(shù) views.py
# file : <項(xiàng)目名>/views.py
fromdjango.httpimportHttpResponse
defpage1_view(request):
html="<h1>這是第1個頁面</h1>"
returnHttpResponse(html)
settings.py 中的ROOT_URLCONF 指定了主路由配置列表urlpatterns的文件位置
urls.py 主路由配置文件
# file : <項(xiàng)目名>/urls.py
urlpatterns= [
url(r'^admin/',admin.site.urls),
...# 此處配置主路由
]
urlpatterns 是一個路由-視圖函數(shù)映射關(guān)的列表,此列表的映射關(guān)系由url函數(shù)來確定
url() 函數(shù)
用于描述路由與視圖函數(shù)的對應(yīng)關(guān)系
模塊
from django.conf.urls import url
語法:
url(regex, views, name=None)
參數(shù):
regex: 字符串類型,匹配的請求路徑嗜历,允許是正則表達(dá)式
views: 指定路徑所對應(yīng)的視圖處理函數(shù)的名稱
name: 為地址起別名宣渗,在模板中地址反向解析時使用
每個正則表達(dá)式前面的r表示'\'不轉(zhuǎn)義的原始字符串
練習(xí)
建立一個小網(wǎng)站:
輸入網(wǎng)址: http://127.0.0.1:8000, 在網(wǎng)頁中輸出 : 這是我的首頁
輸入網(wǎng)址: http://127.0.0.1:8000/page1, 在網(wǎng)頁中輸出 : 這是編號為1的網(wǎng)頁
輸入網(wǎng)址: http://127.0.0.1:8000/page2, 在網(wǎng)頁中輸出 : 這是編號為2的網(wǎng)頁
提示: 主頁路由的正則是? r'^$'
思考
建立如上一百個網(wǎng)頁該怎么辦?
在視圖函數(shù)內(nèi)梨州,可以用正則表達(dá)式分組 () 提取參數(shù)后用函數(shù)位置傳參傳遞給視圖函數(shù)
一個分組表示一個參數(shù),多個參數(shù)需要使用多個分組,并且使用個/隔開
如:
http://127.0.0.1:8000/year/2018
http://127.0.0.1:8000/year/2019
http://127.0.0.1:8000/year/????? # 四位數(shù)字
練習(xí):
定義一個路由的格式為:
http://127.0.0.1:8000/整數(shù)/操作字符串/整數(shù)
從路由中提取數(shù)據(jù)痕囱,做相應(yīng)的操作后返回給瀏覽器
如:
輸入: 127.0.0.1:8000/100/add/200
?? 頁面顯示結(jié)果:300
輸入: 127.0.0.1:8000/100/sub/200
?? 頁面顯示結(jié)果:-100
輸入: 127.0.0.1:8000/100/mul/200
?? 頁面顯示結(jié)果:20000
在url 的正則表達(dá)式中可以使用命名分組(捕獲分組)
說明:
在視圖函數(shù)內(nèi),可以用正則表達(dá)式分組 (?P<name>pattern) 提取參數(shù)后用函數(shù)關(guān)鍵字傳參傳遞給視圖函數(shù)
示例:
路由配置文件
# file : <項(xiàng)目名>/urls.py
# 以下示例匹配
# http://127.0.0.1:8000/person/xiaoming/20
# http://127.0.0.1:8000/person/xiaohong/29
# http://127.0.0.1:8000/person/xiaolan/9
urlpatterns= [
url(r'^admin/',admin.site.urls),
url(r'^person/(?P<name>\w+)/(?P<age>\d{1,2})',views.person_view),
]
練習(xí):
訪問地址:
http://127.0.0.1:8000/birthday/四位數(shù)字/一到兩位數(shù)字/一到兩位數(shù)字
http://127.0.0.1:8000/birthday/一到兩位數(shù)字/一到兩位數(shù)字/四位數(shù)字
最終輸出: 生日為: xxxx年xx月xx日
如:輸入網(wǎng)址: http://127.0.0.1:8000/birthday/2015/12/11顯示為: 生日為:2015年12月11日輸入網(wǎng)址: http://127.0.0.1:8000/birthday/2/28/2008顯示為: 生日為:2008年2月28日
請求是指瀏覽器端通過HTTP協(xié)議發(fā)送給服務(wù)器端的數(shù)據(jù)
響應(yīng)是指服務(wù)器端接收到請求后做相應(yīng)的處理后再回復(fù)給瀏覽器端的數(shù)據(jù)
根據(jù)HTTP標(biāo)準(zhǔn)暴匠,HTTP請求可以使用多種請求方法鞍恢。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法(最常用)
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP1.1 請求詳述
序號方法描述
1GET請求指定的頁面信息每窖,并返回實(shí)體主體帮掉。
2HEAD類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容窒典,用于獲取報頭
3POST向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)蟆炊。數(shù)據(jù)被包含在請求體中。POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改瀑志。
4PUT從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容涩搓。
5DELETE請求服務(wù)器刪除指定的頁面。
6CONNECTHTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器劈猪。
7OPTIONS允許客戶端查看服務(wù)器的性能昧甘。
8TRACE回顯服務(wù)器收到的請求,主要用于測試或診斷战得。
HttpRequest對象
視圖函數(shù)的第一個參數(shù)是HttpRequest對象
服務(wù)器接收到http協(xié)議的請求后充边,會根據(jù)請求數(shù)據(jù)報文創(chuàng)建HttpRequest對象
HttpRequest屬性
path_info: URL字符串
method:字符串,表示HTTP請求方法常侦,常用值:'GET'痛黎、'POST'
encoding:字符串予弧,表示提交的數(shù)據(jù)的編碼方式
如果為None則表示使用瀏覽器的默認(rèn)設(shè)置刮吧,一般為'utf-8'
這個屬性是可寫的湖饱,可以通過修改它來修改訪問表單數(shù)據(jù)使用的編碼,接下來對屬性的任何訪問將使用新的encoding值
GET:QueryDict查詢字典的對象杀捻,包含get請求方式的所有數(shù)據(jù)
POST:QueryDict查詢字典的對象井厌,包含post請求方式的所有數(shù)據(jù)
FILES:類似于字典的對象,包含所有的上傳文件信息
COOKIES:Python字典致讥,包含所有的cookie仅仆,鍵和值都為字符串
session:似于字典的對象,表示當(dāng)前的會話垢袱,
body: 字符串墓拜,請求體的內(nèi)容(POST或PUT)
environ: 字符串,客戶端運(yùn)行的環(huán)境變量信息
scheme : 請求協(xié)議('http'/'https')
request.get_full_path() : 請求的完整路徑
request.get_host() : 請求的主機(jī)
request.META : 請求中的元數(shù)據(jù)(消息頭)
request.META['REMOTE_ADDR']? : 客戶端IP地址
當(dāng)瀏覽者訪問一個網(wǎng)頁時,瀏覽者的瀏覽器會向網(wǎng)頁所在服務(wù)器發(fā)出請求请契。當(dāng)瀏覽器接收并顯示網(wǎng)頁前咳榜,此網(wǎng)頁所在的服務(wù)器會返回一個包含HTTP狀態(tài)碼的信息頭用以響應(yīng)瀏覽器的請求。
HTTP狀態(tài)碼的英文為HTTP Status Code爽锥。
下面是常見的HTTP狀態(tài)碼:
200 - 請求成功
301 - 資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它URL
404 - 請求的資源(網(wǎng)頁等)不存在
500 - 內(nèi)部服務(wù)器錯誤
HTTP狀態(tài)碼分類
HTTP狀態(tài)碼由三個十進(jìn)制數(shù)字組成涌韩,第一個十進(jìn)制數(shù)字定義了狀態(tài)碼的類型,后兩個數(shù)字沒有分類的作用氯夷。HTTP狀態(tài)碼共分為5種類型:
分類分類描述
1**信息臣樱,服務(wù)器收到請求,需要請求者繼續(xù)執(zhí)行操作
2**成功腮考,操作被成功接收并處理
3**重定向雇毫,需要進(jìn)一步的操作以完成請求
4**客戶端錯誤,請求包含語法錯誤或無法完成請求
5**服務(wù)器錯誤踩蔚,服務(wù)器在處理請求的過程中發(fā)生了錯誤
Django中的響應(yīng)對象HttpResponse:
構(gòu)造函數(shù)格式:
HttpResponse(content=響應(yīng)體, content_type=響應(yīng)體數(shù)據(jù)類型, status=狀態(tài)碼)
作用:
向客戶端瀏覽器返回響應(yīng)棚放,同時攜帶響應(yīng)體內(nèi)容
參數(shù):
content:表示返回的內(nèi)容。
status_code:返回的HTTP響應(yīng)狀態(tài)碼(默認(rèn)為200)寂纪。
content_type:指定返回數(shù)據(jù)的的MIME類型(默認(rèn)為"text/html")席吴。瀏覽器會根據(jù)這個屬性,來顯示數(shù)據(jù)捞蛋。如果是text/html孝冒,那么就會解析這個字符串,如果text/plain拟杉,那么就會顯示一個純文本庄涡。
常用的Content-Type如下:
'text/html'(默認(rèn)的,html文件)
'text/plain'(純文本)
'text/css'(css文件)
'text/javascript'(js文件)
'multipart/form-data'(文件提交)
'application/json'(json傳輸)
'application/xml'(xml文件)
注: 關(guān)鍵字MIME(Multipurpose Internet Mail Extensions)是指多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型搬设。
HttpResponse 子類
類型作用狀態(tài)碼
HttpResponseRedirect重定響302
HttpResponseNotModified未修改304
HttpResponseBadRequest錯誤請求400
HttpResponseNotFound沒有對應(yīng)的資源404
HttpResponseForbidden請求被禁止403
HttpResponseServerError服務(wù)器錯誤500
GET方式傳參
GET請求方式中可以通過查詢字符串(Query String)將數(shù)據(jù)傳遞給服務(wù)器? ?
URL 格式: xxx?參數(shù)名1=值1&參數(shù)名2=值2...
如: http://127.0.0.1:8000/page1?a=100&b=200
服務(wù)器端接收參數(shù)
判斷 request.method 的值判斷請求方式是否是get請求
ifrequest.method=='GET':
處理GET請求時的業(yè)務(wù)邏輯
else:
處理其它請求的業(yè)務(wù)邏輯
獲取客戶端請求GET請求提交的數(shù)據(jù)
語法
request.GET['參數(shù)名']# QueryDict
request.GET.get('參數(shù)名','默認(rèn)值')
request.GET.getlist('參數(shù)名')
# mypage?a=100&b=200&c=300&b=400
# request.GET=QueryDict({'a':['100'], 'b':['200','400'], 'c':['300']})
# a = request.GET['a']
# b = request.GET['b']? # Error
?
?
能夠產(chǎn)生get請求方式的場合
地址欄手動輸入, 如: http://127.0.0.1:8000/mypage?a=100&b=200
<a href="地址?參數(shù)=值&參數(shù)=值">
form表單中的method為get
<formmethod='get'action="/user/login">
姓名:<inputtype="text"name="uname">
</form>
一般查詢字符串的大小會受到瀏覽器的的限制(不建議超過2048字節(jié))
練習(xí):
訪問地址:http://127.0.0.1:8000/sum?start=整數(shù)&stop=整數(shù)&step整=字
輸出結(jié)果為sum(range(start, step, stop)) 和:
如:
輸入網(wǎng)址: http://127.0.0.1:8000/sum?start=1&stop=101&step=1
頁面顯示: 結(jié)果: 5050
輸入網(wǎng)址: http://127.0.0.1:8000/sum?stop=101&step=2
頁面顯示: 結(jié)果: 2550
輸入網(wǎng)址: http://127.0.0.1:8000/sum?start=1&stop=101&step=2
頁面顯示: 結(jié)果: 2500
練習(xí):
訪問地址:http://127.0.0.1:8000/birthday?year=四位整數(shù)&month=整數(shù)&day=整數(shù)
最終輸出: 生日為: xxxx年xx月xx日
如:
輸入網(wǎng)址: http://127.0.0.1:8000/birthday?year=2015&month=12&day=11
顯示為: 生日為:2015年12月11日
客戶端通過表單等POST請求將數(shù)據(jù)傳遞給服務(wù)器端,如:
<formmethod='post'action="/login">
姓名:<inputtype="text"name="username">
<inputtype='submit'value='登陸'>
</form>
服務(wù)器端接收參數(shù)
通過 request.method 來判斷是否為POST請求,如:
ifrequest.method=='POST':
處理POST請求的數(shù)據(jù)并響應(yīng)
else:
處理非POST請求的響應(yīng)
使用post方式接收客戶端數(shù)據(jù)
方法
request.POST['參數(shù)名']# request.POST 綁定QueryDict
request.POST.get('參數(shù)名','')
request.POST.getlist('參數(shù)名')
取消csrf驗(yàn)證,否則Django將會拒絕客戶端發(fā)來的POST請求
取消 csrf 驗(yàn)證
刪除 settings.py 中 MIDDLEWARE 中的 CsrfViewsMiddleWare 的中間件
MIDDLEWARE= [
?? ...
# 'django.middleware.csrf.CsrfViewMiddleware',
?? ...
]
在form表單控件提交數(shù)據(jù)時穴店,會自動搜索本表單控件內(nèi)部的子標(biāo)簽的name屬性及相應(yīng)的值撕捍,再將這些名字和值以鍵-值對的形式提交給action指定的服務(wù)器相關(guān)位置
在form內(nèi)能自動搜集到的name屬性的標(biāo)簽的控件有
<inputname='xxx'>
<selectname='yyy'></select>
<textareaname='zzz'></textarea>
如:
<formaction="/page1"method="POST">
<inputname="title"type="text"value="請輸入">
<selectname="gender">
<optionvalue=1>男</option>
<optionvalue=0>女</option>
</select>
<textareaname="comment"rows="5"cols="10">附言...</textarea>
<inputtype="submit"value="提交">
</form>