一個公司是由公司中的各部部門來組成的,每一個部門擁有特定的職能,部門與部門之間通過相互的配合來完成讓公司運轉起來。
一個軟體框架是由其中各個軟體模組組成的,每一個模組都有特定的功能,模組與模組之間通過相互配合來完成軟體的開發。
軟體框架是針對某一類軟體設計問題而產生的。
MVC最初是由施樂公司旗下的帕羅奧多研究中心中的一位研究人員給 smalltalk語言發明的一中軟體設計模式。
MVC的產生理念: 分工。讓專門的人去做專門的事。
MVC的核心思想: 解耦。
MVC的思想被應用在的web開發的方面,產生了web MVC框架。
通過瀏覽器註冊使用者資訊。
M:Model,模型, 和資料庫進行互動。
V:View,檢視, 產生html頁面。
C:Controller,控制器, 接收請求,進行處理,與M和V進行互動,返回應答。
Django是勞倫斯出版集團的開發人員為開發新聞內容網站而設計出來的一個軟體,它遵循MVC思想,但是有自己的一個名詞,叫做MVT。
Django遵循快速開發和DRY原則。Do not repeat yourself.不要自己去重複一些工作。
M:Model,模型, 和MVC中M功能相同,和資料庫進行互動。
V:View,檢視, 和MVC中C功能相同,接收請求,進行處理,與M和T進行互動,返回應答。
T:Template,模板, 和MVC中V功能相同,產生html頁面。
之前安裝python包的命令: sudo pip3 install 包名
包的安裝路徑:/usr/local/lib/python3.5/dist-packages
在同一個python環境中安裝同一個包的不同版本,後安裝的包會把原來安裝的包覆蓋掉。這樣,如果同一臺機器上兩個專案依賴於相同包的不同版本,則會導致一些專案執行失敗。
解決的方案就是:虛擬環境。
虛擬環境是真實python環境的複製版本。
在虛擬環境中使用的python是複製的python,安裝python包也是安裝在複製的python中。
安裝虛擬環境的命令:
1)sudo pip install virtualenv -i [https://pypi.tuna.tsinghua.edu.cn/simple/](https://pypi.tuna.tsinghua.edu.cn/simple/)
#安裝虛擬環境
2)sudo pip install virtualenvwrapper -i [https://pypi.tuna.tsinghua.edu.cn/simple/](https://pypi.tuna.tsinghua.edu.cn/simple/)
#安裝虛擬環境擴充套件包
3)編輯家目錄下面的.bashrc檔案,新增下面兩行。
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
# export VIRTUALENVWRAPPER_VIRTUALENV=~/virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=~/.local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh
4)使用source .bashrc使其生效一下。
建立虛擬環境命令:
mkvirtualenv 虛擬環境名
建立python3虛擬環境:
mkvirtualenv -p python3 bj11_py3
進入虛擬環境工作:
workon 虛擬環境名
檢視機器上有多少個虛擬環境:
workon 空格 + 兩個tab鍵
退出虛擬環境:
deactivate
刪除虛擬環境:
rmvirtualenv 虛擬環境名
虛擬環境下安裝包的命令:
pip install 包名
注意:不能使用sudo pip install 包名,這個命令會把包安裝到真實的主機環境上而不是安裝到虛擬環境中。
檢視虛擬環境中安裝了哪些python包:
pip list
pip freeze
安裝django環境:
pip install django==3.2.6
拓展:
apt-get install 軟體
pip install python包名
命令:
django-admin startproject 專案名
注意:建立應用必須先進入虛擬環境。
專案目錄如下:
一個專案由很多個應用組成的,每一個應用完成一個功能模組。
建立應用的命令如下:
python manage.py startapp 應用名
注意:建立應用時需要先進入專案目錄。
應用目錄如下:
建立應用和專案之間的聯絡,需要對應用進行註冊。
修改settings.py中的INSTALLED_APPS設定項。
執行開發web伺服器命令:
python manage.py runserver
django中內嵌了ORM框架,ORM框架可以將類和資料表進行對應起來,只需要通過類和物件就可以對資料表進行操作。
在Django中主要是設計類:模型類。
ORM另外一個作用:根據設計的類生成資料庫中的表。
在應用models.py中設計模型類。
必須繼承與models.Model類。
Models.ForeignKey可以建立兩個模型類之間一對多的關係,django在生成表的時候,就會在多端的表中建立一列作為外來鍵,建立兩個表之間一對多的關係。
進入專案shell的命令:
python manage.py shell
以下為在相互shell終端中演示的例子:
首先匯入模型類:
from booktest.models import BookInfo,HeroInfo
b = BookInfo() #定義一個BookInfo類的物件
b.btitle ='天龍八部' #定義b物件的屬性並賦值
b.bpub_date = date(1990,10,11)
b.save() #才會將資料儲存進資料庫
b = BookInfo.objects.get(id=1)
b.bpub_date = date(1989,10,21)
b.save() #才會更新表格中的資料
b.delete() #才會刪除
h = HeroInfo()
h.hname = '郭靖'
h.hgender = False
h.hcomment = '降龍十八掌'
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #給關係屬性賦值,英雄物件所屬的圖書物件
h.save()
BookInfo.objects.all()
HeroInfo.objects.all()
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查詢出b圖書中所有英雄人物的資訊
語言和時區的在地化。
修改settings.py檔案。
命令:python manage.py createsuperuser
在應用下的admin.py中註冊模型類。
告訴djang框架根據註冊的模型類來生成對應表管理頁面。
b = BookInfo()
str(b) __str__
自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些內容。
在Django中,通過瀏覽器去請求一個頁面時,使用檢視函數來處理這個請求的,檢視函數處理之後,要給瀏覽器返回頁面內容。
檢視函數定義在views.py中。
例:
def index(request):
#進行處理...
return HttpResponse('hello python')
檢視函數必須有一個引數request,進行處理之後,需要返回一個HttpResponse的類物件,hello python就是返回給瀏覽器顯示的內容。
url設定的目的是讓建立url和檢視函數的對應關係。url設定項定義在urlpatterns的列表中,每一個設定項都呼叫url函數。
url函數有兩個引數,第一個引數是一個正規表示式,第二個是對應的處理動作。
設定url時,有兩種語法格式:
工作中在設定url時,首先在專案的urls.py檔案中新增設定項時,並不寫具體的url和檢視函數之間的對應關係,而是包含具體應用的urls.py檔案,在應用的urls.py檔案中寫url和檢視函數的對應關係。
在專案的urls.py檔案中包含具體應用的urls.py檔案,應用的urls.py檔案中寫url和檢視函數的對應關係。
當用戶輸入如http://127.0.0.1:8000/aindex時,去除域名和最前面的/,剩下aindex,拿aindex字串到專案的urls檔案中進行匹配,設定成功之後,去除匹配的a字元,那剩下的index字串繼續到應用的urls檔案中進行正則匹配,匹配成功之後執行檢視函數index,index檢視函數返回內容hellopython給瀏覽器來顯示。
模板不僅僅是一個html檔案。
編碼之前的準備工作:
以下為案例中的簡單設計過程:
O(objects):類和物件。
R(Relation):關係,關聯式資料庫中的表格。
M(Mapping):對映。
Django ORM框架的功能:
修改settings.py中的DATABASES。
注意:django框架不會自動幫我們生成mysql資料庫,所以我們需要自己去建立。
需要安裝操作mysql資料庫的包,python2環境和python3環境有以下區別。
pip install mysql-python
pip install pymysql
python3中安裝好pymysql,需要在test2/init.py中加如下內容:
頁面重定向:伺服器不返回頁面,而是告訴瀏覽器再去請求其他的url地址。
遍歷顯示出每一本圖書的資訊並增加新建和刪除超連結。
屬性名=models.欄位型別(選項)
使用時需要引入django.db.models包,欄位型別如下:
通過選項實現對欄位的約束,選項如下:
對比:null是資料庫範疇的概念,blank是後臺管理頁面表單驗證範疇的。
經驗:
當修改模型類之後,如果新增的選項不影響表的結構,則不需要重新做遷移,商品的選項中default和blank不影響表結構。
參考檔案:
http://python.usyiyi.cn/translate/django_182/index.html
mysql.log是mysql的紀錄檔檔案,裡面記錄的對MySQL資料庫的操作記錄。預設情況下mysql的紀錄檔檔案沒有產生,需要修改mysql的組態檔,步驟如下:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
sudo service mysql restart
/var/log/mysql/mysql.log 是mysql紀錄檔檔案所在的位置。
使用下面的命令可以實時檢視mysql的紀錄檔檔案:
sudo tail -f /var/log/mysql/mysql.log
通過模型類.objects屬性可以呼叫如下函數,實現對模型類對應的資料表的查詢。
get範例:
例:查詢圖書id為3的圖書資訊。
all方法範例:
例:查詢圖書所有資訊。
filter方法範例:
條件格式:
模型類屬性名__條件名=值
查詢圖書評論量為34的圖書的資訊:
a) 判等 條件名:exact
例:查詢編號為1的圖書。
# Django models 語法
BookInfo.objects.get(id=1)
b) 模糊查詢
例:查詢書名包含’傳’的圖書。contains
BookInfo.objects.filter(btitle__contains='傳')
例:查詢書名以’部’結尾的圖書 endswith 開頭:startswith
BookInfo.objects.filter(btitle__endswith='部')
c)空查詢 isnull
例:查詢書名不為空的圖書。isnull
select * from booktest_bookinfo where btitle is not null;
# Django models 語法
BookInfo.objects.filter(btitle__isnull=False)
d)範圍查詢 in
例:查詢id為1或3或5的圖書。
select * from booktest_bookinfo where id in (1,3,5);
# Django models 語法
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;
# Django models 語法
BookInfo.objects.filter(id__gt=3)
f)日期查詢
# 例:查詢1980年發表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)
# 例:查詢1980年1月1日後發表的圖書。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法範例:
# 例:查詢id不為3的圖書資訊。
BookInfo.objects.exclude(id=3)
order_by方法範例:
作用:進行查詢結果進行排序。
# 例:查詢所有圖書的資訊,按照id從小到大進行排序。
BookInfo.objects.all().order_by('id')
# 例:查詢所有圖書的資訊,按照id從大到小進行排序。
BookInfo.objects.all().order_by('-id')
# 例:把id大於3的圖書資訊按閱讀量從大到小排序顯示。
BookInfo.objects.filter(id__gt=3).order_by('-bread')
作用:用於類屬性之間的比較。
使用之前需要先匯入:
from django.db.models import F
# 例:查詢圖書閱讀量大於評論量圖書資訊。
BookInfo.objects.filter(bread__gt=F('bcomment'))
# 例:查詢圖書閱讀量大於2倍評論量圖書資訊。
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
作用:用於查詢時條件之間的邏輯關係。not and or,可以對Q物件進行&|~操作。
使用之前需要先匯入:
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))
作用:對查詢結果進行聚合操作。
sum count avg max min
aggregate:呼叫這個函數來使用聚合。 返回值是一個字典
使用前需先匯入聚合類:
from django.db.models import Sum,Count,Max,Min,Avg
# 例:查詢所有圖書的數目。
BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}
# 例:查詢所有圖書閱讀量的總和。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}
count函數 返回值是一個數位
作用:統計滿足條件資料的數目。
# 例:統計所有圖書的數目。
BookInfo.objects.all().count()
BookInfo.objects.count()
# 例:統計id大於3的所有圖書的數目。
BookInfo.objects.filter(id__gt=3).count()
小結:
查詢相關函數
get :返回一條且只能有一條資料,返回值是一個物件,引數可以寫查詢條件。
all :返回模型類對應表的所有資料,返回值是 Oueryset 。
filter :返回滿足條件的資料,返回值是 Oueryset ,引數可以寫查詢條件。
exclude :返回不滿足條件的資料,返回值是 Oueryset ,引數可以寫查詢條件。
order _ by :對查詢結果進行排序,返回值是 Queryset ,引數中寫排序的欄位。
注意:
from django.db.models import F,Q,Sum,Count,Avg,Max,Min
F物件:用於類屬性之間的比較。
Q物件:用於條件之間的邏輯關係。
aggregate :進行聚合操作,返回值是一個字典,進行聚合的時候需要先匯入聚合類。
count :返回結果集中資料的數目,返回值是一個數位。
注意:對一個 Oueryset 範例物件,可以繼續呼叫上面的所有函數。
參考檔案:
http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html
all, filter, exclude, order_by呼叫這些函數會產生一個查詢集,QuerySet類物件可以繼續呼叫上面的所有函數。
可以對一個查詢集進行取下標或者切片操作來限制查詢集的結果。
對一個查詢集進行切片操作會產生一個新的查詢集,下標不允許為負數。
取出查詢集第一條資料的兩種方式:
exists:判斷一個查詢集中是否有資料。True False
例:圖書類-英雄類
models.ForeignKey() 定義在多的類中。
例:新聞類-新聞型別類 體育新聞 國際新聞
models.ManyToManyField() 定義在哪個類中都可以。
例:員工基本資訊類-員工詳細資訊類. 員工工號
models.OneToOneField定義在哪個類中都可以。
在一對多關係中,一對應的類我們把它叫做一類,多對應的那個類我們把它叫做多類,我們把多類中定義的建立關聯的類屬性叫做關聯屬性。
# 例:查詢id為1的圖書關聯的英雄的資訊。
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通過模型類查詢:
HeroInfo.objects.filter(hbook__id=1)
# 例:查詢id為1的英雄關聯的圖書資訊。
h = HeroInfo.objects.get(id=1)
h.hbook
通過模型類查詢:
BookInfo.objects.filter(heroinfo__id=1)
格式:
由一類的物件查詢多類的時候:
一類的物件.多類名小寫_set.all() #查詢所用資料
由多類的物件查詢一類的時候:
多類的物件.關聯屬性 #查詢多類的物件對應的一類的物件
由多類的物件查詢一類物件的id時候:
多類的物件. 關聯屬性_id
例:查詢圖書資訊,要求圖書關聯的英雄的描述包含’八’。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查詢圖書資訊,要求圖書中的英雄的id大於3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查詢書名為「天龍八部」的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龍八部')
通過多類的條件查詢一類的資料:
一類名.objects.filter(多類名小寫__多類屬性名__條件名)
通過一類的條件查詢多類的資料:
多類名.objects.filter(關聯屬性__一類屬性名__條件名)
呼叫一個模型類物件的save方法的時候就可以實現對模型類對應資料表的插入和更新。
呼叫一個模型類物件的delete方法的時候就可以實現對模型類對應資料表資料的刪除。
自關聯是一種特殊的一對多的關係。
案例:顯示廣州市的上級地區和下級地區。
地區表:id, atitle, aParent_id;
mysql終端中批次執行sql語句:
source areas.sql;
BookInfo.objects.all()->objects是一個什麼東西呢?
答:objects是Django幫我自動生成的管理器物件,通過這個管理器可以實現對資料的查詢。objects是models.Manger類的一個物件。自定義管理器之後Django不再幫我們生成預設的objects管理器。
Django預設生成的表名:
應用名小寫_模型類名小寫。
元選項:
需要在模型類中定義一個元類Meta,在裡面定義一個類屬性db_table就可以指定表名。
接收請求,進行處理,與M和T進行互動,返回應答。
返回html內容 HttpResponse,也可能重定向 redirect,還可以返回json資料。
url: http://127.0.0.1:8000/aindex?a=1
404:找不到頁面,關閉偵錯模式之後,預設會顯示一個標準的錯誤頁面,如果要顯示自定義的頁面,則需要的templates目錄下面自定義一個404.html檔案。
500: 伺服器端的錯誤。
網站開發完成需要關閉偵錯模式,在settings.py檔案中:
DEBUG=False
ALLOWED_HOST=[ ‘*’]
進行url匹配時,把所需要的捕獲的部分設定成一個正規表示式組,這樣django框架就會自動把匹配成功後相應組的內容作為引數傳遞給檢視函數。
非同步的javascript。在不全部載入某一個頁面部的情況下,對頁面進行局的重新整理,ajax請求都在後臺。
圖片,css檔案,js檔案都是靜態檔案。
顯示出登入頁面
def login_ajax(request):
returnrender(request,'booktest/login_ajax.html')
{‘res’:‘1’} #表示登入成功
{‘res’:‘0’} #表示登入失敗
http協定是無狀態的。下一次去存取一個頁面時並不知道上一次對這個頁面做了什麼。
cookie是由伺服器生成,儲存在瀏覽器端的一小段文字資訊。
cookie的特點:
記住使用者名稱案例:
session儲存在伺服器端。
session的特點:
記住使用者登入狀態案例。
cookie:記住使用者名稱。安全性要求不高。
session:涉及到安全性要求比較高的資料。銀行卡賬戶,密碼
產生html,控制頁面上展示的內容。模板檔案不僅僅是一個html檔案。
模板檔案包含兩部分內容:
通常是在檢視函數中使用模板產生html內容返回給使用者端。
模板語言簡稱為DTL。(Django Template Language)
模板變數名是由數位,字母,下劃線和點組成的,不能以下劃線開頭。
使用模板變數:{{模板變數名}}
模板變數的解析順序:
例如:{{ book.btitle }}
如果解析失敗,則產生內容時用空字串填充模板變數。
使用模板變數時,.前面的可能是一個字典,可能是一個物件,還可能是一個列表。
{% 程式碼段 %}
for迴圈:
{% for x in 列表 %}
# 列表不為空時執行
{% empty %}
# 列表為空時執行
{% endfor %}
可以通過{{ forloop.counter }}得到for迴圈遍歷到了第幾次。
{% if 條件 %}
{% elif 條件 %}
{% else %}
{% endif %}
關係比較操作符:> < >= <= == !=
注意:進行比較操作時,比較操作符兩邊必須有空格。
邏輯運算:not and or
過濾器用於對模板變數進行操作。
date:改變日期的顯示格式。
length:求長度。字串,列表.
default:設定模板變數的預設值。
格式:模板變數|過濾器:引數
自定義過濾器。
自定義的過濾器函數,至少有一個引數,最多兩個
參考資料:(模板標籤和內建過濾器)
http://python.usyiyi.cn/documents/django_182/ref/templates/builtins.html
單行註釋:{# 註釋內容 #}
多行註釋:
{% comment %}
註釋內容
{% endcomment %}
模板繼承也是為了重用html頁面內容。
在父模板裡可以定義塊,使用標籤:
{% block 塊名 %}
塊中間可以寫內容,也可以不寫
{% endblock 塊名%}
子模板去繼承父模板之後,可以重寫父模板中的某一塊的內容。
繼承格式:{% extends 父模板檔案路徑%}
{% block 塊名 %}
{{ block.super}} #獲取父模板中塊的預設內容
重寫的內容
{% endblock 塊名%}
編輯商品詳情資訊,資料表中儲存的是html內容。
在模板上下文中的html標記預設是會被跳脫的。
小於號< 轉換為<
大於號> 轉換為>
單引號' 轉換為'
雙引號" 轉換為 "
與符號& 轉換為 &
要關閉模板上下文字串的跳脫:可以使用 {{ 模板變數|safe}}
{% autoescape off %}
模板語言程式碼
{% endautoescape %}
模板寫死中的字串預設不會經過跳脫,如果需要跳脫,那需要手動進行跳脫。
首先做一個登入頁,讓使用者輸入使用者名稱和密碼進行登入,登入成功之後跳轉的修改密碼頁面。在修改密碼頁面輸入新密碼,點選確認按鈕完成密碼修改。
登入頁需要一個模板檔案login.html.修改密碼頁面也需要一個模板檔案change_pwd.html.
顯示登入頁的檢視login,驗證登入的檢視login_check,顯示發帖頁的檢視change_pwd,處理修改密碼的檢視change_pwd_action.
加功能:
使用者登入之後才可以進行修改密碼操作。
登入裝飾器函數。
案例流程圖:
django防止csrf的方式:
防禦原理:
在使用者註冊、登入頁面,為了防止暴力請求,可以加入驗證碼功能,如果驗證碼錯誤,則不需要繼續處理,可以減輕業務伺服器、資料庫伺服器的壓力。
當某一個url設定的地址發生變化時,頁面上使用反向解析生成地址的位置不需要發生變化。
根據url 正規表示式的設定動態的生成url。
在專案urls中包含具體應用的urls檔案時指定namespace;
urlpatterns-[
url(r'^admin/',include(admin.site.urls)),
# 包含應用的urls檔案
url(r'^',include('booktest.urls'),namespace='booktest'),
]
在應用的urls中設定是指定name;
urlpatterns-[
url(r'^index1/$',views.index1,name='index1'),
url(r'^index2/$',views.index2,name='index2'),
]
在模板檔案中使用時,格式如下:
{% url 'namespace名字:name' %}
例如{% url 'booktest:fan2'%}
帶位置引數:
{% url 'namespace名字:name' 引數 %}
例如{% url 'booktest:fan2' 1%}
帶關鍵字引數:
{% url 'namespace名字:name' 關鍵字引數 %}
例如{% url 'booktest:fan2' id=1 %}
在重定向的時候使用反向解析:
from django.core.urlresolvers import reverse
無引數:
reverse('namespace名字:name名字')
如果有位置引數
reverse('namespace名字:name名字', args = 位置引數元組)
如果有關鍵字引數
reverse('namespace名字:name名字', kwargs=字典)
在 網頁使用的css檔案,js檔案和圖片叫做靜態檔案。
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATIC_ROOT = "/home/zic/桌面/singleBlog/singleBlog/static"
STATIC_URL設定存取靜態檔案對應的url。
STATICFILES_DIRS設定靜態檔案所在的物理目錄。
動態生成靜態檔案的路徑。
STATICFILES_FINDERS=('django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder')
中介軟體函數是django框架給我們預留的函數介面,讓我們可以干預請求和應答的過程。
使用request物件的META屬性:request.META[‘REMOTE_ADDR’]
在類中定義中介軟體預留函數。