MVC
MVT
M:Model旬蟋,模型油昂,和MVC中M功能相同,和數(shù)據(jù)庫進(jìn)行交互
V:View倾贰,視圖冕碟,和MVC中C功能相同,接收請求匆浙,進(jìn)行處理安寺,與M以及T進(jìn)行交互,返回應(yīng)答
T:Template首尼,模板我衬,和MVC中V功能相同,產(chǎn)生html頁面
虛擬環(huán)境
之前安裝python包的命令: sudo pip3 install 包名
包的安裝路徑:/usr/local/lib/python3.5/dist-packages
在同一個python環(huán)境中安裝同一個包的不同版本饰恕,后安裝的包會把原來安裝的包覆蓋掉挠羔。這樣,如果同一臺機(jī)器上兩個項(xiàng)目依賴于相同包的不同版本埋嵌,則會導(dǎo)致一些項(xiàng)目運(yùn)行失敗破加。
解決的方案就是:虛擬環(huán)境。
虛擬環(huán)境是真實(shí)python環(huán)境的復(fù)制版本雹嗦。
在虛擬環(huán)境中使用的python是復(fù)制的python,安裝python包也是安裝在復(fù)制的python中范舀。
安裝配置
安裝虛擬環(huán)境的命令:
- sudo pip install virtualenv #安裝虛擬環(huán)境
- sudo pip install virtualenvwrapper #安裝虛擬環(huán)境擴(kuò)展包
- 編輯家目錄下面的.bashrc文件,添加下面兩行了罪。
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh - 使用source .bashrc使其生效一下锭环。
使用
創(chuàng)建虛擬環(huán)境命令:
mkvirtualenv 虛擬環(huán)境名
創(chuàng)建python3虛擬環(huán)境:
mkvirtualenv -p python3 bj11_py3
進(jìn)入虛擬環(huán)境工作:
workon 虛擬環(huán)境名
查看機(jī)器上有多少個虛擬環(huán)境:
workon 空格 + 兩個tab鍵
退出虛擬環(huán)境:
deactivate
刪除虛擬環(huán)境:
rmvirtualenv 虛擬環(huán)境名
虛擬環(huán)境下安裝包的命令:
pip install 包名
注意:不能使用sudo pip install 包名,這個命令會把包安裝到真實(shí)的主機(jī)環(huán)境上而不是安裝到虛擬環(huán)境中泊藕。
查看虛擬環(huán)境中安裝了哪些python包:
pip list
pip freeze
安裝django環(huán)境:
pip install django==1.8.2
拓展:
apt-get install 軟件
pip install python包名
項(xiàng)目創(chuàng)建
- 創(chuàng)建項(xiàng)目
命令:django-admin startproject 項(xiàng)目名
注意:創(chuàng)建應(yīng)用必須先進(jìn)入虛擬環(huán)境辅辩。 - 創(chuàng)建應(yīng)用
一個項(xiàng)目由很多個應(yīng)用組成的,每一個應(yīng)用完成一個特定的功能娃圆。
創(chuàng)建應(yīng)用的命令如下:
python manage.py startapp 應(yīng)用名
注意:創(chuàng)建應(yīng)用時需要先進(jìn)入項(xiàng)目目錄玫锋。 -
建立應(yīng)用和項(xiàng)目之間的聯(lián)系,需要對應(yīng)用進(jìn)行注冊讼呢。
修改settings.py中的INSTALLED_APPS配置項(xiàng)撩鹿。
注冊應(yīng)用.png
4、運(yùn)行開發(fā)web服務(wù)器命令:
python manage.py runserver
ORM
django中內(nèi)嵌了ORM框架悦屏,ORM框架可以將類和數(shù)據(jù)表進(jìn)行對應(yīng)起來节沦,只需要通過類和對象就可以對數(shù)據(jù)表進(jìn)行操作键思。
設(shè)計(jì)類:模型類。
ORM另外一個作用:根據(jù)設(shè)計(jì)的類生成數(shù)據(jù)庫中的表甫贯。
模型類
模型類設(shè)計(jì)
在應(yīng)用models.py中設(shè)計(jì)模型類吼鳞。
必須繼承與models.Model類。
1.設(shè)計(jì)BookInfo類获搏。
2.設(shè)計(jì)HeroInfo類赖条。
Models.ForeignKey可以建立兩個模型類之間一對多的關(guān)系,django在生成表的時候常熙,就會在多的表中創(chuàng)建一列作為外鍵纬乍,建立兩個表之間一對多的關(guān)系。
模型類生成表
- 生成遷移文件
命令:python manage.py makemigrations
遷移文件是根據(jù)模型類生成的裸卫。 - 執(zhí)行遷移生成表
命令:python mange.py migrate
根據(jù)遷移文件生成表仿贬。
生成表名的默認(rèn)格式:應(yīng)用名_模型類名小寫
通過模型類操作數(shù)據(jù)表
進(jìn)入項(xiàng)目shell的命令:python manage.py shell
以下為在項(xiàng)目shell終端中演示的例子:
首先導(dǎo)入模型類:
from booktest.models import BookInfo,HeroInfo
- 向booktest_bookinfo表中插入一條數(shù)據(jù)。
b = BookInfo() #定義一個BookInfo類的對象
b.btitle ='天龍八部' #定義b對象的屬性并賦值
b.bpub_date = date(1990,10,11)
b.save() #才會將數(shù)據(jù)保存進(jìn)數(shù)據(jù)庫 - 查詢出booktest_bookinfo表中id為1的數(shù)據(jù)墓贿。
b = BookInfo.objects.get(id=1) - 在上一步的基礎(chǔ)上改變b對應(yīng)圖書的出版日期茧泪。
b.bpub_date = date(1989,10,21)
b.save() #才會更新表格中的數(shù)據(jù) - 緊接上一步,刪除b對應(yīng)的圖書的數(shù)據(jù)聋袋。
b.delete() #才會刪除 - 向booktest_heroInfo表中插入一條數(shù)據(jù)队伟。
h = HeroInfo()
h.hname = '郭靖' h.hgender = False
h.hcomment = ‘降龍十八掌’
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #給關(guān)系屬性賦值,英雄對象所屬的圖書對象
h.save() - 查詢圖書表里面的所有內(nèi)容幽勒。
BookInfo.objects.all()
HeroInfo.objects.all()
后臺管理
- 本地化
語言和時區(qū)的本地化嗜侮。
修改settings.py文件。 - 創(chuàng)建管理員
命令:python manage.py createsuperuser - 注冊模型類
在應(yīng)用下的admin.py中注冊模型類啥容。
告訴djang框架根據(jù)注冊的模型類來生成對應(yīng)表管理頁面锈颗。
b = BookInfo()
str(b) str - 自定義管理頁面
自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些內(nèi)容咪惠。
視圖函數(shù)的使用
- 定義視圖函數(shù)
視圖函數(shù)定義在views.py中击吱。例:
def index(request):
#進(jìn)行處理。遥昧。覆醇。
return HttpResponse('hello python')
視圖函數(shù)必須有一個參數(shù)request,進(jìn)行處理之后渠鸽,需要返回一個HttpResponse的類對象叫乌,hello python就是返回給瀏覽器顯示的內(nèi)容。
-
進(jìn)行url配置
url配置.png
url配置的目的是讓建立url和視圖函數(shù)的對應(yīng)關(guān)系徽缚。url配置項(xiàng)定義在urlpatterns的列表中,每一個配置項(xiàng)都調(diào)用url函數(shù)革屠。
url函數(shù)有兩個參數(shù)凿试,第一個參數(shù)是一個正則表達(dá)式排宰,第二個是對應(yīng)的處理動作。
配置url時那婉,有兩種語法格式:
- url(正則表達(dá)式板甘,視圖函數(shù)名)
- url(正則表達(dá)式,include(應(yīng)用中的urls文件))
工作中在配置url時详炬,首先在項(xiàng)目的urls.py文件中添加配置項(xiàng)時盐类,并不寫具體的url和視圖函數(shù)之間的對應(yīng)關(guān)系,而是包含具體應(yīng)用的urls.py文件呛谜,在應(yīng)用的urls.py文件中寫url和視圖函數(shù)的對應(yīng)關(guān)系在跳。
url匹配的過程
在項(xiàng)目的urls.py文件中包含具體應(yīng)用的urls.py文件,應(yīng)用的urls.py文件中寫url和視圖函數(shù)的對應(yīng)關(guān)系隐岛。
當(dāng)用戶輸入如http://127.0.0.1:8000/aindex時猫妙,去除域名和最前面的/,剩下aindex聚凹,拿aindex字符串到項(xiàng)目的urls文件中進(jìn)行匹配割坠,配置成功之后,去除匹配的a字符妒牙,那剩下的index字符串繼續(xù)到項(xiàng)目的urls文件中進(jìn)行正則匹配彼哼,匹配成功之后執(zhí)行視圖函數(shù)index,index視圖函數(shù)返回內(nèi)容hello python給瀏覽器來顯示湘今。
模板
模板不僅僅是一個html文件敢朱。
模板文件的使用
- 創(chuàng)建模板文件夾
-
配置模板目錄
模板配置.png
使用模板文件
- 加載模板文件
去模板目錄下面獲取html文件的內(nèi)容,得到一個模板對象象浑。 - 定義模板上下文
向模板文件傳遞數(shù)據(jù)蔫饰。 - 模板渲染
得到一個標(biāo)準(zhǔn)的html內(nèi)容。
給模板文件傳遞數(shù)據(jù)
模板變量使用:{{ 模板變量名 }}
模板代碼段:{%代碼段%}
for循環(huán):
{% for i in list %}
{% endfor %}
django數(shù)據(jù)庫配置
修改settings.py中的DATABASES愉豺。
注意:django框架不會自動幫我們生成mysql數(shù)據(jù)庫篓吁,所以我們需要自己去創(chuàng)建。
切換mysql數(shù)據(jù)庫之后不能啟動服務(wù)器
需要安裝操作mysql數(shù)據(jù)庫的包蚪拦,python2環(huán)境和python3環(huán)境有以下區(qū)別杖剪。
- a) python2需要安裝mysql-python:
pip install mysql-python - b) python3需要安裝pymysql:
pip install pymysql
python3中安裝好pymysql,需要在test2/init.py中加如下內(nèi)容:
import pymysql
pymysql.install_as_MySQLdb()
字段屬性和選項(xiàng)
1. 模型屬性命名限制
- 不能是python的保留關(guān)鍵字驰贷。
- 不允許使用連續(xù)的下劃線盛嘿,這是由django的查詢方式?jīng)Q定的。
- 定義屬性時需要指定字段類型括袒,通過字段類型的參數(shù)指定選項(xiàng)次兆,語法如下:
屬性名=models.字段類型(選項(xiàng))
2. 字段類型
使用時需要引入django.db.models包,字段類型如下:
類型 | 描述 |
---|---|
AutoField | 自動增長的IntegerField锹锰,通常不用指定芥炭,不指定時Django會自動創(chuàng)建屬性名為id的自動增長屬性漓库。 |
BooleanField | 布爾字段,值為True或False园蝠。 |
NullBooleanField | 支持Null渺蒿、True、False三種值 |
CharField(max_length=最大長度) | 字符串彪薛。參數(shù)max_length表示最大字符個數(shù) |
TextField | 大文本字段茂装,一般超過4000個字符時使用 |
IntegerField | 整數(shù) |
DecimalField(max_digits=None, decimal_places=None) | 十進(jìn)制浮點(diǎn)數(shù)。參數(shù)max_digits表示總位善延。參數(shù)decimal_places表示小數(shù)位數(shù) |
FloatField | 浮點(diǎn)數(shù)少态。參數(shù)同上 |
DateField:([auto_now=False, auto_now_add=False]) | 日期。1)參數(shù)auto_now表示每次保存對象時挚冤,自動設(shè)置該字段為當(dāng)前時間况增,用于"最后一次修改"的時間戳,它總是使用當(dāng)前日期训挡,默認(rèn)為false澳骤。2) 參數(shù)auto_now_add表示當(dāng)對象第一次被創(chuàng)建時自動設(shè)置當(dāng)前時間,用于創(chuàng)建的時間戳澜薄,它總是使用當(dāng)前日期为肮,默認(rèn)為false。3)參數(shù)auto_now_add和auto_now是相互排斥的肤京,組合將會發(fā)生錯誤颊艳。 |
TimeField | 時間,參數(shù)同DateField |
DateTimeField | 日期時間忘分,參數(shù)同DateField |
FileField | 上傳文件字段 |
ImageField | 繼承于FileField棋枕,對上傳的內(nèi)容進(jìn)行校驗(yàn),確保是有效的圖片 |
3. 選項(xiàng)
繼承于FileField妒峦,對上傳的內(nèi)容進(jìn)行校驗(yàn)重斑,確保是有效的圖片
選項(xiàng)名 | 描述 |
---|---|
default | 默認(rèn)值。設(shè)置默認(rèn)值 |
primary_key | 若為True肯骇,則該字段會成為模型的主鍵字段窥浪,默認(rèn)值是False,一般作為AutoField的選項(xiàng)使用 |
unique | 如果為True, 這個字段在表中必須有唯一值笛丙,默認(rèn)值是False |
db_index | 若值為True, 則在表中會為此字段創(chuàng)建索引漾脂,默認(rèn)值是False |
db_column | 字段的名稱,如果未指定胚鸯,則使用屬性的名稱 |
null | 如果為True骨稿,表示允許為空,默認(rèn)值是False |
black | 如果為True,表示允許為空啊终,默認(rèn)值是False |
對比:null是數(shù)據(jù)庫范疇的概念镜豹,blank是后臺管理頁面表單驗(yàn)證范疇的傲须。
經(jīng)驗(yàn):當(dāng)修改模型類之后蓝牲,如果添加的選項(xiàng)不影響表的結(jié)構(gòu),則不需要重新做遷移泰讽,商品的選項(xiàng)中default和blank不影響表結(jié)構(gòu)例衍。
參考文檔:http://python.usyiyi.cn/translate/django_182/index.html
查詢
mysql日志文件
mysql.log是mysql的日志文件,里面記錄的對MySQL數(shù)據(jù)庫的操作記錄已卸。默認(rèn)情況下mysql的日志文件沒有產(chǎn)生佛玄,需要修改mysql的配置文件,步驟如下:
- 使用下面的命令打開mysql的配置文件累澡,去除68,69行的注釋梦抢,然后保存。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf - 重啟mysql服務(wù)愧哟,就會產(chǎn)生mysql日志文件奥吩。
sudo service mysql restart - 打開MySQL的日志文件。
/var/log/mysql/mysql.log 是mysql日志文件所在的位置蕊梧。
使用下面的命令可以實(shí)時查看mysql的日志文件:
sudo tail -f /var/log/mysql/mysql.log
查詢函數(shù)
通過模型類.objects屬性可以調(diào)用如下函數(shù)霞赫,實(shí)現(xiàn)對模型類對應(yīng)的數(shù)據(jù)表的查詢。
函數(shù)名 | 功能 | 返回值 | 說明 |
---|---|---|---|
get | 返回表中滿足條件的一條且只能有一條數(shù)據(jù)肥矢。 | 返回表中滿足條件的一條且只能有一條數(shù)據(jù) | 參數(shù)中寫查詢條件端衰。1. 如果查到多條數(shù)據(jù),則拋異常MultipleObjectsReturned 2. 查詢不到數(shù)據(jù)甘改,則拋異常:DoesNotExist |
all | 返回模型類對應(yīng)表格中的所有數(shù)據(jù) | 返回值是QuerySet類型 | 查詢集 |
filter | 返回滿足條件的數(shù)據(jù)旅东。 | 返回值是QuerySet類型 | 參數(shù)寫查詢條件。 |
exclude | 返回不滿足條件的數(shù)據(jù) | 返回值是QuerySet類型 | 參數(shù)寫查詢條件 |
order_by | 對查詢結(jié)果進(jìn)行排序 | 返回值是QuerySet類型 | 參數(shù)中寫根據(jù)哪些字段進(jìn)行排序 |
get示例:
例:查詢圖書id為3的圖書信息十艾。
all方法示例:
例:查詢圖書所有信息抵代。
filter方法示例:
條件格式:
模型類屬性名__條件名=值
查詢圖書評論量為34的圖書的信息:
a)判等 條件名:exact。
例:查詢編號為1的圖書疟羹。
BookInfo.objects.get(id=1)
b)模糊查詢
例:查詢書名包含'傳'的圖書主守。contains
BookInfo.objects.filter(btitle__contains='傳')
例:查詢書名以'部'結(jié)尾的圖書 endswith 開頭:startswith
BookInfo.objects.filter(btitle__endswith='部')
c)空查詢 isnull
例:查詢書名不為空的圖書。isnull
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
d)范圍查詢 in
例:查詢id為1或3或5的圖書榄融。
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])
e)比較查詢 gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查詢id大于3的圖書参淫。
Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)
f)日期查詢
例:查詢1980年發(fā)表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)
例:查詢1980年1月1日后發(fā)表的圖書愧杯。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查詢id不為3的圖書信息涎才。
BookInfo.objects.exclude(id=3)
order_by方法示例:
作用:進(jìn)行查詢結(jié)果進(jìn)行排序。
例:查詢所有圖書的信息,按照id從小到大進(jìn)行排序耍铜。
BookInfo.objects.all().order_by('id')
例:查詢所有圖書的信息邑闺,按照id從大到小進(jìn)行排序。
BookInfo.objects.all().order_by('-id')
例:把id大于3的圖書信息按閱讀量從大到小排序顯示棕兼。
BookInfo.objects.filter(id__gt=3).order_by('-bread')
F對象
作用:用于類屬性之間的比較陡舅。
使用之前需要先導(dǎo)入:
from django.db.models import F
例:查詢圖書閱讀量大于評論量圖書信息。
BookInfo.objects.filter(bread__gt=F('bcomment'))
例:查詢圖書閱讀量大于2倍評論量圖書信息伴挚。
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
Q對象
作用:用于查詢時條件之間的邏輯關(guān)系靶衍。not and or,可以對Q對象進(jìn)行&|~操作茎芋。
使用之前需要先導(dǎo)入:
from django.db.models import Q
例:查詢id大于3且閱讀量大于30的圖書的信息颅眶。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
例:查詢id大于3或者閱讀量大于30的圖書的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
例:查詢id不等于3圖書的信息田弥。
BookInfo.objects.filter(~Q(id=3))
聚合函數(shù)
作用:對查詢結(jié)果進(jìn)行聚合操作涛酗。
sum count avg max min
aggregate:調(diào)用這個函數(shù)來使用聚合。 返回值是一個字典
使用前需先導(dǎo)入聚合類:
from django.db.models import Sum,Count,Max,Min,Avg
例:查詢所有圖書的數(shù)目偷厦。
BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}
例:查詢所有圖書閱讀量的總和商叹。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}
count函數(shù) 返回值是一個數(shù)字
作用:統(tǒng)計(jì)滿足條件數(shù)據(jù)的數(shù)目。
例:統(tǒng)計(jì)所有圖書的數(shù)目沪哺。
BookInfo.objects.all().count()
BookInfo.objects.count()
例:統(tǒng)計(jì)id大于3的所有圖書的數(shù)目沈自。
BookInfo.objects.filter(id__gt=3).count()
查詢集
all, filter, exclude, order_by調(diào)用這些函數(shù)會產(chǎn)生一個查詢集,QuerySet類對象可以繼續(xù)調(diào)用上面的所有函數(shù)辜妓。
查詢集特性
- 惰性查詢:只有在實(shí)際使用查詢集中的數(shù)據(jù)的時候才會發(fā)生對數(shù)據(jù)庫的真正查詢枯途。
- 緩存:當(dāng)使用的是同一個查詢集時,第一次使用的時候會發(fā)生實(shí)際數(shù)據(jù)庫的查詢籍滴,然后把結(jié)果緩存起來酪夷,之后再使用這個查詢集時,使用的是緩存中的結(jié)果
限制查詢集
可以對一個查詢集進(jìn)行取下標(biāo)或者切片操作來限制查詢集的結(jié)果孽惰。
對一個查詢集進(jìn)行切片操作會產(chǎn)生一個新的查詢集晚岭,下標(biāo)不允許為負(fù)數(shù)。
取出查詢集第一條數(shù)據(jù)的兩種方式:
方式 | 說明 |
---|---|
b[0] | 如果b[0]不存在勋功,會拋出IndexError異常 |
b[0:1].get() | 如果b[0:1].get()不存在坦报,會拋出DoesNotExist異常 |
exists:判斷一個查詢集中是否有數(shù)據(jù)。True False
模型類查詢
- 一對多關(guān)系
例:圖書類-英雄類
models.ForeignKey() 定義在多的類中狂鞋。 - 多對多關(guān)系
例:新聞類-新聞類型類 體育新聞 國際新聞
models.ManyToManyField() 定義在哪個類中都可以片择。 - 一對一關(guān)系
例:員工基本信息類-員工詳細(xì)信息類. 員工工號
models.OneToOneField定義在哪個類中都可以。
關(guān)聯(lián)查詢(一對多)
1. 查詢和對象關(guān)聯(lián)的數(shù)據(jù)
在一對多關(guān)系中骚揍,一對應(yīng)的類我們把它叫做一類字管,多對應(yīng)的那個類我們把它叫做多類啰挪,我們把多類中定義的建立關(guān)聯(lián)的類屬性叫做關(guān)聯(lián)屬性。
例:查詢id為1的圖書關(guān)聯(lián)的英雄的信息嘲叔。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通過模型類查詢:
HeroInfo.objects.filter(hbook__id=1)
例:查詢id為1的英雄關(guān)聯(lián)的圖書信息亡呵。
h = HeroInfo.objects.get(id=1)
h.hbook
通過模型類查詢:
BookInfo.objects.filter(heroinfo__id=1)
格式:
由一類的對象查詢多類的時候:
一類的對象.多類名小寫_set.all() #查詢所用數(shù)據(jù)
由多類的對象查詢一類的時候:
多類的對象.關(guān)聯(lián)屬性 #查詢多類的對象對應(yīng)的一類的對象
由多類的對象查詢一類對象的id時候:
多類的對象. 關(guān)聯(lián)屬性_id
2. 通過模型類實(shí)現(xiàn)關(guān)聯(lián)查詢
例:查詢圖書信息,要求圖書關(guān)聯(lián)的英雄的描述包含'八'硫戈。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查詢圖書信息锰什,要求圖書中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查詢書名為“天龍八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龍八部')
通過多類的條件查詢一類的數(shù)據(jù):
一類名.objects.filter(多類名小寫多類屬性名條件名)
通過一類的條件查詢多類的數(shù)據(jù):
多類名.objects.filter(關(guān)聯(lián)屬性一類屬性名條件名)
插入掏愁、刪除和更新
調(diào)用一個模型類對象的save方法的時候就可以實(shí)現(xiàn)對模型類對應(yīng)數(shù)據(jù)表的插入和更新养涮。
調(diào)用一個模型類對象的delete方法的時候就可以實(shí)現(xiàn)對模型類對應(yīng)數(shù)據(jù)表數(shù)據(jù)的刪除蛔趴。
自關(guān)聯(lián)
自關(guān)聯(lián)是一種特殊的一對多的關(guān)系鲁纠。
案例:顯示廣州市的上級地區(qū)和下級地區(qū)歌逢。
地區(qū)表:id, atitle, aParent_id;
mysql終端中批量執(zhí)行sql語句:source areas.sql;
管理器
BookInfo.objects.all()->objects是一個什么東西呢搁凸?
答:objects是Django幫我自動生成的管理器對象轴捎,通過這個管理器可以實(shí)現(xiàn)對數(shù)據(jù)的查詢憋他。
objects是models.Manger類的一個對象进陡。自定義管理器之后Django不再幫我們生成默認(rèn)的objects管理器释牺。
- 自定義一個管理器類萝衩,這個類繼承models.Manger類。
- 再在具體的模型類里定義一個自定義管理器類的對象没咙。
自定義管理器類的應(yīng)用場景:
- 改變查詢的結(jié)果集猩谊。
比如調(diào)用BookInfo.books.all()返回的是沒有刪除的圖書的數(shù)據(jù)。 -
添加額外的方法祭刚。
管理器類中定義一個方法幫我們操作模型類對應(yīng)的數(shù)據(jù)表牌捷。
使用self.model()就可以創(chuàng)建一個跟自定義管理器對應(yīng)的模型類對象。
小結(jié):
管理器.png
元選項(xiàng)
Django默認(rèn)生成的表名:
應(yīng)用名小寫_模型類名小寫涡驮。
元選項(xiàng):
需要在模型類中定義一個元類Meta,在里面定義一個類屬性db_table就可以指定表名暗甥。
視圖
1.視圖的功能
接收請求,進(jìn)行處理捉捅,與M和T進(jìn)行交互撤防,返回應(yīng)答。
返回html內(nèi)容 HttpResponse棒口,也可能重定向 redirect,還可以返回json數(shù)據(jù)寄月。
2.視圖函數(shù)使用
- 使用
- 定義視圖函數(shù)
request參數(shù)必須有。是一個HttpRequest類型的對象初橘。參數(shù)名可以變化耕蝉,但不要更改扔亥。 - 配置url
建立url和視圖函數(shù)之間的對應(yīng)關(guān)系踢关。
- url配置的過程
1.在項(xiàng)目的urls文件中包含具體應(yīng)用的urls文件签舞,在具體應(yīng)用的urls文件中包含具體url和視圖的對應(yīng)關(guān)系。
2.url配置項(xiàng)是定義在一個名叫urlpatterns的列表中搂鲫,其中的每一個元素就是一個配置項(xiàng)魂仍,每一個配置項(xiàng)都調(diào)用url函數(shù)。
3.url匹配過程
url:http://127.0.0.1:8000/aindex?a=1
- 去除域名和后面的參數(shù)闸英,剩下/aindex,再把前面的/去掉出吹,剩下aindex
- 拿aindex先到項(xiàng)目的url.py文件中進(jìn)行從上到下的匹配鸠珠,匹配成功之后執(zhí)行后面對應(yīng)的處理動作,就是把匹配成功的部分a字符去除驯耻,然后拿剩下的部分index到應(yīng)用的urls.py文件中再進(jìn)行從上到下的匹配。
- 如果匹配成功則調(diào)用相應(yīng)的視圖產(chǎn)生內(nèi)容返回給客戶端可缚。如果匹配失敗則產(chǎn)生404錯誤。
錯誤視圖
404:找不到頁面帘靡,關(guān)閉調(diào)試模式之后,默認(rèn)會顯示一個標(biāo)準(zhǔn)的錯誤頁面测柠,如果要顯示自定義的頁面,則需要的templates目錄下面自定義一個404.html文件缘滥。
- a) url沒有配置
- b) url配置錯誤
500: 服務(wù)器端的錯誤谒主。
- a) 視圖出錯
網(wǎng)站開發(fā)完成需要關(guān)閉調(diào)試模式霎肯,在settings.py文件中:
DEBUG=False
ALLOWED_HOST=[ '*']
捕獲url參數(shù)
進(jìn)行url匹配時,把所需要的捕獲的部分設(shè)置成一個正則表達(dá)式組搪柑,這樣django框架就會自動把匹配成功后相應(yīng)組的內(nèi)容作為參數(shù)傳遞給視圖函數(shù)聋丝。
- 位置參數(shù)
位置參數(shù),參數(shù)名可以隨意指定 - 關(guān)鍵字參數(shù):在位置參數(shù)的基礎(chǔ)上給正則表達(dá)式組命名即可工碾。
?P<組名>
關(guān)鍵字參數(shù)弱睦,視圖中參數(shù)名必須和正則表達(dá)式組名一致.
Ajax
基本概念
異步的javascript。在不全部加載某一個頁面部的情況下渊额,對頁面進(jìn)行局的刷新况木,ajax請求都在后臺垒拢。
圖片,css文件火惊,js文件都是靜態(tài)文件求类。
- 發(fā)起ajax請求:jquery發(fā)起
- 執(zhí)行相應(yīng)的視圖函數(shù),返回json內(nèi)容
- 執(zhí)行相應(yīng)的回調(diào)函數(shù)矗晃。通過判斷json內(nèi)容仑嗅,進(jìn)行相應(yīng)處理。
Ajax登錄案例
- 首先分析出請求地址時需要攜帶的參數(shù)张症。
- 視圖函數(shù)處理完成之后仓技,所返回的json的格式。
- 顯示出登錄頁面
- a) 設(shè)計(jì)url俗他,通過瀏覽器訪問 http://127.0.0.1:8000/login_ajax 時顯示登錄頁面脖捻。
- b) 設(shè)計(jì)url對應(yīng)的視圖函數(shù)login_ajax。
- c) 編寫模板文件login_ajax.html兆衅。
在里面寫jquery代碼發(fā)起ajax請求地沮。
- 登錄校驗(yàn)功能
- a) 設(shè)計(jì)url,點(diǎn)擊登錄頁的登錄按鈕發(fā)起請求http://127.0.0.1:8000/login_ajax_check時進(jìn)行登錄校驗(yàn)。
- b) 設(shè)計(jì)url對應(yīng)的視圖函數(shù)login_ajax_check羡亩。
接收post提交過來的數(shù)據(jù)摩疑。
進(jìn)行登錄校驗(yàn),并返回json內(nèi)容畏铆。 JsonRepsone
Json格式如下:
{'res':'1'} #表示登錄成功
{'res':'0'} #表示登錄失敗
狀態(tài)保持
http協(xié)議是無狀態(tài)的雷袋。下一次去訪問一個頁面時并不知道上一次對這個頁面做了什么。
-
cookie
cookie.png
cookie是由服務(wù)器生成辞居,存儲在瀏覽器端的一小段文本信息楷怒。
cookie的特點(diǎn):
- 以鍵值對方式進(jìn)行存儲。
- 通過瀏覽器訪問一個網(wǎng)站時瓦灶,會將瀏覽器存儲的跟網(wǎng)站相關(guān)的所有cookie信息發(fā)送給該網(wǎng)站的服務(wù)器鸠删。request.COOKIES
- cookie是基于域名安全的。www.baidu.com www.tudou.com
- cookie是有過期時間的贼陶,如果不指定刃泡,默認(rèn)關(guān)閉瀏覽器之后cookie就會過期。
-
session
session.png
session存儲在服務(wù)器端每界。
session的特點(diǎn):
- session是以鍵值對進(jìn)行存儲的捅僵。
- session依賴于cookie。唯一的標(biāo)識碼保存在sessionid cookie中眨层。
- session也是有過期時間庙楚,如果不指定,默認(rèn)兩周就會過期
- cookie和session的應(yīng)用場景
cookie:記住用戶名趴樱。安全性要求不高馒闷。
session:涉及到安全性要求比較高的數(shù)據(jù)酪捡。銀行卡賬戶,密碼
模板
1.模板的功能
產(chǎn)生html,控制頁面上展示的內(nèi)容纳账。模板文件不僅僅是一個html文件逛薇。
模板文件包含兩部分內(nèi)容:
- 靜態(tài)內(nèi)容:css,js,html。
- 動態(tài)內(nèi)容:用于動態(tài)去產(chǎn)生一些網(wǎng)頁內(nèi)容疏虫。通過模板語言來產(chǎn)生永罚。
2.模板文件的使用
通常是在視圖函數(shù)中使用模板產(chǎn)生html內(nèi)容返回給客戶端。
- a) 加載模板文件 loader.get_template
獲取模板文件的內(nèi)容卧秘,產(chǎn)生一個模板對象呢袱。 - b) 定義模板上下文 RequeseContext
給模板文件傳遞數(shù)據(jù)。 - c) 模板渲染產(chǎn)生html頁面內(nèi)容 render
用傳遞的數(shù)據(jù)替換相應(yīng)的變量翅敌,產(chǎn)生一個替換后的標(biāo)準(zhǔn)的html內(nèi)容羞福。
3.模板文件加載順序
- 首先去配置的模板目錄下面去找模板文件。
- 去INSTALLED_APPS下面的每個應(yīng)用的templates去找模板文件蚯涮,前提是應(yīng)用中必須有templates文件夾治专。
4.模板語言
模板語言簡稱為DTL。(Django Template Language)
- 模板變量
模板變量名是由數(shù)字遭顶,字母张峰,下劃線和點(diǎn)組成的,不能以下劃線開頭棒旗。
使用模板變量:{{模板變量名}}
模板變量的解析順序:
例如:{{ book.btitle }}
- 首先把book當(dāng)成一個字典挟炬,把btitle當(dāng)成鍵名,進(jìn)行取值book['btitle']
- 把book當(dāng)成一個對象嗦哆,把btitle當(dāng)成屬性,進(jìn)行取值book.btitle
- 把book當(dāng)成一個對象婿滓,把btitle當(dāng)成對象的方法老速,進(jìn)行取值book.btitle
例如:{{book.0}}
- 首先把book當(dāng)成一個字典,把0當(dāng)成鍵名凸主,進(jìn)行取值book[0]
- 把book當(dāng)成一個列表橘券,把0當(dāng)成下標(biāo),進(jìn)行取值book[0]
如果解析失敗卿吐,則產(chǎn)生內(nèi)容時用空字符串填充模板變量旁舰。
使用模板變量時,.前面的可能是一個字典嗡官,可能是一個對象箭窜,還可能是一個列表。
模板標(biāo)簽
{% 代碼段 %}
for循環(huán):
{% for x in 列表 %}
# 列表不為空時執(zhí)行
{% empty %}
# 列表為空時執(zhí)行
{% endfor %}
可以通過{{ forloop.counter }}得到for循環(huán)遍歷到了第幾次衍腥。
{% if 條件 %}
{% elif 條件 %}
{% else %}
{% endif %}
關(guān)系比較操作符:> < >= <= == !=
注意:進(jìn)行比較操作時磺樱,比較操作符兩邊必須有空格纳猫。
邏輯運(yùn)算:not and or過濾器
過濾器用于對模板變量進(jìn)行操作。
date:改變?nèi)掌诘娘@示格式竹捉。
length:求長度芜辕。字符串,列表.
default:設(shè)置模板變量的默認(rèn)值块差。
格式:模板變量|過濾器:參數(shù)
自定義過濾器侵续。
自定義的過濾器函數(shù),至少有一個參數(shù)憨闰,最多兩個状蜗。
from django.template import Library
register = Library()
@register.filter
def mod(num):
return num % 2 == 0
@register.filter
def mod_val(num,val):
return num % val == 0
- 模板注釋
單行注釋:{# 注釋內(nèi)容 #}
多行注釋:
{% comment %}
注釋內(nèi)容
{% endcomment %}
模板繼承
模板繼承也是為了重用html頁面內(nèi)容。
在父模板里可以定義塊起趾,使用標(biāo)簽:
{% block 塊名 %}
塊中間可以寫內(nèi)容诗舰,也可以不寫
{% endblock 塊名%}
子模板去繼承父模板之后,可以重寫父模板中的某一塊的內(nèi)容训裆。
繼承格式:{% extends 父模板文件路徑%}
{% block 塊名 %}
{{ block.super}} #獲取父模板中塊的默認(rèn)內(nèi)容
重寫的內(nèi)容
{% endblock 塊名%}
html轉(zhuǎn)義
編輯商品詳情信息眶根,數(shù)據(jù)表中保存的是html內(nèi)容。
在模板上下文中的html標(biāo)記默認(rèn)是會被轉(zhuǎn)義的边琉。
小于號< 轉(zhuǎn)換為<
大于號> 轉(zhuǎn)換為>
單引號' 轉(zhuǎn)換為'
雙引號" 轉(zhuǎn)換為 "
與符號& 轉(zhuǎn)換為 &
要關(guān)閉模板上下文字符串的轉(zhuǎn)義:可以使用 {{ 模板變量|safe}}
也可以使用:
{% autoescape off %}
模板語言代碼
{% endautoescape %}
模板硬編碼中的字符串默認(rèn)不會經(jīng)過轉(zhuǎn)義属百,如果需要轉(zhuǎn)義,那需要手動進(jìn)行轉(zhuǎn)義变姨。
csrf攻擊
首先做一個登錄頁族扰,讓用戶輸入用戶名和密碼進(jìn)行登錄,登錄成功之后跳轉(zhuǎn)的修改密碼頁面定欧。在修改密碼頁面輸入新密碼渔呵,點(diǎn)擊確認(rèn)按鈕完成密碼修改。
登錄頁需要一個模板文件login.html.修改密碼頁面也需要一個模板文件change_pwd.html.
顯示登錄頁的視圖login砍鸠,驗(yàn)證登錄的視圖login_check扩氢,顯示發(fā)帖頁的視圖change_pwd,處理修改密碼的視圖change_pwd_action.
加功能:
a)只有用戶登錄之后才可以進(jìn)行修改密碼操作。
登錄裝飾器函數(shù)爷辱。
案例流程圖:
django防止csrf的方式:
- 默認(rèn)打開csrf中間件录豺。
- 表單post提交數(shù)據(jù)時加上{% csrf_token %}標(biāo)簽。
防御原理:
- 渲染模板文件時在頁面生成一個名字叫做csrfmiddlewaretoken的隱藏域饭弓。
- 服務(wù)器交給瀏覽器保存一個名字為csrftoken的cookie信息双饥。
提交表單時,兩個值都會發(fā)給服務(wù)器弟断,服務(wù)器進(jìn)行比對咏花,如果一樣,則csrf驗(yàn)證通過夫嗓,否則失敗迟螺。
驗(yàn)證碼
在用戶注冊冲秽、登錄頁面,為了防止暴力請求矩父,可以加入驗(yàn)證碼功能锉桑,如果驗(yàn)證碼錯誤,則不需要繼續(xù)處理窍株,可以減輕業(yè)務(wù)服務(wù)器民轴、數(shù)據(jù)庫服務(wù)器的壓力。
反向解析
當(dāng)某一個url配置的地址發(fā)生變化時球订,頁面上使用反向解析生成地址的位置不需要發(fā)生變化后裸。
根據(jù)url 正則表達(dá)式的配置動態(tài)的生成url。
在項(xiàng)目urls中包含具體應(yīng)用的urls文件時指定namespace;
在應(yīng)用的urls中配置是指定name;
在模板文件中使用時冒滩,格式如下:
{% url 'namespace名字:name' %} 例如{% url 'booktest:fan2'%}
帶位置參數(shù):
{% url 'namespace名字:name' 參數(shù) %} 例如{% url 'booktest:fan2' 1%}
帶關(guān)鍵字參數(shù):
{% url 'namespace名字:name' 關(guān)鍵字參數(shù) %} 例如{% url 'booktest:fan2' id=1 %}
在重定向的時候使用反向解析:
from django.core.urlresolvers import reverse
無參數(shù):
reverse('namespace名字:name名字')
如果有位置參數(shù)
reverse('namespace名字:name名字', args = 位置參數(shù)元組)
如果有關(guān)鍵字參數(shù)
reverse('namespace名字:name名字', kwargs=字典)
靜態(tài)文件
使用
在 網(wǎng)頁使用的css文件微驶,js文件和圖片叫做靜態(tài)文件。
-
新建靜態(tài)文件夾 static开睡。
image.png - 配置靜態(tài)文件所在的物理目錄因苹。Settings.py
STATIC_URL設(shè)置訪問靜態(tài)文件對應(yīng)的url。
STATICFILES_DIRS設(shè)置靜態(tài)文件所在的物理目錄篇恒。
動態(tài)生成靜態(tài)文件的路徑扶檐。
加載目錄
STATICFILES_FINDERS=('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder'
中間件
中間件函數(shù)是django框架給我們預(yù)留的函數(shù)接口,讓我們可以干預(yù)請求和應(yīng)答的過程胁艰。
獲取瀏覽器端的ip地址
使用request對象的META屬性:request.META['REMOTE_ADDR']
使用中間件
- 新建middleware.py文件款筑。
-
定義中間件類。
image.png
在類中定義中間件預(yù)留函數(shù)腾么。
__init__:服務(wù)器響應(yīng)第一個請求的時候調(diào)用奈梳。
process_request:是在產(chǎn)生request對象,進(jìn)行url匹配之前調(diào)用解虱。
process_view:是url匹配之后颈嚼,調(diào)用視圖函數(shù)之前。
process_response:視圖函數(shù)調(diào)用之后饭寺,內(nèi)容返回給瀏覽器之前。
process_exception:視圖函數(shù)出現(xiàn)異常叫挟,會調(diào)用這個函數(shù)艰匙。
如果注冊的多個中間件類中包含process_exception函數(shù)的時候,調(diào)用的順序跟注冊的順序是相反的抹恳。
-
注冊中間件類员凝。
image.png
Admin后臺管理
使用
- 本地化。語言和時區(qū)本地化奋献。
- 創(chuàng)建超級管理員健霹。
python mange.py createsuperuser - 注冊模型類旺上。
- 自定義管理頁面。
自定義模型管理類糖埋。
注冊模型類的時候給register函數(shù)添加第二個參數(shù)宣吱,就是自定義模型管理類的名字。
模型管理類相關(guān)屬性
- 列表頁相關(guān)的選項(xiàng)瞳别。
- 編輯頁相關(guān)的選項(xiàng)征候。
上傳圖片
商品銷售網(wǎng)站。
- 配置上傳文件保存目錄
-
新建上傳文件保存目錄祟敛。
image.png
-
配置上傳文件保存目錄
image.png 后臺管理頁面上傳圖片
-
設(shè)計(jì)模型類
image.png -
遷移生成表格
image.png - 注冊模型類
- 用戶自定義頁面上傳圖片
-
定義用戶上傳圖片的頁面并顯示疤坝,是一個自定義的表單。
image.png 定義接收上傳文件的視圖函數(shù)
request對象有一個FILES的屬性馆铁,類似于字典跑揉,通過request.FILES可以獲取上傳文件的處理對象。
在django中埠巨,上傳文件不大于2.5M,文件放在內(nèi)存中历谍。上傳文件大于2.5M,文件內(nèi)容寫到一個臨時文件中。
Django處理上傳文件的兩個類:
FILE_UPLOAD_HANDLERS= ("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler")
分頁
查詢出所有省級地區(qū)的信息乖订,顯示在頁面上扮饶。
AeroInfo.objects.filter(aParent__isnull = True)
- 查詢出所有省級地區(qū)的信息。
- 按每頁顯示10條信息進(jìn)行分頁乍构,默認(rèn)顯示第一頁的信息甜无,下面并顯示出頁碼。
- 點(diǎn)擊i頁鏈接的時候哥遮,就顯示第i頁的省級地區(qū)信息岂丘。
from django.core.paginator import Paginator
paginator = Paginator(areas, 10) #按每頁10條數(shù)據(jù)進(jìn)行分頁
Paginator類對象的屬性:
屬性名 | 說明 |
---|---|
num_pages | 返回分頁之后的總頁數(shù) |
page_range | 返回分頁后頁碼的列表 |
Pageinator類對象的方法:
方法名 | 說明 |
---|---|
page(self,number) | 返回第number頁的page類實(shí)例對象 |
Page類對象的屬性:
屬性名 | 說明 |
---|---|
number | 返回當(dāng)前頁的頁碼 |
object_list | 返回包含當(dāng)前頁的數(shù)據(jù)的查詢集 |
paginator | 返回對應(yīng)的Paginator類對象 |
Page類對象的方法:
屬性名 | 說明 |
---|---|
has_previous | 判斷當(dāng)前頁是否有前一頁 |
has_next | 判斷當(dāng)前頁是否有下一頁 |
previous_page_number | 返回前一頁的頁碼 |
next_page_number | 返回下一頁的頁碼 |
省市縣選擇案例
- 顯示省地區(qū)信息。
$.get('/prov', function(data){
}) - 省改變時在對應(yīng)的下拉列表框中顯示下級市的信息眠饮。
$.get('/city?pid='+pid, function(data){
})
request.GET.get(‘pid’)
或者:
$.get('/city'+$(this).val(), function(data){
}) - 市改變時在對應(yīng)的下拉列表框中顯示下級縣的信息奥帘。
$.get('/dis?pid='+pid, function(data){
})
或者:
$.get('/dis'+$(this).val(), function(data){
})