1. DJANGO使用指南
Django簡介:
Django發(fā)布于2005年7月,是當(dāng)前Python世界里最有名且成熟的網(wǎng)絡(luò)框架。 最初是被開發(fā)用于管理勞倫斯出版集團(tuán)旗下的以新聞內(nèi)容為主的網(wǎng)站的譬淳,即CMS(內(nèi)容管理系統(tǒng))軟件。
Django是一個(gè)用Python編寫的開放源代碼的Web應(yīng)用框架茄蚯,代碼是開源的镜硕。此系統(tǒng)采用了MVC的框架模式, 也可以稱為MTV模式
什么是MVC模式
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫双谆,一種軟件設(shè)計(jì)典范壳咕,用一種業(yè)務(wù)邏輯席揽、數(shù)據(jù)、界面顯示分離的方法組織代碼谓厘,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面幌羞,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯竟稳。MVC被獨(dú)特的發(fā)展起來用于映射傳統(tǒng)的輸入属桦、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中。 通俗的來講就是他爸,強(qiáng)制性的使應(yīng)用程序的輸入聂宾,處理和輸出分開。
核心思想</b>:解耦
<b>優(yōu)點(diǎn)</b>:減低各個(gè)模塊之間的耦合性诊笤,方便變更系谐,更容易重構(gòu)代碼,最大程度的實(shí)現(xiàn)了代碼的重用
MVC(Model, View, Controller)
Model: 即<font color=red>數(shù)據(jù)存取層</font>讨跟。用于封裝于應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)纪他,以及對數(shù)據(jù)的處理。說白了就是模型對象負(fù)責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù)
View: 即<font color=red>表現(xiàn)層</font>晾匠。負(fù)責(zé)數(shù)據(jù)的顯示和呈現(xiàn)茶袒。渲染的html頁面給用戶,或者返回?cái)?shù)據(jù)給用戶混聊。
Controller: 即業(yè)務(wù)邏輯層弹谁。負(fù)責(zé)從用戶端收集用戶的輸入,進(jìn)行業(yè)務(wù)邏輯處理句喜,包括向模型中發(fā)送數(shù)據(jù)预愤,進(jìn)行CRUD操作。
圖解:
瀏覽器中MVC的表現(xiàn)形式圖解:
Django的模式簡介
MVT模式
嚴(yán)格來說咳胃,Django的模式應(yīng)該是MVT模式植康,本質(zhì)上和MVC沒什么區(qū)別,也是各組件之間為了保持松耦合關(guān)系展懈,只是定義上有些許不同销睁。
Model: 負(fù)責(zé)業(yè)務(wù)與數(shù)據(jù)庫(ORM)的對象
View: 負(fù)責(zé)業(yè)務(wù)邏輯并適當(dāng)調(diào)用Model和Template
Template: 負(fù)責(zé)把頁面渲染展示給用戶
注意: Django中還有一個(gè)url分發(fā)器,也叫作路由存崖。主要用于將url請求發(fā)送給不同的View處理冻记,View在進(jìn)行相關(guān)的業(yè)務(wù)邏輯處理。
2. VIRTUALENV虛擬環(huán)境創(chuàng)建指南
前言
本教程中使用到的python版本均為python3.x版本来惧,由于本人安裝的是python3.6.3版本冗栗,所以一下的課程均是在此基礎(chǔ)上進(jìn)行的。
virtualenv使用場景:當(dāng)開發(fā)成員負(fù)責(zé)多個(gè)項(xiàng)目的時(shí)候,每個(gè)項(xiàng)目安裝的庫又是有很多差距的時(shí)候隅居,會使用虛擬環(huán)境將每個(gè)項(xiàng)目的環(huán)境給隔離開來钠至。
比如,在有一個(gè)老項(xiàng)目已經(jīng)開發(fā)維護(hù)了3年了胎源,里面很多庫都是比較老的版本了棉钧。例如python使用的是2.7版本的。但是新項(xiàng)目使用的python版本是3.6的涕蚤。為了解決這種項(xiàng)目執(zhí)行環(huán)境的沖突宪卿,所以引入了虛擬環(huán)境virtualenv。
當(dāng)然除了virtualenv可以起到隔離環(huán)境的作用赞季,還有其他技術(shù)方案來實(shí)現(xiàn)愧捕,而且上線流程簡單,大大減輕運(yùn)維人員的出錯(cuò)率申钩,比如每一個(gè)項(xiàng)目使用一個(gè)docker鏡像次绘,在鏡像中去安裝項(xiàng)目所需的環(huán)境,庫版本等等
python環(huán)境的配置
1.在cmd中能通過python去啟動撒遣,如果不行直接跳到第三步
2.在cmd中能通過pip3啟動安裝軟件邮偎,如果不行直接跳到第三步
3.配置python環(huán)境和pip環(huán)境
4.確認(rèn)pip安裝成功,如果Scritp文件夾下沒有pip可執(zhí)行文件义黎,則執(zhí)行第五步禾进。
5.由于python3.6安裝以后,在Scripts文件中沒有pip的可執(zhí)行軟件廉涕,需要輸入一下命令進(jìn)行安裝
python -m ensurepip
windows中安裝使用
- 安裝virtualenv
pip install virtualenv
- 創(chuàng)建虛擬環(huán)境
先查看一下安裝虛擬環(huán)境有那些參數(shù)泻云,是必須填寫的
注意兩個(gè)參數(shù):
--no-site-packages和-p參數(shù)
virtualenv --no-site-package venv
以下是指定安裝虛擬環(huán)境中的python版本的安裝方式:
- 進(jìn)入/退出env
進(jìn)入 cd env/Scripts/文件夾 在activate命令
退出 deactivate
ubuntu中安裝使用
- 安裝virtualenv
apt-get install python-virtualenv
- 創(chuàng)建包含python3版本的虛擬環(huán)境
virtualenv -p /usr/bin/python3 env
env代表創(chuàng)建的虛擬環(huán)境的名稱
- 進(jìn)入/退出env
進(jìn)入 source env/bin/activate
退出 deactivate
-
pip使用
查看虛擬環(huán)境下安裝的所有的包
pip list
-
查看虛擬環(huán)境重通過pip安裝的包
pip freeze
3. DJANGO使用指南
創(chuàng)建Django項(xiàng)目
1. 首先創(chuàng)建一個(gè)運(yùn)行Django項(xiàng)目的虛擬環(huán)境(virtualenv)
虛擬環(huán)境的創(chuàng)建在基礎(chǔ)課程中講解,地址
該虛擬環(huán)境中有django庫狐蜕,python3宠纯,pymysql等等需要的庫
大致在羅列下安裝了那些庫:
pip install Django==1.11
pip install PyMySQL
2. 創(chuàng)建一個(gè)Django項(xiàng)目
2.1 創(chuàng)建項(xiàng)目
django-admin startproject halloWorld
該命令是創(chuàng)建一個(gè)名為halloWorld的工程
項(xiàng)目目錄介紹
下面展示創(chuàng)建以后的文件,具體有哪些文件:
manage.py: 是Django用于管理本項(xiàng)目的管理集工具层释,之后站點(diǎn)運(yùn)行婆瓜,數(shù)據(jù)庫自動生成,數(shù)據(jù)表的修改等都是通過該文件完成贡羔。
init.py: 指明該目錄結(jié)構(gòu)是一個(gè)python包廉白,暫無內(nèi)容,在后期會初始化一些工具會使用到乖寒。
seetings.py: Django項(xiàng)目的配置文件猴蹂,其中定義了本項(xiàng)目的引用組件,項(xiàng)目名楣嘁,數(shù)據(jù)庫磅轻,靜態(tài)資源覆获,調(diào)試模式,域名限制等
urls.py:項(xiàng)目的URL路由映射瓢省,實(shí)現(xiàn)客戶端請求url由哪個(gè)模塊進(jìn)行響應(yīng)。
wsgi.py:定義WSGI接口信息痊班,通常本文件生成后無需改動
2.2 運(yùn)行Django項(xiàng)目
python manage.py runserver 端口
該命令是運(yùn)行項(xiàng)目勤婚,端口可以不用寫,啟動的時(shí)候會默認(rèn)隨機(jī)創(chuàng)建一個(gè)可以使用的端口
2.2 創(chuàng)建app
python manage.py startapp hallo_app
該命令是在blog工程下創(chuàng)建一個(gè)名為hallo_app的app
3. settings.py配置文件詳細(xì)解讀
a) 設(shè)置語言:
LANGUAGE_CODE = 'zh-hans' 表示中文
LANGUAGE_CODE = 'en-us' 表示英文
設(shè)置時(shí)區(qū): TIME_ZONE = 'Asia/Shanghai'
b) 時(shí)區(qū)解釋: (需要詳細(xì)回顧思考時(shí)區(qū)問題)
UTC:世界標(biāo)準(zhǔn)時(shí)間涤伐,也就是平常說的零時(shí)區(qū)馒胆。
北京時(shí)間表示東八區(qū)時(shí)間,即UTC+8
模型使用指南--models
前言
Django對數(shù)據(jù)庫提供了很好的支持凝果,對不同的數(shù)據(jù)庫,django提供了統(tǒng)一調(diào)用的API祝迂,我們可以根據(jù)不同的業(yè)務(wù)需求使用不同是數(shù)據(jù)庫。Django中引入了ORM(Objects Relational Mapping)對象關(guān)系映射器净,是一種程序技術(shù)型雳。在下面會詳細(xì)的講解。
修改mysql配置
1. 在settings.py中配置數(shù)據(jù)庫連接信息
'ENGINE':'django.db.backends.mysql',
'NAME':'', #數(shù)據(jù)庫名
'USER':'', #賬號
'PASSWORD':'', #密碼
'HOST':'127.0.0.1', #IP(本地地址也可以是localhost)
'PORT':'3306', #端口
2. mysql數(shù)據(jù)庫中創(chuàng)建定義的數(shù)據(jù)庫
a) 進(jìn)入mysql
mysql -u root -p
b) 創(chuàng)建數(shù)據(jù)庫
create database xxx charset=utf-8;
3. 配置數(shù)據(jù)庫鏈接
a) 安裝pymysql
pip install pymysql
b) 在工程目錄下的init.py文件中輸入,完成數(shù)據(jù)庫的驅(qū)動加載
import pymysql
pymysql.install_as_MySQLdb()
4. 定義模型
重要概念:模型山害,表纠俭,屬性,字段
一個(gè)模型類在數(shù)據(jù)庫中對應(yīng)一張表浪慌,在模型類中定義的屬性冤荆,對應(yīng)模型對照表中的一個(gè)字段
定義屬性見定義屬性文件地址
創(chuàng)建學(xué)生模型類
class Student(models.Model):
# 長度為10,且唯一不能為空的姓名s_name字段 CharField - 字符串類型
s_name = models.CharField(max_length=10, unique=True, null=False)
# IntegerField - 整型字段
age = models.IntegerField(default=18)
# auto_now_add:表示第一次創(chuàng)建數(shù)據(jù)時(shí)权纤,自動默認(rèn)為創(chuàng)建的時(shí)間
create_time = models.DateTimeField(auto_now_add=True)
# auto_now: 表示修改時(shí),自動更新為修改時(shí)間
operate_time = models.DateTimeField(auto_now=True)
# 是否刪除
is_delete = models.BooleanField(default=0)
class Meta:
db_table = 'student'
其中:
字段定義:
DateTimeField - 年月日時(shí)分秒
DateFiled - 年月日
TimeFiled - 時(shí)間戳(較好,不分時(shí)區(qū)的, 上面都要分)
ImageFiled - 只需要圖片的路徑
TextFiled - 存文本, texteare
AutoFiled - 自增的字段, 不用定義, 它會自動生成一個(gè),如上面的id
FloatFiled - 浮點(diǎn)數(shù)
DecimalFiled - 指定長度的浮點(diǎn)數(shù) 5位數(shù), 小數(shù)點(diǎn)占兩位钓简, 999.99
約束定義:
max/min_length - 最大/最小長度
unique - 唯一
null - 是否為空
default - 默認(rèn)值
auto_now_add和auto_now 只能選其中一個(gè)
5.遷移數(shù)據(jù)庫
a) 生成遷移文件
python manage.py makemigrations
注意:如果執(zhí)行后并沒有生成遷移文件,一直提示No changes detected這個(gè)結(jié)果的話汹想,就要手動的去處理了外邓。有兩點(diǎn)處理方式:
1) 先刪除掉pycache文件夾
2) 直接強(qiáng)制的去執(zhí)行遷移命令,python manage.py makemigrations xxx (xxx就是app的名稱)
3) 查看自動生成的數(shù)據(jù)庫欧宜,查看表django_migrations坐榆,刪掉app字段為xxx的數(shù)據(jù)(xxx就是app的名稱)
b) 執(zhí)行遷移生成數(shù)據(jù)庫
python manage.py migrate
注意: 生成遷移文件的時(shí)候,并沒有在數(shù)據(jù)庫中生成對應(yīng)的表冗茸,而是執(zhí)行migrate命令之后才會在數(shù)據(jù)庫中生成表
6. ORM
ORM(Objects Relational Mapping)對象關(guān)系映射席镀,是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換夏漱『阑澹可以簡單理解為翻譯機(jī)。
7.模型查詢
a) 模型成員objects
Django默認(rèn)通過模型的objects對象實(shí)現(xiàn)模型數(shù)據(jù)查詢
b) 過濾器
查詢集表示從數(shù)據(jù)庫獲取的對象集合
查詢集可以有多個(gè)過濾器
過濾器就是一個(gè)函數(shù)挂绰,基于所給的參數(shù)限制查詢的結(jié)果
從SQL角度來說屎篱,查詢集合和select語句等價(jià)服赎,過濾器就像where條件
Django有兩種過濾器用于篩選記錄
filter : 返回符合篩選條件的數(shù)據(jù)集
exclude : 返回不符合篩選條件的數(shù)據(jù)集
多個(gè)filter和exclude可以連接在一起查詢
當(dāng)然還有如下這些過濾器:
all() 返回所有數(shù)據(jù)
filter() 返回符合條件的數(shù)據(jù)
exclude() 過濾掉符合條件的數(shù)據(jù)
order_by() 排序
values() 一條數(shù)據(jù)就是一個(gè)字典,返回一個(gè)列表
c) 查詢單個(gè)數(shù)據(jù)
get():返回一個(gè)滿足條件的對象交播。如果沒有返回符合條件的對象重虑,會應(yīng)該模型類DoesNotExist異常,如果找到多個(gè)秦士,會引發(fā)模型類MultiObjectsReturned異常
first():返回查詢集中的第一個(gè)對象
last():返回查詢集中的最后一個(gè)對象
count():返回當(dāng)前查詢集中的對象個(gè)數(shù)
exists():判斷查詢集中是否有數(shù)據(jù)缺厉,如果有數(shù)據(jù)返回True,沒有返回False
d) 限制查詢集
限制查詢集隧土,可以使用下表的方法進(jìn)行限制提针,等同于sql中的limit
模型名.objects.all()[0:5] 小標(biāo)不能為負(fù)數(shù)
e) 字段查詢
對sql中的where實(shí)現(xiàn),作為方法曹傀,filter(),exclude()辐脖,get()的參數(shù)
語法:屬性名稱__比較運(yùn)算符 = 值
外鍵:屬性名_id
注意:like語句中使用%表示通配符。比如sql語句查詢 where name like '%xxx%'皆愉,等同于filter(name_contains='xxx')
f) 比較運(yùn)算符
contains:是否包含嗜价,大小寫敏感
startswith,endswith:以values開頭或者結(jié)尾幕庐,大小寫敏感
以上的運(yùn)算符前加上i(ignore)就不區(qū)分大小寫了
isnull炭剪,isnotnull:是否為空。filter(name__isnull=True)
in:是否包含在范圍內(nèi)翔脱。filter(id__in=[1,2,3])
gt奴拦,gte,lt届吁,lte:大于错妖,大于等于,小于疚沐,小于等于暂氯。filter(age__gt=10)
pk:代表主鍵,也就是id亮蛔。filter(pk=1)
g) 聚合函數(shù)
agregate()函數(shù)返回聚合函數(shù)的值
Avg:平均值
Count:數(shù)量
Max:最大
Min:最小
Sum:求和
例如: Student.objects.aggregate(Max('age'))
h) F對象/Q對象
F對象:可以使用模型的A屬性與B屬性進(jìn)行比較
背景:在模型中有兩個(gè)字段痴施,分別表示學(xué)生成績A與成績B,要對成績AB進(jìn)行比較計(jì)算究流,就需要使用到F對象辣吃。
例如有如下例子1:
# 比較大小: 添加兩個(gè)字段yuwen, math 用F比較
# sql: select * form student where yuwen > math;
stus = Student.objects.filter(yuwen__gt=F('math'))
# 語文比數(shù)學(xué)成績大10分的學(xué)生
stus = Student.objects.filter(yuwen__gt=F('math') + 10)
print(stus)
F對象支持算數(shù)運(yùn)算
Q對象
Q()對象就是為了將過濾條件組合起來
當(dāng)我們在查詢的條件中需要組合條件時(shí)(例如兩個(gè)條件“且”或者“或”)時(shí)。我們可以使用Q()查詢對象
使用符號&或者|將多個(gè)Q()對象組合起來傳遞給filter()芬探,exclude()神得,get()等函數(shù)
Q()對象的前面使用字符“~”來代表意義“非”
# Q, 且, 或, 非
stus = Student.objects.filter(s_name__contains='花', age=23).all()
# 或者條件
stus = Student.objects.filter(Q(s_name__contains='花') | Q(age=23)).all()
print(stus)
# ~非 沒有包含花的學(xué)生
stus =Student.objects.filter(~Q(s_name__contains='花')).all()
stus =Student.objects.exclude(s_name__contains='花').all() # 和上面效果一樣
print(stus)
例子1:
查詢學(xué)生中不是12歲的或者姓名叫張三的學(xué)生
student = Student.objects.filter(~Q(age=12) | Q(name='張三'))
例子2:
查詢python班語文小于80并且數(shù)學(xué)小于等于80的學(xué)生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(~Q(s_yuwen__gte=80) & Q(s_shuxue__lte=80))