Python Web開(kāi)發(fā)Django-01
一嗤练、基礎(chǔ)知識(shí)
- C/S與B/S
- django框架
- MVC
- django的MTV
二潘拨、項(xiàng)目構(gòu)建
- 環(huán)境
- 搭建項(xiàng)目
- 啟動(dòng)服務(wù)器
- django請(qǐng)求流程
三、項(xiàng)目目錄結(jié)構(gòu)
四、自定義路由與請(qǐng)求處理函數(shù)
作業(yè)
一、基礎(chǔ)知識(shí)
C/S與B/S
- C: Client 客戶端
- B: Browser 瀏覽器
- S: Server 服務(wù)器
瀏覽器是最常見(jiàn)的客戶端炫隶,幾乎所有平臺(tái)上(安卓,Ios阎曹,Windows伪阶,MacOS,Linux芬膝,樹(shù)莓派等嵌入設(shè)備)都有瀏覽器望门。
單機(jī)到客戶端與服務(wù)器,發(fā)展歷史
HTTP
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol) 是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議锰霜〕镂螅互聯(lián)網(wǎng)從傳輸簡(jiǎn)單問(wèn)文字,網(wǎng)頁(yè)只包含文字癣缅,到包含多媒體厨剪。
目前使用的版本是HTTP 1.1
URL
統(tǒng)一資源定位符哄酝,用于定位網(wǎng)絡(luò)上某個(gè)資源,通過(guò)URL可以訪問(wèn)到對(duì)應(yīng)的網(wǎng)絡(luò)資源祷膳。
常見(jiàn)格式:scheme://domain/path
- scheme:協(xié)議陶衅,例如:http、https直晨、ftp
- domain:服務(wù)器地址搀军,格式:
域名或者IP:端口號(hào)
。例如:127.0.0.1:8000勇皇;www.baidu.com - path:資源路徑罩句,指明要訪問(wèn)的資源在服務(wù)器上的位置。例如:/images/logo.png
類似于電話號(hào)碼敛摘,通過(guò)電話號(hào)碼找到某個(gè)人门烂,電話號(hào)碼具有一定的格式
服務(wù)器處理請(qǐng)求的流程
請(qǐng)求-->路由-->業(yè)務(wù)處理函數(shù)-->數(shù)據(jù)庫(kù)-->網(wǎng)頁(yè)-->返回給客戶端
django框架
地址:https://www.djangoproject.com/
- 從2005初步完成,是開(kāi)源框架
- 重量級(jí)的python Web開(kāi)發(fā)框架兄淫,內(nèi)置了大量的模塊工具
- 使用的是MVC的設(shè)計(jì)思想
MVC
分工合作:蓋房子屯远,砌墻工,和水泥捕虽,磚頭供應(yīng)
web開(kāi)發(fā)中類似于蓋房子慨丐,但是分為數(shù)據(jù)模型,視圖薯鳍,控制器
全名是Model View Controller咖气。是一種軟件設(shè)計(jì)思想挨措,用于將業(yè)務(wù)邏輯挖滤、數(shù)據(jù)、界面顯示分離浅役。
- model 模型:用于管理業(yè)務(wù)數(shù)據(jù)斩松,例如:數(shù)據(jù)庫(kù)的增刪改查
- view 視圖:用于顯示業(yè)務(wù)數(shù)據(jù)
- controller 控制器:用于從視圖中獲取數(shù)據(jù),以及向model中發(fā)送數(shù)據(jù)觉既,控制數(shù)據(jù)在視圖中的展示
MVT
django使用的是MVC思想惧盹。使用MTV方式來(lái)實(shí)現(xiàn)MVC思想:
- M:model 數(shù)據(jù)層,用戶處理數(shù)據(jù)庫(kù)操作
- T:template 視圖模板瞪讼,用于顯示數(shù)據(jù)
- V:view 控制器钧椰,用處理用戶請(qǐng)求,返回響應(yīng)數(shù)據(jù)符欠。
二嫡霞、項(xiàng)目構(gòu)建
環(huán)境
ubuntu 16.04+python3 或者 MacOS 10+
安裝虛擬環(huán)境
# 更新軟件
sudo apt-get update
# 安裝python3
sudo apt-get install python3
# 安裝python3 pip
sudo apt-get install python3-pip
# 切換到home目錄下
cd ~
mkdir DjangoProjects
cd DjangoProjects
# python虛擬換件管理工具
sudo pip3 install virtualenv
# 創(chuàng)建虛擬環(huán)境
virtualenv -p python3 .djenv
# 啟動(dòng)虛擬環(huán)境
source ~/DjangoProjects/.djenv/bin/activate
# 退出虛擬環(huán)境
deactivate
# 配置啟動(dòng)虛擬環(huán)境命令別名
vim ~/.bashrc
# 尾部添加
# alias djenv=‘source ~/home/u/DjangoProjects/.djenv/bin/activate’
# 啟動(dòng)虛擬環(huán)境
djenv
# 安裝django庫(kù)
pip install django==1.11
# 安裝pylint-django
pip install pylint-django
# 查看已經(jīng)安裝的包
pip freeze
# 新建項(xiàng)目
django-admin startproject Django01
# 啟動(dòng)服務(wù)器
cd Django01
./manage.py runserver
# 打開(kāi)瀏覽器訪問(wèn) 127.0.0.1:8000
四、項(xiàng)目目錄結(jié)構(gòu)
Django01/
manage.py
Django01/
__init__.py
settings.py
urls.py
wsgi.py
Django01項(xiàng)目文件夾
-
manage.py
:所有的django項(xiàng)目中默認(rèn)都會(huì)創(chuàng)建這個(gè)文件希柿,它是django項(xiàng)目的命令行管理工具诊沪。 -
Django01/Django01
是一個(gè)python包养筒, -
Django01/Django01/__init__.py
是一個(gè)空文件,用戶指明這個(gè)文件夾是python包 -
Django01/Django01/settings.py
項(xiàng)目的相關(guān)配置信息 -
Django01/Django01/urls.py
路由配置文件 -
Django01/Django01/wsgi.py
項(xiàng)目部署時(shí)用到的文件
settings配置信息
- DEBUG:開(kāi)發(fā)環(huán)境下始終為True端姚,只有在項(xiàng)目部署到生產(chǎn)環(huán)境時(shí)改為False
- ALLOWED_HOSTS:允許被訪問(wèn)的主機(jī)
- INSTALLED_APPS:需要安裝的應(yīng)用晕粪,django中自帶了了一些應(yīng)用已經(jīng),創(chuàng)建應(yīng)用后渐裸,要把應(yīng)用的名稱加入到這里
- ROOT_URLCONF:根路由文件
- TEMPLATES:模板引擎配置信息
- DATABASES:數(shù)據(jù)庫(kù)配置信息
Django請(qǐng)求流程
請(qǐng)求-->路由-->處理函數(shù)-->數(shù)據(jù)庫(kù)操作-->渲染模板-->返回響應(yīng)數(shù)據(jù)
類似于一家門廠巫湘。客戶:想要買門昏鹃。接單客服:接待客戶剩膘。庫(kù)房:找到對(duì)應(yīng)的門∨韫耍客服安排發(fā)貨怠褐。
- 請(qǐng)求由客戶端發(fā)起
- 路由負(fù)責(zé)對(duì)客戶端發(fā)起的請(qǐng)求進(jìn)行解析,找到對(duì)應(yīng)的處理函數(shù)
新建應(yīng)用
./manage.py startapp MyApp
MyApp/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
- admin.py:django自帶的后臺(tái)管理工具的相關(guān)配置
- apps.py:這個(gè)應(yīng)該相關(guān)配置信息
- migrations/ :數(shù)據(jù)庫(kù)遷移文件目錄
- models.py:存放數(shù)據(jù)模型
- tests.py:測(cè)試文件
- views.py:視圖處理函數(shù)文件
五、創(chuàng)建請(qǐng)求處理函數(shù)并綁定路由
在views新建視圖處理函數(shù)
視圖處理函數(shù)格式
def hello_world(request):
# 處理過(guò)程
return HttpResponse('')
第一個(gè)參數(shù)必須是request您宪,并且每一個(gè)處理函數(shù)必須返回一個(gè)HttpResponse對(duì)象
綁定路由
from MyApp.views import hello_wolrd
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello_world$', hello_world),
]
路由格式:url(正則匹配奈懒,處理函數(shù)名)
瀏覽器中訪問(wèn)
127.0.0.1:8000/hello_world
子路由
園區(qū)-->樓-->幾層
或者一家公司,前臺(tái)-->分機(jī)號(hào)-->人
from django.conf.urls import include
from MyApp.views import hello_wolrd
from MyApp import urls as myapp_urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello_world/', include(myapp_urls)),
]
Python Web開(kāi)發(fā)Django-02
一宪巨、ORM是什么
- 數(shù)據(jù)表
- 面向?qū)ο?/li>
- 對(duì)應(yīng)關(guān)系
二磷杏、在django中如何構(gòu)建映射關(guān)系
- 構(gòu)建對(duì)應(yīng)的model
- 配置數(shù)據(jù)庫(kù)
- 遷移數(shù)據(jù)
三、常用字段
- 普通字段
- 關(guān)聯(lián)字段
四捏卓、ORM的使用
- 簡(jiǎn)單操作
- 復(fù)雜操作
- 關(guān)聯(lián)數(shù)據(jù)
- 數(shù)據(jù)查詢
- 數(shù)據(jù)更新
- 數(shù)據(jù)刪除
作業(yè)
一极祸、ORM是什么
ORM 對(duì)象關(guān)系映射,用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換怠晴。
數(shù)據(jù)操作請(qǐng)求-->ORM-->數(shù)據(jù)庫(kù)(mysql,oracle,mssql,sqlite3...)
不同數(shù)據(jù)庫(kù)語(yǔ)法有差別,支持的功能不同
數(shù)據(jù)庫(kù)表
- 表名
- 字段
- 數(shù)據(jù)記錄
面向?qū)ο?/h3>
- 類名
- 屬性
- 對(duì)象
結(jié)合起來(lái)
類名<--->表名
類屬性<---->表字段
對(duì)象<---->數(shù)據(jù)記錄
django中通過(guò)操作類和對(duì)象來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表以及記錄的操作
二遥金、在django中如何構(gòu)建映射關(guān)系
構(gòu)建類與數(shù)據(jù)表的對(duì)應(yīng)關(guān)系:構(gòu)建model類-->生成遷移文件-->執(zhí)行遷移
構(gòu)建model
在MyApp下model.py
中新增類,繼承自django.db.models.Model
class Student(models.Model):
pass
這里的Student對(duì)應(yīng)的是一張數(shù)據(jù)庫(kù)表蒜田。
為Student類添加屬性稿械,對(duì)應(yīng)數(shù)據(jù)表的字段
class ClassRoom(models.Model):
name= models.CharField(max_length=32)
數(shù)據(jù)表字段由字段名、字段類型冲粤、字段屬性組成
name
-->字段名
美莫、model.CharField
-->字段類型
、max_length=32
-->字段屬性
配置數(shù)據(jù)庫(kù)
安裝mysql數(shù)據(jù)庫(kù)
安裝mysql數(shù)據(jù)庫(kù):sudo apt-get install mysql-server
創(chuàng)將數(shù)據(jù)庫(kù)用戶grant all on *.* to 'django'@'%' identified by 'djangopwd';
創(chuàng)建數(shù)據(jù)庫(kù) create database django01 character set=utf8;
安裝連接mysql庫(kù)
- sudo apt-get install python3-dev libmysqlclient-dev
- pip install mysqlclient
在settings.py中修改默認(rèn)的數(shù)據(jù)庫(kù)
django默認(rèn)的數(shù)據(jù)庫(kù)是sqlite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django01',#數(shù)據(jù)庫(kù)名
'USER': 'django',#數(shù)據(jù)庫(kù)用戶名
'PASSWORD': 'djangopwd',#數(shù)據(jù)庫(kù)用戶密碼
'HOST': 'localhost',#數(shù)據(jù)庫(kù)地址
"PORT": '3306'#數(shù)據(jù)庫(kù)端口號(hào)
}
}
遷移數(shù)據(jù)
# 生成遷移文件梯捕,生成的遷移文件在MyApp/migrations/下
./manage.py makemigrations MyApp
# 執(zhí)行遷移
./manage.py migrate
三厢呵、字段
普通字段
- AutoField:自增長(zhǎng)字段
- CharField:字符串
- IntegerField:整數(shù)
- BooleanField:布爾
- TextField:大文本
- DateField:日期
- DateTimeField:日期時(shí)間
- FloatField:浮點(diǎn)
關(guān)聯(lián)字段
- ForeignKey 多對(duì)一
- ManyToManyField 多對(duì)多
- OneToOneField 一對(duì)一 是特殊的多對(duì)一關(guān)系
通用字段屬性
- null:默認(rèn)是False,數(shù)據(jù)庫(kù)中該字段是否可以為null
- db_index:默認(rèn)False傀顾,表示該字段是否構(gòu)建索引
- primary_key:默認(rèn)False襟铭,是否主鍵
- unique:默認(rèn)False,該字段的值是否不能有重復(fù)
- default:字段的默認(rèn)值
- blank:默認(rèn)為False,通常使用在char或text類型上蝌矛,表示是否可以存儲(chǔ)
''
道批,它與null不同,null是數(shù)據(jù)庫(kù)級(jí)別限制入撒,blank是業(yè)務(wù)上的限制 - help_text:幫助說(shuō)明信息
- choices: 接受一個(gè)遍歷對(duì)象,對(duì)象中每一個(gè)元素是一個(gè)2位元素的元組隆豹;該字段的值只能從給出的列表中選一個(gè),元組中第一個(gè)元素是保存到數(shù)據(jù)庫(kù)中茅逮,第二個(gè)元素只是一個(gè)別名璃赡,例如:
gender_choices = (
('male', '男'),
('female', '女'),
)
- db_cloumn:數(shù)據(jù)表字段名,默認(rèn)情況下是屬性名
關(guān)聯(lián)字段屬性
ForeignKey與OneToOneField:
- on_delete:
- models.CASCADE:級(jí)聯(lián)刪除献雅,當(dāng)主鍵刪除時(shí)碉考,所有關(guān)聯(lián)的數(shù)據(jù)全部刪除
- models.PROTECT:保護(hù),當(dāng)刪除主鍵時(shí)挺身,假如還有關(guān)聯(lián)數(shù)據(jù)侯谁,那么拋出異常
- models.SET_NULL:主鍵刪除時(shí),將該字段設(shè)置為null
- models.SET_DEFAULT:設(shè)置為默認(rèn)值章钾,但是必須在定義字段是給出默認(rèn)值
- models.SET():使用函數(shù)的返回值作為字段值
- models.DO_NOTHING:什么都不做
使用ORM管理數(shù)據(jù)
每一個(gè)類都有一個(gè)默認(rèn)的屬性:objects墙贱,他是一個(gè)管理器
django中執(zhí)行數(shù)據(jù)庫(kù)操作需要通過(guò),類的屬性objects執(zhí)行
簡(jiǎn)單操作
創(chuàng)建數(shù)據(jù)
兩種方式創(chuàng)建一條數(shù)據(jù)
obj=ClassRoom()
obj.attr=value
obj.save()
創(chuàng)建一個(gè)類對(duì)象贱傀,對(duì)象屬性賦值惨撇,執(zhí)行保存
數(shù)據(jù)更新
obj.attr=value
obj.save()
更新對(duì)象屬性,執(zhí)行保存
查詢數(shù)據(jù)
ClassRoom.objects.get()
刪除數(shù)據(jù)
obj.delete
復(fù)雜操作
關(guān)聯(lián)關(guān)系數(shù)據(jù)創(chuàng)建
一對(duì)一
多對(duì)一
多對(duì)多
數(shù)據(jù)查詢
字段特殊查詢
-
age__lt=10
: ====where age < 10
-
age__lte=10
: ====where age <= 10
-
age__gt=10
: ====where age > 10
-
age__gte=10
: ====where >= 10
-
name__contains='tom'
: ====where name like '%tom%'
-
name__icontains='tom'
: ====where name ilike '%tom%'
-
name__startswith='tom'
: ====where name like 'tom%'
-
name__istartswith='tom'
: ====where name ilike 'tom%'
-
name__endswith='tom'
: ====where name like '%tom'
-
name__iendswith='tom'
: ====where name ilike '%tom'
-
age__in=[20,25,28]
: ====where age in (20,25,28)
-
street__isnull=True
: ====where steert is null
字段關(guān)聯(lián)查詢
-
classroom__name='1801'
: ====WHERE blog.name='1801'
-
classroom__name__contains='1801'
: ====WHERE blog.name like '%1801%'
定義屬性字段時(shí),不可以使用包含
__
的名字
Q
命名參數(shù)查詢對(duì)應(yīng)到數(shù)據(jù)查詢時(shí),使用的是 and
邏輯府寒。如果要使用or
和not
魁衙,那么需要借助于Q
Q實(shí)現(xiàn)or
ClassRoom.objects.filter(name='1801',Q(bodys__gt=20)|Q(girls__lt=5))
Q實(shí)現(xiàn)not
ClassRoom.objects.filter(~Q(girls__lt=5))
F
F可以實(shí)現(xiàn)一條數(shù)據(jù)內(nèi)部字段的比較,比如:
ClassRoom.objects.filter(girls__gt=F('boys'))
聚合查詢
- 平均值 Avg
- 最大值 Max
- 最小值 Min
- 數(shù)量 Count
Student.objects.aggregate(Avg('age'))
更新多條數(shù)據(jù)
ClassRoom.objects.filter(...).update(...)
刪除多條數(shù)據(jù)
ClassRoom.objects.filter(...).delete()
Python Web開(kāi)發(fā)Django-03
ORM補(bǔ)充
- 關(guān)聯(lián)數(shù)據(jù)的讀取
- 主表讀取從表
- 從表讀取主表
模板引擎
- 模板引擎原理
- 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的模板引擎
- 如何使用django自帶的模板引擎
- django模板引擎調(diào)用過(guò)程
模板引擎語(yǔ)法
- 模板構(gòu)成
- 注釋
- 變量打印
- 條件判斷
- 循環(huán)
- 乘除法
- 轉(zhuǎn)義
- 過(guò)濾標(biāo)簽
- 靜態(tài)資源
- 繼承與block
- 包含
ORM補(bǔ)充
一對(duì)一
主--->從
mobj.字段名
例如:student.desktop
讀取的是DeskTop對(duì)象
從--->主
sojb-->主類名小寫
例如: desktop.student
讀取的是Student對(duì)象
多對(duì)一
主-->從
mobj.字段名
例如:student.classroom
讀取的是一個(gè)ClassRoom對(duì)象
從-->主
sobj-->主類名小寫__set.過(guò)濾函數(shù)
例如:classroom1.student_set.all()
多對(duì)多
主-->從
mobj.字段名.過(guò)濾函數(shù)
例如:author.book.all()
讀取的是一個(gè)數(shù)據(jù)集合對(duì)象
從-->主
sobj-->主類名小寫__set.過(guò)濾函數(shù)
例如:book.author_set.all()
模板引擎
模板引擎原理
模板包含兩個(gè)部分:靜態(tài)數(shù)據(jù)+動(dòng)態(tài)數(shù)據(jù)
構(gòu)建特殊的文件,文件內(nèi)容包含特殊的字符,使用處理函數(shù)將特殊字符替換成其他數(shù)據(jù)
使用函數(shù)實(shí)現(xiàn)字符串替換
s='''用戶名:name;年齡:age'''
def render(name,age):
result = s.replace('name',str(name)).replace('age',str(age))
return result
如何使用django自帶的模板
django自帶的模板引擎執(zhí)行流程:加載模板,導(dǎo)入?yún)?shù),模板渲染
模板引擎配置
函數(shù)中調(diào)用模板引擎
模板語(yǔ)法
網(wǎng)頁(yè)模板包含兩個(gè)部分:網(wǎng)頁(yè)原始內(nèi)容+模板語(yǔ)法
注釋
網(wǎng)頁(yè)原始注釋: ``
單行注釋: {# 注釋內(nèi)容 #}
多行注釋: {% comment %} 注釋內(nèi)容 {% endcomment %}
變量打印
{{變量名}}
條件判斷
{% if xxx %}
{% elif xxx %}
{% else %}
{% endif %}
{% ifequal a b %}
{% endifequal%}
{% ifnotequal a b %}
{% endifnotequal%}
循環(huán)
{% for item in items %}
{% endfor %}
{% for item in items %}
{% empty %}
{% endfor %}
乘除法
django模板引擎不能夠直接使用變量的相乘以及相除
{% widthratio 數(shù)值變量 分母 分子 %}
轉(zhuǎn)義
{% autoescape off|on %}
{% endautoescape %}
過(guò)濾標(biāo)簽
- safe:不對(duì)變量數(shù)據(jù)進(jìn)行轉(zhuǎn)義
- join:把元素連接起來(lái),相當(dāng)于
''.join(var)
- length:獲取變量的長(zhǎng)度 相當(dāng)于
len(var)
靜態(tài)資源
配置django靜態(tài)文件夾路徑
STATICFILES_DIRS
=[os.path.join(BASE_DIR,'static_path')]
模板中使用{% load static %}
{% static 資源位置 %}
繼承
{% extends 父模板名稱 %}
{% block block_name %} {% endblock %}
包含
{% include 模板名稱 %}
Python Web開(kāi)發(fā)Django-04
課程內(nèi)容
路由規(guī)則
- 固定位置參數(shù)
- 命名參數(shù)
請(qǐng)求與響應(yīng)
- 請(qǐng)求
- 響應(yīng)
路由規(guī)則
給函數(shù)傳遞參數(shù)常用方式:func(arg1,arg2,arg3...),func(key=value,key2=value2,key3=value3...)
固定位置參數(shù)
url(r'path/(\d{4})/(\d{1,2})/(\d{1,2})',view_name)
view_name(request,arg1,arg2,arg3)
命名參數(shù)
url(r'path/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})',view_name)
view_name(request,month,day,year)
請(qǐng)求與響應(yīng)
請(qǐng)求
request是HttpRequest對(duì)象,包含用戶請(qǐng)求的所有信息
屬性
- GET:字典類型,包含的是url中包含的請(qǐng)求參數(shù)
- POST:字典類型,如果與post方式上傳一個(gè)表單數(shù)據(jù),上傳的表單數(shù)據(jù)保存在request.POST中
- FILES:字典類型,如果客戶端通過(guò)表單上傳了文件,那么文件信息保存在request.FILES中
- method:客戶端使用的請(qǐng)求方法
- scheme:客戶端請(qǐng)求使用的協(xié)議
- path:客戶端請(qǐng)求的路徑
- encoding:客戶端數(shù)據(jù)使用的編碼
- content_type:客戶端上傳數(shù)據(jù)所使用的數(shù)據(jù)格式,常見(jiàn):application/json; multipart/form-data;
- COOKIES:字典格式,客戶端請(qǐng)求所帶的cookie
- META:包含請(qǐng)求頭
方法
- read:讀取請(qǐng)求體
- is_ajax:判斷是否是ajax
- is_secure:判斷是否是使用HTTPS協(xié)議
響應(yīng)
每一個(gè)函數(shù)的返回值必須是一個(gè)HttpResponse對(duì)象
構(gòu)造函數(shù)常用參數(shù):
- content:響應(yīng)體
- content_type:響應(yīng)體數(shù)據(jù)類型,例如:application/json
- status:響應(yīng)的狀態(tài)碼
- reason:狀態(tài)碼說(shuō)明