上面這兩個(gè)圖片是ORM對(duì)象關(guān)系映射的關(guān)系理解咐鹤。
django框架
一拗秘、簡(jiǎn)介
web框架
具體介紹django之前,必須先介紹python的web框架等概念祈惶。
web框架: 別人已經(jīng)設(shè)定好的一個(gè)web網(wǎng)站模板雕旨,你學(xué)習(xí)它的規(guī)則扮匠,然后“填空”或“修改”成你自己需要的樣子。
一般web框架的架構(gòu)是這樣的(看圖)
其它基于python的web框架凡涩,如tornado棒搜、flask、webpy都是在這個(gè)范圍內(nèi)進(jìn)行增刪裁剪的活箕。
例如tornado用的是自己的異步非阻塞力麸,flask則只提供了最精簡(jiǎn)和基本的框架。
django則是直接使用了WSGI育韩,并實(shí)現(xiàn)了大部分功能克蚂。
django簡(jiǎn)介
django是用python開(kāi)發(fā)的一個(gè)免費(fèi)開(kāi)源的web框架,可以用于快速搭建高性能筋讨,優(yōu)雅的網(wǎng)站埃叭!
django的理念是DRY(Don't Repeat Yourself)來(lái)鼓勵(lì)快速開(kāi)發(fā)!
二版仔、django框架的核心組件有:
1.用于創(chuàng)建模型的對(duì)象關(guān)系映射(orm)
2.為最終用戶設(shè)計(jì)的完美管理界面
3.一流的URL設(shè)計(jì)
4.設(shè)計(jì)者友好的模板語(yǔ)言
5.緩存系統(tǒng)
6.國(guó)際化
1游盲、用于創(chuàng)建模型的對(duì)象關(guān)系映射
對(duì)上面1-6的含義解析:
1.用于創(chuàng)建模型的對(duì)象關(guān)系映射(orm)
以python類形式定義你的數(shù)據(jù)模型,ORM將模型與關(guān)系數(shù)據(jù)庫(kù)連接起來(lái)蛮粮,你將得到一個(gè)非常容易使用的數(shù)據(jù)庫(kù)API益缎,同時(shí)你也可以在Django中使用原始的SQL語(yǔ)句。
2然想、為最終用戶設(shè)計(jì)的完美管理界面
幾行簡(jiǎn)單的代碼就讓你的網(wǎng)站擁有一個(gè)強(qiáng)大的后臺(tái)莺奔,輕松管理你的內(nèi)容!
不需要你花大量的工作來(lái)創(chuàng)建人員管理和更新內(nèi)容变泄。Django自帶一個(gè)ADMIN site,類似于內(nèi)容管理系統(tǒng)
3令哟、一流的URL設(shè)計(jì)
用正則匹配網(wǎng)址,傳遞到對(duì)應(yīng)函數(shù)妨蛹,隨意定義屏富,如你所想!你可以設(shè)計(jì)任意的URL蛙卤,沒(méi)有框架的特定限定狠半。像你喜歡的一樣靈活
4、設(shè)計(jì)者友好的模板語(yǔ)言
強(qiáng)大颤难,易擴(kuò)展的模板系統(tǒng)神年,設(shè)計(jì)簡(jiǎn)易,代碼行嗤,樣式分開(kāi)設(shè)計(jì)已日,更容易管理。
使用django強(qiáng)大而可擴(kuò)展的模板語(yǔ)言栅屏,可以分隔設(shè)計(jì)飘千、內(nèi)容和Python代碼堂鲜。并且具有可繼承性。
5占婉、緩存系統(tǒng)
與memcached或其它的緩存系統(tǒng)聯(lián)用泡嘴,更出色的表現(xiàn),更快的加載速度逆济。
6酌予、國(guó)際化完全支持多語(yǔ)言應(yīng)用,允許你定義翻譯的字符奖慌,輕松翻譯成不同國(guó)家的語(yǔ)言抛虫。
三、架構(gòu)設(shè)計(jì)
django是一個(gè)基于MVC構(gòu)造的框架简僧,即模型model建椰,視圖view和控制器controller。
但是在django中岛马,控制器接受用戶輸入的部分由框架自行處理棉姐,所以django里更關(guān)注的是模型model、模板template和視圖views啦逆,稱為MTV模式伞矩。它們各自的職責(zé)如下:
從以上表述可以看出Django視圖不處理用戶輸入,而僅僅決定要展現(xiàn)哪些數(shù)據(jù)給用戶夏志,而Django模板 僅僅決定如何展現(xiàn)Django視圖指定的數(shù)據(jù)乃坤。或者說(shuō), Django將MVC中的視圖進(jìn)一步分解為Django視圖 和Django模板兩個(gè)部分沟蔑,分別決定 “展現(xiàn)哪些數(shù)據(jù)” 和 “如何展現(xiàn)”湿诊,使得Django的模板可以根據(jù)需要隨時(shí)替換,而不僅僅限制于內(nèi)置的模板瘦材。
至于MVC控制器部分厅须,由Django框架的URLconf來(lái)實(shí)現(xiàn)。URLconf機(jī)制是使用正則表達(dá)式匹配URL食棕,然后調(diào)用合適的Python函數(shù)九杂。URLconf對(duì)于URL的規(guī)則沒(méi)有任何限制,你完全可以設(shè)計(jì)成任意的URL風(fēng)格宣蠕,不管是傳統(tǒng)的,RESTful的甥捺,或者是另類的抢蚀。框架把控制層給封裝了镰禾,無(wú)非與數(shù)據(jù)交互這層都是數(shù)據(jù)庫(kù)表的讀,寫,刪除,更新的操作.在寫程序的時(shí)候皿曲,只要調(diào)用相應(yīng)的方法就行了唱逢,感覺(jué)很方便。程序員把控制層?xùn)|西交給Django自動(dòng)完成了屋休。 只需要編寫非常少的代碼完成很多的事情坞古。所以,它比MVC框架考慮的問(wèn)題要深一步劫樟,因?yàn)槲覀兂绦騿T大都在寫控制層的程序』痉悖現(xiàn)在這個(gè)工作交給了框架,僅需寫很少的調(diào)用代碼叠艳,大大提高了工作效率奶陈。
MVC:全名Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫附较,一種軟件設(shè)計(jì)典范吃粒,用一種業(yè)務(wù)邏輯、數(shù)據(jù)拒课、界面顯示分離的方法組織代碼徐勃,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí)早像,不需要重新編寫業(yè)務(wù)邏輯僻肖。
通俗解釋:一種文件的組織和管理形式!不要被縮寫嚇到了扎酷,這其實(shí)就是把不同類型的文件放到不同的目錄下的一種方法檐涝,然后取了個(gè)高大上的名字。當(dāng)然法挨,它帶來(lái)的好處有很多谁榜,比如前后端分離,松耦合等等凡纳,就不詳細(xì)說(shuō)明了窃植。
模型(model):定義數(shù)據(jù)庫(kù)相關(guān)的內(nèi)容,一般放在models.py文件中荐糜。
視圖(view):定義HTML等靜態(tài)網(wǎng)頁(yè)文件相關(guān)巷怜,也就是那些html、css暴氏、js等前端的東西延塑。
控制器(controller):定義業(yè)務(wù)邏輯相關(guān),就是你的主要代碼答渔。
MTV:有些WEB框架覺(jué)得MVC的字面意思很別扭关带,就給它改了一下。view不再是HTML相關(guān)沼撕,而是主業(yè)務(wù)邏輯了宋雏,相當(dāng)于控制器芜飘。html被放在Templates中,稱作模板磨总,于是MVC就變成了MTV嗦明。這其實(shí)就是一個(gè)文字游戲,和MVC本質(zhì)上是一樣的蚪燕,換了個(gè)名字和叫法而已娶牌,換湯不換藥。
四邻薯、工作機(jī)制
1.用manage .py runserver啟動(dòng)django服務(wù)器時(shí)就載入了在同一目錄下的settings .py裙戏。該文件包含了項(xiàng)目中的配置信息,如前面講的URLConf等厕诡,其中最重要的配置就是ROOT_URLCONF累榜,它告訴django哪個(gè)python模塊應(yīng)該用作本站的URLConf,默認(rèn)的是urls .py
2.當(dāng)訪問(wèn)url的時(shí)候灵嫌,django會(huì)根據(jù)ROOT_URLCONF的設(shè)置來(lái)裝載URLConf壹罚。
3.然后按順序逐個(gè)匹配URLConf里的URLpatterns。如果找到則會(huì)調(diào)用相關(guān)聯(lián)的視圖函數(shù)寿羞,并把HttpRequest對(duì)象作為第一個(gè)參數(shù)(通常是request)
4.最后該view函數(shù)負(fù)責(zé)返回一個(gè)HttpResponse對(duì)象猖凛。
五、版本選擇
1.5.x支持python 2.6.5 python 2.7, python 3.2和3.3.
1.6.x支持python 2.6.X, 2.7.X, 3.2.X和3.3.X
1.7.x支持python 2.7, 3.2, 3.3,和3.4(注意:Python 2.6不支持了)
1.8.x支持python 2.7, 3.2, 3.3, 3.4和3.5.(長(zhǎng)期支持版本LTS)
1.9.x支持python 2.7, 3.4和3.5.不支持3.3了
?1.10.x支持python 2.7, 3.4和3.5.
1.11.x支持python 2.7, 3.4, 3.5和3.6绪穆,17年4月4號(hào) 已經(jīng)發(fā)布(長(zhǎng)期支持版本LTS)
一般來(lái)說(shuō)辨泳,選擇長(zhǎng)期支持版本比較好。
使用最新版本的問(wèn)題就是玖院,可能要用到的一些第三方插件沒(méi)有及時(shí)更新菠红,無(wú)法正常使用這些三方包。
如果是學(xué)習(xí)难菌,可以選擇目前的django 1.8.x來(lái)進(jìn)行试溯,遇到問(wèn)題也容易找到答案。
如果是正式啟動(dòng)的新項(xiàng)目郊酒,建議用django 1.11.x遇绞,畢竟django 1.9以后admin界面更漂亮些。
六燎窘、搭建開(kāi)發(fā)環(huán)境
安裝虛擬環(huán)境
使用Python進(jìn)行項(xiàng)目開(kāi)發(fā)時(shí)摹闽,由于不同的項(xiàng)目需要,可能會(huì)配置多個(gè)開(kāi)發(fā)環(huán)境褐健,不同開(kāi)發(fā)環(huán)境之間的項(xiàng)目依賴包如果混合在一起钩骇,可能會(huì)引起意想不到的錯(cuò)誤。
通過(guò)虛擬環(huán)境隔離不同開(kāi)發(fā)環(huán)境,方便不同開(kāi)發(fā)環(huán)境的共存倘屹。
#安裝python虛擬環(huán)境
sudo apt-get install virtualenv
#vrtaulenvwrapper是virtualenv的擴(kuò)展包,用于更方便管理虛擬環(huán)境
sudo apt-get install virtualenvwrapper
配置虛擬環(huán)境
此時(shí)還不能使用virtualenvwrapper慢叨,實(shí)際上你需要運(yùn)行virtualenvwrapper.sh文件才行纽匙。
配置步驟如下:
1、查看virtualenvwrapper的安裝路徑
sudo find / -name virtualenvwrapper.sh
2拍谐、創(chuàng)建目錄用來(lái)存放虛擬環(huán)境
mkdir .myvirtualenvs
3烛缔、在? .bashrc中添加行
export WORKON_HOME=/home/yong/.myvirtualenvs
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
4、運(yùn)行:source? .bashrc
此時(shí)virtualenvwrapper就可以使用了轩拨。
七践瓷、virtualenvwrapper的功能
配置好virtualenvwrapper,就可以使用它的功能亡蓉,方便管理虛擬環(huán)境
workon:列出虛擬環(huán)境列表
lsvirtualenv:列出虛擬環(huán)境列表
mkvirtualenv:新建虛擬環(huán)境
workon [虛擬環(huán)境名稱]:切換/進(jìn)入虛擬環(huán)境
rmvirtualenv :刪除虛擬環(huán)境
deactivate:離開(kāi)虛擬環(huán)境
八晕翠、創(chuàng)建虛擬環(huán)境
進(jìn)入本地虛擬環(huán)境的目錄文件夾
cd? .myvirtualenvs/
創(chuàng)建虛擬環(huán)境 根據(jù)需要選擇3和2
mkvirtualenv -p /usr/bin/python3 ?virtualenv-django
mkvirtualenv -p /usr/bin/python ?virtualenv-django
進(jìn)入虛擬環(huán)境
workon virtualenv-django
查看虛擬環(huán)境中已經(jīng)安裝的包
pip list
pip freeze
九、安裝django
建議安裝1.8.2版本砍濒,這是一個(gè)穩(wěn)定性高淋肾、使用廣、文檔多的版本
1.進(jìn)入虛擬環(huán)境
workon virtualenv-django
2.安裝django
pip install django==1.8.2
3.查看版本
進(jìn)入python shell
import django
django.get_version()
說(shuō)明:使用pip install django命令進(jìn)行安裝時(shí)爸邢,會(huì)自動(dòng)刪除舊版本樊卓,再安裝新版本
十、創(chuàng)建項(xiàng)目
命令django-admin startproject test1
進(jìn)入test1目錄杠河,目錄結(jié)構(gòu)如下圖:
manage.py:一個(gè)命令行工具碌尔,可以使你用多種方式對(duì)Django項(xiàng)目進(jìn)行交互
內(nèi)層的目錄test1:項(xiàng)目的真正的Python包
_init _.py:一個(gè)空文件,它告訴Python這個(gè)目錄應(yīng)該被看做一個(gè)Python包
settings.py:項(xiàng)目的配置
urls.py:項(xiàng)目的URL聲明
wsgi.py:項(xiàng)目與WSGI兼容的Web服務(wù)器入口
十一券敌、設(shè)計(jì)模型
設(shè)計(jì)介紹
本示例完成“圖書(shū)-英雄”信息的維護(hù)唾戚,需要存儲(chǔ)兩種數(shù)據(jù):圖書(shū)、英雄
1.圖書(shū)表結(jié)構(gòu)設(shè)計(jì):
表名:BookInfo
2.圖書(shū)名稱:btitle
3.圖書(shū)發(fā)布時(shí)間:bpub_date
2.英雄表結(jié)構(gòu)設(shè)計(jì)
表名:HeroInfo
5.英雄姓名:hname
[6.英雄性別:hgender
7.英雄簡(jiǎn)介:hcontent
8.所屬圖書(shū):hbook
3.圖書(shū)-英雄的關(guān)系為一對(duì)多
createtable bookinfo(
bidint auto_increment primary key,
btitle varchar(100),
bpubdate date
);
createtable heroinfo(
hidint auto_increment primary key,
hname varchar(100),
hgender bit,
hcontent longtext,
hbook_idint,foreign key(hbook_id) references bookinfo(bid)
);
設(shè)計(jì)成類陪白,外鍵就是設(shè)計(jì)成一個(gè)對(duì)象
數(shù)據(jù)庫(kù)配置
1.在settings.py文件中颈走,通過(guò)DATABASES項(xiàng)進(jìn)行數(shù)據(jù)庫(kù)設(shè)置
2.django支持的數(shù)據(jù)庫(kù)包括:sqlite、mysql等主流數(shù)據(jù)庫(kù)
3.Django默認(rèn)使用SQLite數(shù)據(jù)庫(kù)
1.1.1.創(chuàng)建應(yīng)用
在一個(gè)項(xiàng)目中可以創(chuàng)建一到多個(gè)應(yīng)用咱士,每個(gè)應(yīng)用進(jìn)行一種業(yè)務(wù)處理
創(chuàng)建應(yīng)用的命令:
python manage.py startapp booktest
應(yīng)用的目錄結(jié)構(gòu)如下圖
定義模型類
1.有一個(gè)數(shù)據(jù)表立由,就有一個(gè)模型類與之對(duì)應(yīng)
2.打開(kāi)models.py文件,定義模型類
3.引入包from django.db import models
4.模型類繼承自models.Model類
5.說(shuō)明:不需要定義主鍵列序厉,在生成時(shí)會(huì)自動(dòng)添加锐膜,并且值為自動(dòng)增長(zhǎng)
6.當(dāng)輸出對(duì)象時(shí),會(huì)調(diào)用對(duì)象的str方法
from django.db import models
class BookInfo(models.Model):
??????? btitle = models.CharField(max_length=20)
??????? bpub_date = models.DateTimeField()
def __str__(self):
?????? return "%d" % self.pk
class HeroInfo(models.Model):
???????? hname = models.CharField(max_length=20)
???????? hgender = models.BooleanField()
???????? hcontent = models.CharField(max_length=100)
???????? hBook = models.ForeignKey('BookInfo')
def __str__(self):ls
????????? return "%d" % self.pk
生成數(shù)據(jù)表
1激活模型:編輯settings.py文件弛房,將booktest應(yīng)用加入到installed_apps中
2.生成遷移文件:根據(jù)模型類生成sql語(yǔ)句道盏,遷移文件被生成到應(yīng)用的migrations目錄
python manage.py makemigrations
3.執(zhí)行遷移:執(zhí)行sql語(yǔ)句生成數(shù)據(jù)表
python manage.py migrate
在Python的開(kāi)發(fā)中,遇到了這個(gè)錯(cuò)誤:
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
解決方法如下:
在代碼文件的最上方,添加如下代碼:
import os,django
# project_name項(xiàng)目名稱
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
django.setup()
原因:
Python啟動(dòng)方式python荷逞,會(huì)啟動(dòng)交互解釋器媒咳,需要告訴Django使用哪個(gè)設(shè)置文件,Django會(huì)搜索DJANGO_SETTINGS_MODULE環(huán)境變量,它被設(shè)置在settings.py中种远,
解決方法:用python manage.py shell來(lái)啟動(dòng)命令解釋器而不是python涩澡,因?yàn)閜ython manage.py shell中包含了Django使用哪個(gè)settings.py文件
1.1.1.6測(cè)試數(shù)據(jù)操作
1.激活進(jìn)入python shell,進(jìn)行簡(jiǎn)單的模型API練習(xí)
python manage.py shell
2.引入需要的包:
from booktest.models import *
from datetime import *
3.單個(gè)對(duì)象的增刪改查
4.關(guān)聯(lián)對(duì)象的操作
引入需要的包:
from booktest.models import *
from datetime import *
**************單個(gè)對(duì)象的操作**************
1坠敷、查詢所有圖書(shū)信息:
BookInfo.objects.all()
2妙同、新建圖書(shū)信息:
b = BookInfo()
b.btitle="射雕英雄傳"
b.bpub_date=datetime(year=1990,month=1,day=10)
b.save()
3、查找圖書(shū)信息:
b=BookInfo.objects.get(pk=1)
輸出圖書(shū)信息:
b
b.id
b.btitle
4膝迎、修改圖書(shū)信息:
b.btitle="天龍八部"
b.save()
5粥帚、刪除圖書(shū)信息:
b.delete()
**************關(guān)聯(lián)對(duì)象的操作**************
1、對(duì)于HeroInfo可以按照下面的操作方式進(jìn)行
添加限次,注意添加關(guān)聯(lián)對(duì)象
h=HeroInfo()
h.htitle=u'郭靖'
h.hgender=True
h.hcontent='降龍十八掌'
h.hbook=b
h.save()
2芒涡、獲得關(guān)聯(lián)集合:返回當(dāng)前book對(duì)象的所有hero
b=BookInfo.objects.get(pk=1)
b.heroinfo_set.all()1、創(chuàng)建項(xiàng)目
django-admin startporject xx
2掂恕、創(chuàng)建app
python manage.py startapp yy
python manage.py startapp cc
3拖陆、將app添加到settting.py? ? INSTALLED_APPS
4、創(chuàng)建sql(不需要實(shí)現(xiàn))
5懊亡、實(shí)體類
6依啰、生成遷移文件
python manage.py makemigrations
7、遷移店枣,生成sql表
python manage.py migrate
8速警、測(cè)試增刪改查
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
}
}
9、修改實(shí)體類鸯两,重新遷移
建議闷旧,數(shù)據(jù)庫(kù)整個(gè)刪除,再遷移钧唐,避免報(bào)錯(cuò)忙灼。
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateTimeField()
def __str__(self):
return "%d" % self.pk
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField()
hcontent = models.CharField(max_length=100)
hBook = models.ForeignKey('BookInfo')
def __str__(self):
return "%d" % self.pk
整理歸納流程:
1、創(chuàng)建項(xiàng)目
django-admin startporject xx
2钝侠、創(chuàng)建app
python manage.py startapp yy
python manage.py startapp cc
3该园、將app添加到settting.py? ? INSTALLED_APPS
4、創(chuàng)建sql(不需要實(shí)現(xiàn))
5帅韧、實(shí)體類 在app里面的models.py操作里初。
class BookInfo(models.Model):
??????? btitle = models.CharField(max_length=20)
??????? bpub_date = models.DateTimeField()
def __str__(self):
???????? return "%d" % self.pk
class HeroInfo(models.Model):
????????? hname = models.CharField(max_length=20)
????????? hgender = models.BooleanField()
????????? hcontent = models.CharField(max_length=100)
????????? hBook = models.ForeignKey('BookInfo')
def __str__(self):
????????? return "%d" % self.pk
6、生成遷移文件 在manage.py這個(gè)當(dāng)前目錄中執(zhí)行忽舟。
python manage.py makemigrations
7双妨、遷移淮阐,生成sql表
python manage.py migrate
8、測(cè)試增刪改查
9刁品、修改實(shí)體類泣特,重新遷移
建議,數(shù)據(jù)庫(kù)整個(gè)刪除挑随,再遷移群扶,避免報(bào)錯(cuò)。