中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

北京高端網(wǎng)站建設(shè)有限公司太原網(wǎng)站制作優(yōu)化seo

北京高端網(wǎng)站建設(shè)有限公司,太原網(wǎng)站制作優(yōu)化seo,門面設(shè)計(jì)裝修效果圖,游惠萍建盞簡介文章目錄 一、Web應(yīng)用Web應(yīng)用程序的優(yōu)點(diǎn)Web應(yīng)用程序的缺點(diǎn)應(yīng)用程序有兩種模式C/S、B/S C/S 客戶端/服務(wù)端局域網(wǎng)連接其他電腦的MySQL數(shù)據(jù)庫1.先用其他電腦再cmd命令行ping本機(jī)ip2.開放MySQL的訪問 B/S 瀏覽器/服務(wù)端基于socket編寫一個(gè)Web應(yīng)用 二、Http協(xié)議1.http協(xié)議是什么2.h…

文章目錄

  • 一、Web應(yīng)用
      • Web應(yīng)用程序的優(yōu)點(diǎn)
      • Web應(yīng)用程序的缺點(diǎn)
          • 應(yīng)用程序有兩種模式C/S、B/S
      • C/S 客戶端/服務(wù)端
      • 局域網(wǎng)連接其他電腦的MySQL數(shù)據(jù)庫
            • 1.先用其他電腦再cmd命令行ping本機(jī)ip
            • 2.開放MySQL的訪問
      • B/S 瀏覽器/服務(wù)端
      • 基于socket編寫一個(gè)Web應(yīng)用
  • 二、Http協(xié)議
      • 1.http協(xié)議是什么
      • 2.http協(xié)議特性
        • 1. 基于TCP/IP協(xié)議之上的應(yīng)用層協(xié)議
        • 2. 基于請(qǐng)求-響應(yīng)模式
        • 3. 無狀態(tài)保存
        • 4.無連接
      • 3.Http請(qǐng)求協(xié)議與響應(yīng)協(xié)議
        • 請(qǐng)求協(xié)議:
      • 響應(yīng)式協(xié)議
      • Http有哪些版本
            • HTTP 0.9
            • HTTP 1.0
            • HTTP1.1
            • HTTP/2.0
            • HTTP/3.0
            • 總結(jié)
      • 常見的請(qǐng)求頭
      • 常見響應(yīng)頭
      • 常見的響應(yīng)狀態(tài)碼
            • 狀態(tài)碼如200 OK,由3位數(shù)字和原因短語組成。數(shù)字中的第一位指定了響應(yīng)類別,后兩位無分類。相應(yīng)類別由以下五種:
            • HTTP的狀態(tài)碼總數(shù)達(dá)60余種,但是常用的大概只有14種。接下來,我們就介紹一下這些具有代表性的14個(gè)狀態(tài)碼。
  • web框架
      • 1.web框架是什么
      • 2.wsgi協(xié)議
  • Django
      • 1.MVC與MTV模型
        • MVC
        • MTV
      • 3. 下載與使用
      • 4.django框架的目錄結(jié)構(gòu)
      • 5.啟動(dòng)項(xiàng)目
      • 6.django請(qǐng)求生命周期圖
    • 路由控制
      • 1.路由是什么
      • 2.如何使用
      • 3. path詳細(xì)使用
      • re_path的詳細(xì)使用
      • 5.反向解析,用在視圖函數(shù)中,用在模版中
      • 6.路由分發(fā)
    • 視圖層
      • 1.views.py這個(gè)文件就是寫視圖函數(shù)的
      • 2.視圖函數(shù)編寫
      • 3.request對(duì)象
      • 響應(yīng)對(duì)象
        • 響應(yīng)對(duì)象四件套:
      • CBV和FBV
        • CBV寫法
            • CBV的執(zhí)行流程
        • 關(guān)于類中self是誰的問題
  • 模板層
      • 1.介紹
      • 2.頁面靜態(tài)化
      • 模板語法
            • 過濾器使用
  • 模型層
      • ORM介紹
            • 1ORM是對(duì)象-關(guān)系-映射的簡稱
            • 2.SQL中的表
      • 2.常用字段和非常用字段
      • 3.常用字段與非常用字段參數(shù)
      • 4.settings配置
      • 5.基本操作(增刪改查)
      • 6.多表操作,創(chuàng)建關(guān)系
      • 7.基于對(duì)象的跨表查詢
      • 8.基于鏈表的跨表查詢

這篇文章是復(fù)習(xí)Django學(xué)習(xí)了那些內(nèi)容,做一個(gè)總結(jié),查缺補(bǔ)漏

一、Web應(yīng)用

web應(yīng)用程序是一種可以通過web訪問的應(yīng)用程序,用戶只需有瀏覽器即可,不需要再安裝其他軟件
比如:淘寶網(wǎng)、京東網(wǎng)、博客園等都是基于web應(yīng)用的程序

Web應(yīng)用程序的優(yōu)點(diǎn)

  1. 只需要一個(gè)適用的瀏覽器
  2. 節(jié)省硬盤空間
  3. 不需要更新,所有的新特新都在服務(wù)器上執(zhí)行,從而自動(dòng)傳達(dá)到客戶端
  4. 可以跨平臺(tái)使用:Windows, Mac, Linux 等

Web應(yīng)用程序的缺點(diǎn)

嚴(yán)重依賴服務(wù)端正常運(yùn)行,一旦服務(wù)端出現(xiàn)問題,客戶端就會(huì)收到影響

應(yīng)用程序有兩種模式C/S、B/S

C/S是客戶端/服務(wù)端程序,也就是說這類程序一般獨(dú)立運(yùn)行。
而B/S就是瀏覽器端/服務(wù)端應(yīng)用程序,這類應(yīng)用程序一般借助IE等瀏覽器來運(yùn)行。web應(yīng)用程序一般是B/S模式。

在MySQL的情境下,客戶端和服務(wù)器可以存在于同一臺(tái)計(jì)算機(jī)上,也可以分布在不同的計(jì)算機(jī)上,通過網(wǎng)絡(luò)進(jìn)行通信。這種C/S架構(gòu)提供了更好的靈活性和可伸縮性,使得多個(gè)客戶端可以同時(shí)連接到同一個(gè)數(shù)據(jù)庫服務(wù)器,實(shí)現(xiàn)數(shù)據(jù)的共享和集中管理。

總體而言,MySQL作為關(guān)系型數(shù)據(jù)庫管理系統(tǒng),通過C/S架構(gòu)提供了一種有效的方式來處理數(shù)據(jù)庫操作,使得應(yīng)用程序和數(shù)據(jù)庫之間的交互更為靈活和高效。

C/S 客戶端/服務(wù)端

我們之前學(xué)習(xí)的MySQL也是C/S架構(gòu),將客戶端和服務(wù)端裝在同一臺(tái)機(jī)器上。

現(xiàn)在可以嘗試連接另外一臺(tái)計(jì)算機(jī)的MySQL操作如下:

局域網(wǎng)連接其他電腦的MySQL數(shù)據(jù)庫

1.先用其他電腦再cmd命令行ping本機(jī)ip

查詢本機(jī)ip,在命令行輸入ipconfig
在這里插入圖片描述

若是ping不通的話就需要關(guān)閉防火墻,打開控制面板-----防火墻----關(guān)閉所有防火墻
在這里插入圖片描述

2.開放MySQL的訪問

打開MySQL 命令行鏈接mysql:mysql -hlocalhost -uroot -p
輸入密碼:Enter password: ******(自己的密碼)
打開 mysql 數(shù)據(jù)庫:use mysql(因?yàn)镸ySQL的權(quán)限存在這個(gè)里面)
將user=‘root’的用戶訪問權(quán)限為all:update user set host=’%’ where user=‘root’;(把host改為%,相當(dāng)于任何用戶都可以連接。)
讓賦予的權(quán)限立即生效:flush privileges;

C:\Users\ut>mysql -hlocalhost -uroot -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.15 MySQL Community Server - GPLCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use mysql
Database changedmysql> update user set host='%' where host= 'localhost';
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0mysql> flush   privileges ;
Query OK, 0 rows affected (0.01 sec)

不出意外的話重啟一下自己的mysql服務(wù),同事電腦就能連上自己的庫了,如果不行試下下面的命令

GRANT ALL PRIVILEGES ON *.* TO root @'%' IDENTIFIED BY "mypassword";
FLUSH PRIVILEGES; 

% 表示所有的IP都能訪問,也可以修改為專屬的
mypassword 為連接密碼 需要修改為你自己的

B/S 瀏覽器/服務(wù)端

我們?cè)谟玫腄jango框架就是B/S架構(gòu)

如何讓同局域網(wǎng)別的電腦訪問你寫的網(wǎng)頁:
首先搭建好你的網(wǎng)頁,自己訪問無問題,同上關(guān)閉你的防火墻。
在這里插入圖片描述

1.將ip地址改成0.0.0.0,所有用戶都可以訪問

2.將setting.py下的ALLOWED_HOSTS=[‘*’]接受所有的

在這里插入圖片描述

做完以上操作就可以讓別人訪問你的頁面
在這里插入圖片描述
輸入IP地址加上端口號(hào),再加上需要訪問的頁面

基于socket編寫一個(gè)Web應(yīng)用

手寫服務(wù)端,讓瀏覽器訪問

import socket, time
def run():server = socket.socket()server.bind(('127.0.0.1', 8000))server.listen(3)while True:sock, addr = server.accept()server_data = sock.recv(1024)now = time.strftime('%Y-%m-%d %X', time.localtime())with open('index.html', 'r', encoding='utf-8') as f:data = f.read()data = data.replace('sb', now)sock.send(('HTTP/1.1 200 ok \r\n\r\n%s' % data).encode('utf-8'))if __name__ == '__main__':run()

二、Http協(xié)議

1.http協(xié)議是什么

http協(xié)議是超文本傳輸協(xié)議,服務(wù)器與本地瀏覽器之間傳輸超文本的傳送協(xié)議

2.http協(xié)議特性

1. 基于TCP/IP協(xié)議之上的應(yīng)用層協(xié)議

它是可靠傳輸,不會(huì)丟失數(shù)據(jù)

2. 基于請(qǐng)求-響應(yīng)模式

HTTP協(xié)議規(guī)定,請(qǐng)求從客戶端發(fā)出,最后服務(wù)器端響應(yīng)該請(qǐng)求并 返回。
換句話說,肯定是先從客戶端開始建立通信的,服務(wù)器端在沒有 接收到請(qǐng)求之前不會(huì)發(fā)送響應(yīng)
在這里插入圖片描述

3. 無狀態(tài)保存

HTTP是一種不保存狀態(tài),即無狀態(tài)(stateless)協(xié)議。HTTP協(xié)議 自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存。也就是說在HTTP這個(gè) 級(jí)別,協(xié)議對(duì)于發(fā)送過的請(qǐng)求或響應(yīng)都不做持久化處理。
在這里插入圖片描述

4.無連接

就是每次連接處理一個(gè)請(qǐng)求,服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。

3.Http請(qǐng)求協(xié)議與響應(yīng)協(xié)議

請(qǐng)求協(xié)議:

請(qǐng)求首行:
請(qǐng)求方式
請(qǐng)求地址
請(qǐng)求協(xié)議版本號(hào)

請(qǐng)求頭:有K/V鍵值對(duì)組成 \r\n

請(qǐng)求體:get請(qǐng)求沒有請(qǐng)求體,post請(qǐng)求有請(qǐng)求體
在這里插入圖片描述
get請(qǐng)求

'''
------請(qǐng)求首行------
b'GET / HTTP/1.1\r\n------請(qǐng)求頭-----
Host: 127.0.0.1:8000\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"\r\n
sec-ch-ua-mobile: ?0\r\n
sec-ch-ua-platform: "Windows"\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n
Sec-Fetch-Site: none\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\r\n
Sec-Fetch-Dest: document\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n
Cookie: o2State={%22webp%22:true%2C%22avif%22:false};csrftoken=X7rlh2l36LXbjh0COtpHqlaJOZFxjDzhbx8XPh0k9Ncl9in9VCemv4OIfyjFo1T4\r\n\r\n'------請(qǐng)求體-----'''

post請(qǐng)求

'''
------請(qǐng)求首行------
b'POST / HTTP/1.1\r\n------請(qǐng)求頭-----
Host: 127.0.0.1:8000\r\n
Connection: keep-alive\r\n
Content-Length: 26\r\n
Cache-Control: max-age=0\r\n
sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"\r\n
sec-ch-ua-mobile: ?0\r\n
sec-ch-ua-platform: "Windows"\r\n
Upgrade-Insecure-Requests: 1\r\n
Origin: http://127.0.0.1:8000\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n
Sec-Fetch-Site: same-origin\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\r\n
Sec-Fetch-Dest: document\r\n
Referer: http://127.0.0.1:8000/\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n
Cookie: o2State={%22webp%22:true%2C%22avif%22:false};csrftoken=X7rlh2l36LXbjh0COtpHqlaJOZFxjDzhbx8XPh0k9Ncl9in9VCemv4OIfyjFo1T4\r\n\r\n------請(qǐng)求體-----
username=jack&password=123'
'''

響應(yīng)式協(xié)議

響應(yīng)格式

響應(yīng)首行:HTTP/1.1 200 OK\r\n
協(xié)議版本
響應(yīng)狀態(tài)碼
響應(yīng)描述符

響應(yīng)頭:有K/V鍵值對(duì)組成

響應(yīng)體:瀏覽器看到的頁面都是響應(yīng)體

Http有哪些版本

HTTP 0.9

HTTP 0.9 是最早發(fā)布出來的一個(gè)版本,于1991年發(fā)布。

它只接受 GET 一種請(qǐng)求方法,沒有在通訊中指定版本號(hào),且不支持請(qǐng)求頭。由于該版本不支持 POST 方法,因此客戶端無法向服務(wù)器傳遞太多信息。

HTTP 0.9 具有典型的無狀態(tài)性,每個(gè)事務(wù)獨(dú)立進(jìn)行處理,事務(wù)結(jié)束時(shí)就釋放這個(gè)連接。HTTP 協(xié)議的無狀態(tài)特點(diǎn)在其第一個(gè)版本中已經(jīng)成型。

HTTP 1.0

HTTP 1.0是HTTP協(xié)議的第二個(gè)版本,于1996年發(fā)布,如今仍然被廣泛使用,尤其是在代理服務(wù)器中。

這是第一個(gè)在通訊中指定版本號(hào)的HTTP協(xié)議版本,具有以下特點(diǎn):

  • 不僅僅支持 GET 命令,還支持 POST 和 HEAD 等請(qǐng)求方法。
    HTTP 的請(qǐng)求和回應(yīng)格式也發(fā)生了變化,除了要傳輸?shù)臄?shù)據(jù)之外,每次通信都包含頭信息,用來描述一些信息。
  • 不再局限于 0.9 版本的純文本格式
    根據(jù)頭信息中的 Content-Type 屬性,可以支持多種數(shù)據(jù)格式,這使得互聯(lián)網(wǎng)不僅僅可以用來傳輸文字,還可以傳輸圖像、音頻、視頻等二進(jìn)制文件。
  • 開始支持cache,就是當(dāng)客戶端在規(guī)定時(shí)間內(nèi)訪問同一網(wǎng)站,直接訪問cache即可。
  • 其他的新增功能還包括狀態(tài)碼(status code)、多字符集支持、多部分發(fā)送(multi-part type)、權(quán)限(authorization)、緩存(cache)、內(nèi)容編碼(content encoding)等。
    1.0 版本的工作方式是每次 TCP 連接只能發(fā)送一個(gè)請(qǐng)求,當(dāng)服務(wù)器響應(yīng)后就會(huì)關(guān)閉這次連接,下一個(gè)請(qǐng)求需要再次建立 TCP 連接。 TCP 連接的建立成本很高,因?yàn)樾枰蛻舳撕头?wù)器三次握手,并且開始時(shí)發(fā)送速率較慢(slow start)。

HTTP 1.0 版本的性能比較差。隨著網(wǎng)頁加載的外部資源越來越多,這個(gè)問題就愈發(fā)突出了。為了解決這個(gè)問題,有些瀏覽器在請(qǐng)求時(shí),即在請(qǐng)求頭部加上 Connection 字段:

HTTP1.1

默認(rèn)采用持續(xù)連接(Connection: keep-alive),能很好地配合代理服務(wù)器工作。
還支持以管道方式在同時(shí)發(fā)送多個(gè)請(qǐng)求,以便降低線路負(fù)載,提高傳輸速度。

HTTP 1.1 具有以下特點(diǎn):

  • 引入了持久連接(persistent connection)
    即 TCP 連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用,不用聲明 Connection: keep-alive。客戶端和服務(wù)器發(fā)現(xiàn)對(duì)方一段時(shí)間沒有活動(dòng),就可以主動(dòng)關(guān)閉連接。不過,規(guī)范的做法是,客戶端在最后一個(gè)請(qǐng)求時(shí),發(fā)送 Connection: close,明確要求服務(wù)器關(guān)閉 TCP 連接。
  • 加入了管道機(jī)制
    在同一個(gè) TCP 連接里,允許多個(gè)請(qǐng)求同時(shí)發(fā)送,增加了并發(fā)性,進(jìn)一步改善了 HTTP 協(xié)議的效率。
    舉例來說,客戶端需要請(qǐng)求兩個(gè)資源。以前的做法是,在同一個(gè) TCP 連接里面,先發(fā)送 A 請(qǐng)求,然后等待服務(wù)器做出回應(yīng),收到后再發(fā)出 B 請(qǐng)求。
    管道機(jī)制則是允許瀏覽器同時(shí)發(fā)出 A 請(qǐng)求和 B 請(qǐng)求,但是服務(wù)器還是按照順序,先回應(yīng) A 請(qǐng)求,完成后再回應(yīng) B 請(qǐng)求。
    一個(gè) TCP 連接現(xiàn)在可以傳送多個(gè)回應(yīng),勢(shì)必就要有一種機(jī)制,區(qū)分?jǐn)?shù)據(jù)包是屬于哪一個(gè)回應(yīng)的。這就是 Content-length 字段的作用,聲明本次回應(yīng)的數(shù)據(jù)長度。
  • 分塊傳輸編碼
    使用 Content-Length 字段的前提條件是,服務(wù)器發(fā)送回應(yīng)之前,必須知道回應(yīng)的數(shù)據(jù)長度。對(duì)于一些很耗時(shí)的動(dòng)態(tài)操作來說,這意味著,服務(wù)器要等到所有操作完成,才能發(fā)送數(shù)據(jù),顯然這樣的效率不高。
    更好的處理方法是,產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊,采用"流模式"(stream)取代"緩存模式"(buffer)。
    因此,HTTP 1.1 版本規(guī)定可以不使用 Content-Length 字段,而使用"分塊傳輸編碼"(chunked transfer encoding)。只要請(qǐng)求或回應(yīng)的頭信息有 Transfer-Encoding 字段,就表明回應(yīng)將由數(shù)量未定的數(shù)據(jù)塊組成。
  • 新增了請(qǐng)求方式 PUT、PATCH、OPTIONS、DELETE 等。
  • 客戶端請(qǐng)求的頭信息新增了 Host 字段,用來指定服務(wù)器的域名。
  • HTTP 1.1 支持文件斷點(diǎn)續(xù)傳,RANGE:bytes,HTTP 1.0 每次傳送文件都是從文件頭開始,即 0 字節(jié)處開始。RANGE:bytes=XXXX 表示要求服務(wù)器從文件 XXXX 字節(jié)處開始傳送,斷點(diǎn)續(xù)傳。即返回碼是 206(Partial Content)
HTTP/2.0

這也是最新的 HTTP 版本,于 2015 年 5 月作為互聯(lián)網(wǎng)標(biāo)準(zhǔn)正式發(fā)布。

它具有以下特點(diǎn):

  • 二進(jìn)制協(xié)議
    HTTP 1.1 版的頭信息肯定是文本(ASCII 編碼),數(shù)據(jù)體可以是文本,也可以是二進(jìn)制。
    HTTP 2.0 則是一個(gè)徹底的二進(jìn)制協(xié)議,頭信息和數(shù)據(jù)體都是二進(jìn)制,并且統(tǒng)稱為"幀"(frame):頭信息幀和數(shù)據(jù)幀。
  • 多工
    HTTP 2.0 復(fù)用 TCP 連接,在一個(gè)連接里,客戶端和瀏覽器都可以同時(shí)發(fā)送多個(gè)請(qǐng)求或回應(yīng),而且不用按照順序一一對(duì)應(yīng),這樣就避免了"隊(duì)頭堵塞"(HTTP 2.0 使用了多路復(fù)用的技術(shù),做到同一個(gè)連接并發(fā)處理多個(gè)請(qǐng)求,而且并發(fā)請(qǐng)求的數(shù)量比 HTTP 1.1大了好幾個(gè)數(shù)量級(jí))。
    舉例來說,在一個(gè) TCP 連接里面,服務(wù)器同時(shí)收到了 A 請(qǐng)求和 B 請(qǐng)求,于是先回應(yīng) A 請(qǐng)求,結(jié)果發(fā)現(xiàn)處理過程非常耗時(shí),于是就發(fā)送 A 請(qǐng)求已經(jīng)處理好的部分, 接著回應(yīng) B 請(qǐng)求,完成后,再發(fā)送 A 請(qǐng)求剩下的部分。
  • 頭信息壓縮
    HTTP 協(xié)議不帶有狀態(tài),每次請(qǐng)求都必須附上所有信息。所以,請(qǐng)求的很多字段都是重復(fù)的,比如 Cookie 和 User Agent,一模一樣的內(nèi)容,每次請(qǐng)求都必須附帶,這會(huì)浪費(fèi)很多帶寬,也影響速度。
    HTTP 2.0 對(duì)這一點(diǎn)做了優(yōu)化,引入了頭信息壓縮機(jī)制(header compression)。一方面,頭信息使用 gzip 或c ompress 壓縮后再發(fā)送;另一方面,客戶端和服務(wù)器同時(shí)維護(hù)一張頭信息表,所有字段都會(huì)存入這個(gè)表,生成一個(gè)索引號(hào),以后就不發(fā)送同樣字段了,只發(fā)送索引號(hào),這樣就提高速度了。
  • 服務(wù)器推送
    HTTP 2.0 允許服務(wù)器未經(jīng)請(qǐng)求,主動(dòng)向客戶端發(fā)送資源,這叫做服務(wù)器推送(server push)。意思是說,當(dāng)我們對(duì)支持 HTTP 2.0 的 web server 請(qǐng)求數(shù)據(jù)的時(shí)候,服務(wù)器會(huì)順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次創(chuàng)建連接發(fā)送請(qǐng)求到服務(wù)器端獲取。這種方式非常合適加載靜態(tài)資源。 服務(wù)器端推送的這些資源其實(shí)存在客戶端的某處地方,客戶端直接從本地加載這些資源就可以了,不用走網(wǎng)絡(luò),速度自然是快很多的。
HTTP/3.0

基于Google的QUIC,HTTP3 背后的主要思想是放棄 TCP,轉(zhuǎn)而使用基于 UDP 的 QUIC 協(xié)議。

為了解決HTTP/2.0中TCP造成的隊(duì)頭阻塞問題,HTTP/3.0直接放棄使用TCP,將傳輸層協(xié)議改成UDP;但是因?yàn)閁DP是不可靠傳輸,所以這就需要QUIC實(shí)現(xiàn)可靠機(jī)制

QUIC 也是需要三次握手來建立連接的,主要目的是為了確定連接 ID。
在 UDP 報(bào)文頭部與 HTTP 消息之間,共有 3 層頭部:
在這里插入圖片描述
QUIC特點(diǎn):
無隊(duì)頭阻塞
QUIC 協(xié)議也有類似 HTTP/2 Stream 與多路復(fù)用的概念,也是可以在同一條連接上并發(fā)傳輸多個(gè) Stream,Stream 可以認(rèn)為就是一條 HTTP 請(qǐng)求。

QUIC 有自己的一套機(jī)制可以保證傳輸?shù)目煽啃缘?。?dāng)某個(gè)流發(fā)生丟包時(shí),只會(huì)阻塞這個(gè)流,其他流不會(huì)受到影響,因此不存在隊(duì)頭阻塞問題。這與 HTTP/2 不同,HTTP/2 只要某個(gè)流中的數(shù)據(jù)包丟失了,其他流也會(huì)因此受影響。

所以,QUIC 連接上的多個(gè) Stream 之間并沒有依賴,都是獨(dú)立的,某個(gè)流發(fā)生丟包了,只會(huì)影響該流,其他流不受影響。

連接建立
HTTP/3 在傳輸數(shù)據(jù)前雖然需要 QUIC 協(xié)議握手,這個(gè)握手過程只需要 1 RTT,握手的目的是為確認(rèn)雙方的「連接 ID」,連接遷移就是基于連接 ID 實(shí)現(xiàn)的。
在這里插入圖片描述

連接遷移
基于 TCP 傳輸協(xié)議的 HTTP 協(xié)議,由于是通過四元組(源 IP、源端口、目的 IP、目的端口)確定一條 TCP 連接,例如設(shè)備要連接wifi(IP地址改變)就必須要重新建立連接,而建立連接包含TCP三次握手和TSL四次握手,以及TCP慢啟動(dòng)所以會(huì)造成使用者卡頓的感覺

而QUIC通過連接ID標(biāo)記自己,客戶端和服務(wù)器可以各自選擇一組 ID 來標(biāo)記自己,因此即使移動(dòng)設(shè)備的網(wǎng)絡(luò)變化后,導(dǎo)致 IP 地址變化了,只要有上下文信息(比如連接 ID、TLS 密鑰等),就可以“無縫”地復(fù)用原連接,消除重連的成本,沒有絲毫卡頓感,達(dá)到了連接遷移的功能。

其實(shí), QUIC 是一個(gè)在 UDP 之上的偽 TCP + TLS + HTTP/2 的多路復(fù)用的協(xié)議。

總結(jié)

HTTP/0.9:功能簡陋,只支持GET方法,只能發(fā)送HTML格式字符串。

HTTP/1.0:支持多種數(shù)據(jù)格式,增加POST、HEAD等方法,增加頭信息,每次只能發(fā)送一個(gè)請(qǐng)求(無持久連接)

HTTP/1.1:默認(rèn)持久連接、請(qǐng)求管道化、增加緩存處理、增加Host字段、支持?jǐn)帱c(diǎn)傳輸分塊傳輸?shù)取?/p>

HTTP/2.0:二進(jìn)制分幀、多路復(fù)用、頭部壓縮、服務(wù)器推送

HTTP/3.0: 將傳輸層協(xié)議改成UDP;但是因?yàn)閁DP是不可靠傳輸,所以這就需要QUIC實(shí)現(xiàn)可靠機(jī)制,QUIC 也是需要三次握手來建立連接的,主要目的是為了確定連接 ID。

常見的請(qǐng)求頭

1. User-Agent:標(biāo)識(shí)客戶端使用的瀏覽器和操作系統(tǒng)信息。可以通過$_SERVER['HTTP_USER_AGENT']獲取。2. Accept:指定客戶端能夠處理的內(nèi)容類型,即可接受的媒體類型。可以通過$_SERVER['HTTP_ACCEPT']獲取。3. Content-Type:指定請(qǐng)求體中的數(shù)據(jù)格式類型。常見的取值有application/json、application/x-www-form-urlencoded等??梢酝ㄟ^$_SERVER['CONTENT_TYPE']獲取。4. Authorization:用于進(jìn)行身份驗(yàn)證的憑證信息。常見的取值有Bearer Token、Basic Authentication等??梢酝ㄟ^$_SERVER['HTTP_AUTHORIZATION']獲取。5. Cookie:包含來自客戶端的Cookie信息??梢酝ㄟ^$_SERVER['HTTP_COOKIE']獲取。6. Referer:指示當(dāng)前請(qǐng)求是從哪個(gè)URL頁面發(fā)起的。可以通過$_SERVER['HTTP_REFERER']獲取。、8.Host:指定服務(wù)器的域名或IP地址??梢酝ㄟ^$_SERVER['HTTP_HOST']獲取。8. X-Requested-With:指示請(qǐng)求是否由Ajax發(fā)起的。通常在Ajax請(qǐng)求中會(huì)設(shè)置該頭部字段,取值為"XMLHttpRequest"??梢酝ㄟ^$_SERVER['HTTP_X_REQUESTED_WITH']獲取。9. Content-Length:指定請(qǐng)求體的長度。可以通過$_SERVER['CONTENT_LENGTH']獲取。10. Cache-Control:控制緩存行為的指令。用于指定客戶端和代理服務(wù)器如何緩存響應(yīng)??梢酝ㄟ^$_SERVER['HTTP_CACHE_CONTROL']獲取。

常見響應(yīng)頭

1.Cache-Control(對(duì)應(yīng)請(qǐng)求中的Cache-Control)Cache-Control:private 默認(rèn)為private  響應(yīng)只能夠作為私有的緩存,不能再用戶間共享Cache-Control:public 瀏覽器和緩存服務(wù)器都可以緩存頁面信息。Cache-Control:must-revalidate  對(duì)于客戶機(jī)的每次請(qǐng)求,代理服務(wù)器必須想服務(wù)器驗(yàn)證緩存是否過時(shí)。Cache-Control:no-cache  瀏覽器和緩存服務(wù)器都不應(yīng)該緩存頁面信息。Cache-Control:max-age=10  是通知瀏覽器10秒之內(nèi)不要煩我,自己從緩沖區(qū)中刷新。Cache-Control:no-store 請(qǐng)求和響應(yīng)的信息都不應(yīng)該被存儲(chǔ)在對(duì)方的磁盤系統(tǒng)中。2.Content-Type:text/html;charset=UTF-8 告訴客戶端,資源文件的類型,還有字符編碼,客戶端通過utf-8對(duì)資源進(jìn)行解碼,然后對(duì)資源進(jìn)行html解析。通常我們會(huì)看到有些網(wǎng)站是亂碼的,往往就是服務(wù)器端沒有返回正確的編碼。3.Content-Encoding:gzip 告訴客戶端,服務(wù)端發(fā)送的資源是采用gzip編碼的,客戶端看到這個(gè)信息后,應(yīng)該采用gzip對(duì)資源進(jìn)行解碼。4.Date: Tue, 03 Apr 2018 03:52:28 GMT 這個(gè)是服務(wù)端發(fā)送資源時(shí)的服務(wù)器時(shí)間,GMT是格林尼治所在地的標(biāo)準(zhǔn)時(shí)間。http協(xié)議中發(fā)送的時(shí)間都是GMT的,這主要是解決在互聯(lián)網(wǎng)上,不同時(shí)區(qū)在相互請(qǐng)求資源的時(shí)候,時(shí)間混亂問題。5.Server:Tengine/1.4.6  這個(gè)是服務(wù)器和相對(duì)應(yīng)的版本,只是告訴客戶端服務(wù)器信息。6.Transfer-Encoding:chunked 這個(gè)響應(yīng)頭告訴客戶端,服務(wù)器發(fā)送的資源的方式是分塊發(fā)送的。一般分塊發(fā)送的資源都是服務(wù)器動(dòng)態(tài)生成的,在發(fā)送時(shí)還不知道發(fā)送資源的大小,所以采用分塊發(fā)送,每一塊都是獨(dú)立的,獨(dú)立的塊都能標(biāo)示自己的長度,最后一塊是0長度的,當(dāng)客戶端讀到這個(gè)0長度的塊時(shí),就可以確定資源已經(jīng)傳輸完了。7.Expires:Sun, 1 Jan 2000 01:00:00 GMT 這個(gè)響應(yīng)頭也是跟緩存有關(guān)的,告訴客戶端在這個(gè)時(shí)間前,可以直接訪問緩存副本,很顯然這個(gè)值會(huì)存在問題,因?yàn)榭蛻舳撕头?wù)器的時(shí)間不一定會(huì)都是相同的,如果時(shí)間不同就會(huì)導(dǎo)致問題。所以這個(gè)響應(yīng)頭是沒有Cache-Control:max-age=*這個(gè)響應(yīng)頭準(zhǔn)確的,因?yàn)?span id="vxwlu0yf4"    class="token builtin">max-age=date中的date是個(gè)相對(duì)時(shí)間,不僅更好理解,也更準(zhǔn)確。8.Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所請(qǐng)求的對(duì)象的最后修改日期(按照 RFC 7231 中定義的“超文本傳輸協(xié)議日期”格式來表示)9.Connection:keep-alive 這個(gè)字段作為回應(yīng)客戶端的Connection:keep-alive,告訴客戶端服務(wù)器的tcp連接也是一個(gè)長連接,客戶端可以繼續(xù)使用這個(gè)tcp連接發(fā)送http請(qǐng)求。10.EtagETag: "737060cd8c284d8af7ad3082f209582d" 就是一個(gè)對(duì)象(比如URL)的標(biāo)志值,就一個(gè)對(duì)象而言,比如一個(gè)html文件,如果被修改了,其Etag也會(huì)別修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服務(wù)器判斷一個(gè)對(duì)象是否改變了。比如前一次請(qǐng)求某個(gè)html文件時(shí),獲得了其 ETag,當(dāng)這次又請(qǐng)求這個(gè)文件時(shí),瀏覽器就會(huì)把先前獲得ETag值發(fā)送給WEB服務(wù)器,然后WEB服務(wù)器會(huì)把這個(gè)ETag跟該文件的當(dāng)前ETag進(jìn)行對(duì)比,然后就知道這個(gè)文件有沒有改變了。11.Refresh: 5; url=http://baidu.com  用于重定向,或者當(dāng)一個(gè)新的資源被創(chuàng)建時(shí)。默認(rèn)會(huì)在5秒后刷新重定向。12.Access-Control-Allow-Origin: *   *號(hào)代表所有網(wǎng)站可以跨域資源共享,如果當(dāng)前字段為*那么Access-Control-Allow-Credentials就不能為trueAccess-Control-Allow-Origin: www.baidu.com 指定哪些網(wǎng)站可以跨域資源共享13.Access-Control-Allow-Methods:GET,POST,PUT,DELETE  允許哪些方法來訪問14.Access-Control-Allow-Credentials: true  是否允許發(fā)送cookie。默認(rèn)情況下,Cookie不包括在CORS請(qǐng)求之中。設(shè)為true,即表示服務(wù)器明確許可,Cookie可以包含在請(qǐng)求中,一起發(fā)給服務(wù)器。這個(gè)值也只能設(shè)為true,如果服務(wù)器不要瀏覽器發(fā)送Cookie,刪除該字段即可。如果access-control-allow-origin為*,當(dāng)前字段就不能為true15.Content-Range: bytes 0-5/7877 指定整個(gè)實(shí)體中的一部分的插入位置,他也指示了整個(gè)實(shí)體的長度。在服務(wù)器向客戶返回一個(gè)部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個(gè)實(shí)體長度。

常見的響應(yīng)狀態(tài)碼

HTTP狀態(tài)碼負(fù)責(zé)表示客戶端HTTP請(qǐng)求的返回結(jié)果、標(biāo)記服務(wù)器的處理是否正常、通知出現(xiàn)的錯(cuò)誤工作等。借助狀態(tài)碼,用戶可以知道服務(wù)器端是正常處理了請(qǐng)求,還是出現(xiàn)了錯(cuò)誤。
在這里插入圖片描述

狀態(tài)碼如200 OK,由3位數(shù)字和原因短語組成。數(shù)字中的第一位指定了響應(yīng)類別,后兩位無分類。相應(yīng)類別由以下五種:

1xx Informational(信息狀態(tài)碼) 接受請(qǐng)求正在處理
2xx Success(成功狀態(tài)碼) 請(qǐng)求正常處理完畢
3xx Redirection(重定向狀態(tài)碼) 需要附加操作已完成請(qǐng)求
4xx Client Error(客戶端錯(cuò)誤狀態(tài)碼) 服務(wù)器無法處理請(qǐng)求
5xx Server Error(服務(wù)器錯(cuò)誤狀態(tài)碼) 服務(wù)器處理請(qǐng)求出錯(cuò)

HTTP的狀態(tài)碼總數(shù)達(dá)60余種,但是常用的大概只有14種。接下來,我們就介紹一下這些具有代表性的14個(gè)狀態(tài)碼。

200 OK 請(qǐng)求成功。一般用于GET與POST請(qǐng)求

204 No Content 無內(nèi)容。服務(wù)器成功處理,但未返回內(nèi)容。在未更新網(wǎng)頁的情況下,可確保瀏覽器繼續(xù)顯示當(dāng)前文檔

206 Partial Content 是對(duì)資源某一部分的請(qǐng)求,服務(wù)器成功處理了部分GET請(qǐng)求,響應(yīng)報(bào)文中包含由Content-Range指定范圍的實(shí)體內(nèi)容。

301 Moved Permanently 永久性重定向。請(qǐng)求的資源已被永久的移動(dòng)到新URI,返回信息會(huì)包括新的URI,瀏覽器會(huì)自動(dòng)定向到新URI。今后任何新的請(qǐng)求都應(yīng)使用新的URI代替

302 Found 臨時(shí)性重定向。與301類似。但資源只是臨時(shí)被移動(dòng)??蛻舳藨?yīng)繼續(xù)使用原有URI

303 See Other 查看其它地址。與302類似。使用GET請(qǐng)求查看

304 Not Modified 未修改。所請(qǐng)求的資源未修改,服務(wù)器返回此狀態(tài)碼時(shí),不會(huì)返回任何資源??蛻舳送ǔ?huì)緩存訪問過的資源,通過提供一個(gè)頭信息指出客戶端希望只返回在指定日期之后修改的資源

307 Temporary Redirect 臨時(shí)重定向。與302類似。使用GET請(qǐng)求重定向,會(huì)按照瀏覽器標(biāo)準(zhǔn),不會(huì)從POST變成GET。

400 Bad Request 客戶端請(qǐng)求報(bào)文中存在語法錯(cuò)誤,服務(wù)器無法理解。瀏覽器會(huì)像200 OK一樣對(duì)待該狀態(tài)嗎

401 Unauthorized 請(qǐng)求要求用戶的身份認(rèn)證,通過HTTP認(rèn)證(BASIC認(rèn)證,DIGEST認(rèn)證)的認(rèn)證信息,若之前已進(jìn)行過一次請(qǐng)求,則表示用戶認(rèn)證失敗

402 Payment Required 保留,將來使用

403 Forbidden 服務(wù)器理解請(qǐng)求客戶端的請(qǐng)求,但是拒絕執(zhí)行此請(qǐng)求

404 Not Found 服務(wù)器無法根據(jù)客戶端的請(qǐng)求找到資源(網(wǎng)頁)。通過此代碼,網(wǎng)站設(shè)計(jì)人員可設(shè)置"您所請(qǐng)求的資源無法找到"的個(gè)性頁面。也可以在服務(wù)器拒絕請(qǐng)求且不想說明理由時(shí)使用

500 Internal Server Error 服務(wù)器內(nèi)部錯(cuò)誤,無法完成請(qǐng)求,也可能是web應(yīng)用存在bug或某些臨時(shí)故障

501 Not Implemented 服務(wù)器不支持請(qǐng)求的功能,無法完成請(qǐng)求

503 Service Unavailable 由于超載或系統(tǒng)維護(hù),服務(wù)器暫時(shí)的無法處理客戶端的請(qǐng)求。延時(shí)的長度可包含在服務(wù)器的Retry-After頭信息中

web框架

1.web框架是什么

簡單來說就是別人幫咱寫了一些基礎(chǔ)代碼,我們只需要在固定位置寫固定的代碼,就能實(shí)現(xiàn)一個(gè)web應(yīng)用

Web框架(Web framework)是一種開發(fā)框架,用來支持動(dòng)態(tài)網(wǎng)站、網(wǎng)絡(luò)應(yīng)用和網(wǎng)絡(luò)服務(wù)的開發(fā)。這大多數(shù)的web框架提供了一套開發(fā)和部署網(wǎng)站的方式,也為web行為提供了一套通用的方法。web框架已經(jīng)實(shí)現(xiàn)了很多功能,開發(fā)人員使用框架提供的方法并且完成自己的業(yè)務(wù)邏輯,就能快速開發(fā)web應(yīng)用了。瀏覽器和服務(wù)器的是基于HTTP協(xié)議進(jìn)行通信的。也可以說web框架就是在以上十幾行代碼基礎(chǔ)張擴(kuò)展出來的,有很多簡單方便使用的方法,大大提高了開發(fā)的效率

2.wsgi協(xié)議

客戶端瀏覽器和python web框架之間通訊需要遵守這個(gè)協(xié)議,客戶端發(fā)出的是http請(qǐng)求,通過符合wsgi協(xié)議的web服務(wù)器通訊

應(yīng)用程序,是一個(gè)可重復(fù)調(diào)用的可調(diào)用對(duì)象,在Python中可以是一個(gè)函數(shù),也可以是一個(gè)類,如果是類的話要實(shí)現(xiàn)__call__方法,要求這個(gè)可調(diào)用對(duì)象接收2個(gè)參數(shù),返回一個(gè)內(nèi)容結(jié)果

接收的2個(gè)參數(shù)分別是environ和start_response。

environ是web服務(wù)器解析HTTP協(xié)議的一些信息,例如請(qǐng)求方法,請(qǐng)求URI等信息構(gòu)成的一個(gè)Dict對(duì)象。
start_response是一個(gè)函數(shù),接收2個(gè)參數(shù),一個(gè)是HTTP狀態(tài)碼,一個(gè)HTTP消息中的響應(yīng)頭。

Django

1.MVC與MTV模型

所有的web框架都是遵守MVC架構(gòu)

MVC

將寫在一個(gè)文件里的代碼,拆分到不同的位置

模型(M:數(shù)據(jù)層)
控制器(C: 邏輯判斷)
視圖(V: 用戶看到的)

他們之間以一種插件式的、松耦合的方式連接在一起,模型負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的映射(ORM),視圖負(fù)責(zé)與用戶的交互(頁面),控制器接受用戶的輸入調(diào)用模型和視圖完成用戶的請(qǐng)求

MTV

M 代表模型(Model): 負(fù)責(zé)業(yè)務(wù)對(duì)象和數(shù)據(jù)庫的關(guān)系映射(ORM)。
M就是原來的M
T 代表模板 (Template):負(fù)責(zé)如何把頁面展示給用戶(html)。
T就是原來的V
V 代表視圖(View): 負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)時(shí)候調(diào)用Model和Template
V+路由 是原來的C

3. 下載與使用

下載…

命令創(chuàng)建項(xiàng)目
django-admin startproject 項(xiàng)目名

命令創(chuàng)建應(yīng)用
python manage.py startapp 應(yīng)用名

4.django框架的目錄結(jié)構(gòu)

在這里插入圖片描述

5.啟動(dòng)項(xiàng)目

  1. python manage.py runserver 127.0.0.1:8000
  2. 在pycharm中點(diǎn)擊運(yùn)行,注意切換到django項(xiàng)目運(yùn)行

6.django請(qǐng)求生命周期圖

在這里插入圖片描述

路由控制

1.路由是什么

URL配置(URLconf)就像Django 所支撐網(wǎng)站的目錄。它的本質(zhì)是URL與要為該URL調(diào)用的視圖函數(shù)之間的映射表;你就是以這種方式告訴Django,對(duì)于客戶端發(fā)來的某個(gè)URL調(diào)用哪一段邏輯代碼對(duì)應(yīng)執(zhí)行
請(qǐng)求路徑和要執(zhí)行的視圖函數(shù)的對(duì)應(yīng)關(guān)系

2.如何使用

path:準(zhǔn)確路徑,精準(zhǔn)匹配-------->以后基本都是path
re_path----就是1.xx版本的url------>支持正則匹配----->不安全,非常少用

都是放在setting下的urlpatterns=[]列表中,必須是path或re_path執(zhí)行完的結(jié)果

3. path詳細(xì)使用

path(‘a(chǎn)dmin/’,login)等價(jià)于_path(route, view, kwargs=None, name=None)

第一個(gè)參數(shù):
準(zhǔn)確路徑,字符串
轉(zhuǎn)換器:‘<int:pk>’ , ‘<str:name>’
127.0.0.1:8080/login/jack---->path(‘login/<str:name>’, views.login)
視圖函數(shù):def login(request,name)

第二個(gè)參數(shù):
視圖函數(shù)的內(nèi)存地址,不能加括號(hào)
路由一旦匹配成功,就會(huì)執(zhí)行你寫的這個(gè)視圖函數(shù)加上(),并且把request對(duì)象傳入

如果有分組的參數(shù)[有名,無名],或者轉(zhuǎn)換器的參數(shù),都會(huì)被傳遞到視圖函數(shù)中作為參數(shù)

總結(jié):放要放視圖函數(shù)地址—》但是視圖函數(shù)的參數(shù):第一個(gè)是固定必須是request,后續(xù)的取決于寫沒寫轉(zhuǎn)換器,寫沒寫有名無名分組

第三個(gè)參數(shù):kwargs 是給視圖函數(shù)傳遞默認(rèn)參數(shù)

第四個(gè)參數(shù):路徑的別名—》后期使用反向解析得到該路徑

re_path的詳細(xì)使用

跟path除了第一個(gè)參數(shù)不一樣,其他完全一樣
第一個(gè)參數(shù)是正則表達(dá)式
后期用的很少,危險(xiǎn)性大—》原來之所以支持正則的目的是為了分組出參數(shù)
path通過轉(zhuǎn)換器能完成這個(gè)操作–》于是–》這個(gè)幾乎不用

5.反向解析,用在視圖函數(shù)中,用在模版中

需要導(dǎo)入reverse模塊

  • 沒有轉(zhuǎn)換器的情況:
    path(‘login/’, login,name=‘login’)
    res=reverse(‘login’) #當(dāng)時(shí) 定義路徑傳入的name參數(shù)對(duì)應(yīng)的字符串
  • 有轉(zhuǎn)換器的情況:
    path(‘login/<str:name>’, login,name=‘login’)
    res=reverse(‘login’,kwargs={name:jack}) #當(dāng)時(shí) 定義路徑傳入的name參數(shù)對(duì)應(yīng)的字符串
    生成這種路徑:‘login/jack’

6.路由分發(fā)

每一個(gè)app有自己的路由
導(dǎo)入模塊 from django.urls import include

視圖層

1.views.py這個(gè)文件就是寫視圖函數(shù)的

2.視圖函數(shù)編寫

def 視圖函數(shù)(request):
return 四件套

3.request對(duì)象

它是http請(qǐng)求對(duì)象(數(shù)據(jù)包,字符串形式)拆分成了django中得request對(duì)象

常用的有:
request.path
reuqest.method
request.GET
request.POST
reuqest.body
reqeust.get_full_path()
request.files 前端傳過來文件,轉(zhuǎn)成字典,根據(jù)文件的名字取到文件對(duì)象

不常用的
reqeust.cookie
request.session
request.contnet_type
request.MEAT:請(qǐng)求頭中的數(shù)據(jù)

user-agent:HTTP_USER_AGENT
referer:
客戶端IP地址:REMOTE_ADDR
用戶自定義的
定義:name=jack
取:request.META.get('HTTP_NAME')# 前面加HTTP_ 把自定義的轉(zhuǎn)成大寫

request.user

request.is_ajax()

響應(yīng)對(duì)象

響應(yīng)對(duì)象的本質(zhì)都是 HttpResponse

響應(yīng)對(duì)象四件套:
  1. HttpResponse 字符串

  2. render 需要返回兩個(gè)必傳參數(shù),一個(gè)是request,一個(gè)是模板,模板渲染是在后端完成,模板返回到瀏覽器,最終成為響應(yīng)體,還可以傳其他參數(shù),可以去看源碼。
    模版渲染是在后端完成的,而js代碼是在客戶端渲染完成。
    js想要用python中的變量,就需要使用模板語法

  3. redirect 重定向
    沒有放字符串的位置
    狀態(tài)碼是3開頭

  4. JsonResponse json格式數(shù)據(jù)
    需要另外導(dǎo)入:from django.http import JsonResponse

讀JsonResponse源碼
1.現(xiàn)在返回一個(gè)JsonResponse({'name':'jack'})def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,json_dumps_params=None, **kwargs):
2.{'name':'jack'}就會(huì)傳給dataif safe and not isinstance(data, dict):
3.判斷safe成立,如果想返回一個(gè)列表,把safe改成Falseisinstance,檢查對(duì)象是否成立(對(duì)象,類)所以以上if不成立,就不會(huì)走下面的代碼raise TypeError('In order to allow non-dict objects to be serialized set the ''safe parameter to False.')if json_dumps_params is None:json_dumps_params = {}kwargs.setdefault('content_type', 'application/json')
4.默認(rèn)的請(qǐng)求頭,setdefault,有則修改,無則新增data = json.dumps(data, cls=encoder, **json_dumps_params)
5.這一句才是將數(shù)據(jù)序列化成json格式       super().__init__(content=data, **kwargs)
6.調(diào)用父類的__init__完成實(shí)例化得到一個(gè)HttpResponse的對(duì)象現(xiàn)在傳一個(gè){'name':'張三'}
序列化的時(shí)候就需要轉(zhuǎn)碼:json.dump({'name':'張三'}, ensure_ascii=False)這樣子才能是中文而在JsonResponse中,是不能用ensure_ascii=False
而是用:
JsonResponse({'name':'張三'},json_dumps_params={'ensure_ascii':False})''''''''''''''''''''''
還可以添加響應(yīng)頭,需要用到headers參數(shù)
JsonResponse({'name':'張三'},json_dumps_params={'ensure_ascii':False},headers={'xxx':'xxx'})

CBV和FBV

FBV:基于函數(shù)的視圖,經(jīng)常寫的都是FBV
CBV:基于類的視圖,后續(xù)全是CBV

CBV寫法
class UseView(View):def get(self,request):return HttpResponse('from get')def post(self,request):return HttpResponse('from post')

路由配置

path('index/', views.UseView.as_view())
CBV的執(zhí)行流程

先去路由匹配,匹配成功執(zhí)行,UserView.as_view(),一定會(huì)執(zhí)行(request)

as_view()代碼執(zhí)行結(jié)果

        def view(request, *args, **kwargs):   本質(zhì)就是在執(zhí)行view(request)self = cls(**initkwargs)self.setup(request, *args, **kwargs)if not hasattr(self, 'request'):raise AttributeError("%s instance has no 'request' attribute. Did you override ""setup() and forget to call super()?" % cls.__name__)return self.dispatch(request, *args, **kwargs)實(shí)際上是在執(zhí)行self.dispatch(request, *args, **kwargs),又會(huì)去類中找dispatch

dispatch代碼:

    def dispatch(self, request, *args, **kwargs):if request.method.lower() in self.http_method_names:  request請(qǐng)求來請(qǐng)求對(duì)象時(shí),會(huì)在8大請(qǐng)求方法里找handler = getattr(self, request.method.lower(), self.http_method_not_allowed)# getattr 反射方法 通過字符串去對(duì)象中取屬性或方法# self是誰調(diào)用的就是誰的對(duì)象# handler取出來的是Userview這個(gè)類的get方法else:handler = self.http_method_not_allowedget(request)就會(huì)執(zhí)行UserView這個(gè)類的get方法,才會(huì)真正執(zhí)行原來的視圖函數(shù)的內(nèi)容return handler(request, *args, **kwargs)

總結(jié):寫CBV,只需要在視圖類寫請(qǐng)求方式同名的方法即可,不同的請(qǐng)求方式,就會(huì)執(zhí)行不同的方法

關(guān)于類中self是誰的問題

誰在調(diào)用就是誰

模板層

1.介紹

模版在瀏覽器中是運(yùn)行不了的,因?yàn)樗泄潭ǖ恼Z法,瀏覽器是解析不了模板語法的,需要在后端被渲染,類似python語法,所以我們可以使用django的模板系統(tǒng)(template system)來實(shí)現(xiàn)這種模式

python的模板:HTML代碼+模板語法

django模版修改的視圖函數(shù)from django.template import Template,Context   需要導(dǎo)入兩個(gè)模塊
import datetime
now=datetime.datetime.now()   得到一個(gè)時(shí)間對(duì)象
t=Template('<html><body>現(xiàn)在時(shí)刻是:<h1>{{current_date}}</h1></body></html>')  內(nèi)部打開了這個(gè)模板---》讀出所有內(nèi)容,實(shí)例化得到了t對(duì)象
c=Context({'current_date':str(now)})
html=t.render(c)
return HttpResponse(html)

另一種寫法(推薦):

import datetime
now = datetime.datetime.now()
return render(request, 'current_datetime.html',{'crrent_date':str(now)[:19]})

總結(jié):

render(request,'模板名字',context={key:value,key1:value})
本質(zhì)是:
t=Template('<html><body>現(xiàn)在時(shí)刻是:<h1>{{current_date}}</h1></body></html>')
c=Context({'current_date':str(now)})
html=t.render(c) # 返回是字符串
HttpResponse(html)

2.頁面靜態(tài)化

頁面靜態(tài)化有什么作用:提高項(xiàng)目的并發(fā)量,響應(yīng)速度高和效率就高了,這樣就不用每次訪問頁面去數(shù)據(jù)庫中調(diào)取頁面
把什么頁面做成靜態(tài)化:一般是首頁,也就是訪問量高的頁面。

下面做一個(gè)靜態(tài)化的頁面:


def static_page(request):
1.首先判斷文件夾下有沒有staticpage123.html純靜態(tài)頁面if not os.path.exists(r'E:\MyDjango\csrf假\templates\staticpage123.html'):
2.如果沒有則執(zhí)行該代碼user_obj = models.UserInfo.objects.all()  # 前端需要通過這條語句來查詢,并顯示出來with open('templates/staticpage.html', 'r') as f:  # 這是讀該文件夾下的動(dòng)態(tài)頁面# print(f.read())t = Template(f.read())  # 內(nèi)部讀出該文件并得到一個(gè)對(duì)象c = Context(locals())  # 將模版語法傳入到上下文管理器中,locals()獲取頁面上所有對(duì)象,等價(jià)于{'user_obj':user_obj}html = t.render(c)   # 讀出來的頁面加上上下文管理中的模板語法,得到一個(gè)字符串對(duì)象with open('templates/'+'staticpage123.html', 'w')as f1:  # 這一句才是在寫出來靜態(tài)頁面f1.write(html)  # 將html字符串對(duì)象寫入到staticpage123.html中,這就是我們的靜態(tài)文件return HttpResponse(html)  # HttpResponse可以直接返回一個(gè)字符串對(duì)象else:# 如果存在靜態(tài)文件返回靜態(tài)文件return render(request,'staticpage123.html')

模板語法

變量插值:
使用雙括號(hào) {{ variable }} 將變量插入到模板中。例如:{{ user.username }}標(biāo)簽:
使用括號(hào)和百分號(hào) {% %} 包裹的內(nèi)容是標(biāo)簽。標(biāo)簽用于控制模板的流程和邏輯,如條件語句、循環(huán)等。例如:{% if user.is_authenticated %} ... {% endif %}過濾器:
使用管道符 | 將變量傳遞給過濾器,以對(duì)變量進(jìn)行處理。例如:{{ value|filter_name }}注釋:
使用 {# 注釋內(nèi)容 #} 進(jìn)行注釋。模板繼承:
使用 {% extends "base_template.html" %} 來繼承其他模板。塊:
使用 {% block content %}...{% endblock %} 定義可被子模板覆蓋的塊。循環(huán):
使用 {% for item in list %}...{% endfor %} 進(jìn)行循環(huán)迭代。條件語句:
使用 {% if condition %}...{% elif another_condition %}...{% else %}...{% endif %} 進(jìn)行條件判斷。包含:
使用 {% include "partial_template.html" %} 包含其他模板。URL反解析:
使用 {% url 'url_name' arg1 arg2 %} 生成URL。靜態(tài)文件引用:
使用 {% load static %} 導(dǎo)入靜態(tài)文件,然后使用 {% static 'path/to/file.css' %} 引用靜態(tài)文件。

模板語法重點(diǎn):

變量:{{ 變量名 }}
1 深度查詢 用句點(diǎn)符
2 過濾器
3 標(biāo)簽:{{% % }}

過濾器使用
1.在某個(gè)app下:創(chuàng)建一個(gè)templatetags包,在包里創(chuàng)建一個(gè)py文件
2.在py文件中寫過濾器導(dǎo)入模塊
from django import template
register = timplate.Library()  register 的名字是固定的,不可改變
定義一個(gè)自己的過濾器標(biāo)簽
@register.filter
def my_filter(content:str)->str:   # 在括號(hào)里加str和在外面加str的作用是一樣的,表示我的content是一個(gè)字符串l = ['媽的', '傻逼', '退游']  # 定義一個(gè)列表,列表里放的是我需要屏蔽的關(guān)鍵詞# 解下來循環(huán)l列表:把content中的所有關(guān)鍵詞替換,然后返回for item in l:content = content.replace(item,'**')return content前端要調(diào)用過濾器標(biāo)簽的話就需要加載templatetags包下的py文件
{% load 文件名 %}過濾器用法
{{ 需要替換的內(nèi)容變量或?qū)ο?span id="vxwlu0yf4"    class="token operator">|my_filter }}

模型層

ORM介紹

查詢數(shù)據(jù)層次圖解:如果操作mysql,ORM是在pymysql之上又進(jìn)行了一層封裝
在這里插入圖片描述

1ORM是對(duì)象-關(guān)系-映射的簡稱

在數(shù)據(jù)庫中是一個(gè)個(gè)的表,一條條記錄
在程序中是一個(gè)個(gè)的類和一個(gè)個(gè)的對(duì)象

2.SQL中的表
#創(chuàng)建表:CREATE TABLE employee(                                     id INT PRIMARY KEY auto_increment ,                    name VARCHAR (20),                                      gender BIT default 1,                                  birthday DATA ,                                         department VARCHAR (20),                                salary DECIMAL (8,2) unsigned,                          );#sql中的表紀(jì)錄                                                  #添加一條表紀(jì)錄:                                                          INSERT employee (name,gender,birthday,salary,department)            VALUES   ("lqz",1,"1985-12-12",8000,"保潔部");               #查詢一條表紀(jì)錄:                                                           SELECT * FROM employee WHERE age=24;                               #更新一條表紀(jì)錄:                                                           UPDATE employee SET birthday="1989-10-24" WHERE id=1;              #刪除一條表紀(jì)錄:                                                          DELETE FROM employee WHERE name="lqz"                             #python的類
class Employee(models.Model):id=models.AutoField(primary_key=True)name=models.CharField(max_length=32)gender=models.BooleanField()birthday=models.DateField()department=models.CharField(max_length=32)salary=models.DecimalField(max_digits=8,decimal_places=2)#python的類對(duì)象#添加一條表紀(jì)錄:emp=Employee(name="lqz",gender=True,birthday="1985-12-12",epartment="保潔部")emp.save()#查詢一條表紀(jì)錄:Employee.objects.filter(age=24)#更新一條表紀(jì)錄:Employee.objects.filter(id=1).update(birthday="1989-10-24")#刪除一條表紀(jì)錄:Employee.objects.filter(name="lqz").delete()

在pycharm中建表還需要執(zhí)行數(shù)據(jù)遷移的命令
python manage.py makemigrations
python manage.py migrate

2.常用字段和非常用字段

AutoField(Field)- int自增列,必須填入?yún)?shù) primary_key=TrueBigAutoField(AutoField)- bigint自增列,必須填入?yún)?shù) primary_key=True注:當(dāng)model中如果沒有自增列,則自動(dòng)會(huì)創(chuàng)建一個(gè)列名為id的列from django.db import modelsclass UserInfo(models.Model):# 自動(dòng)創(chuàng)建一個(gè)列名為id的且為自增的整數(shù)列username = models.CharField(max_length=32)class Group(models.Model):# 自定義自增列nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)
SmallIntegerField(IntegerField):- 小整數(shù) -3276832767PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正小整數(shù) 032767
IntegerField(Field)- 整數(shù)列(有符號(hào)的) -21474836482147483647PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整數(shù) 02147483647BigIntegerField(IntegerField):- 長整型(有符號(hào)的) -92233720368547758089223372036854775807自定義無符號(hào)整數(shù)字段class UnsignedIntegerField(models.IntegerField):def db_type(self, connection):return 'integer UNSIGNED'PS: 返回值為字段在數(shù)據(jù)庫中的屬性,Django字段默認(rèn)的值為:'AutoField': 'integer AUTO_INCREMENT','BigAutoField': 'bigint AUTO_INCREMENT','BinaryField': 'longblob','BooleanField': 'bool','CharField': 'varchar(%(max_length)s)','CommaSeparatedIntegerField': 'varchar(%(max_length)s)','DateField': 'date','DateTimeField': 'datetime','DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)','DurationField': 'bigint','FileField': 'varchar(%(max_length)s)','FilePathField': 'varchar(%(max_length)s)','FloatField': 'double precision','IntegerField': 'integer','BigIntegerField': 'bigint','IPAddressField': 'char(15)','GenericIPAddressField': 'char(39)','NullBooleanField': 'bool','OneToOneField': 'integer','PositiveIntegerField': 'integer UNSIGNED','PositiveSmallIntegerField': 'smallint UNSIGNED','SlugField': 'varchar(%(max_length)s)','SmallIntegerField': 'smallint','TextField': 'longtext','TimeField': 'time','UUIDField': 'char(32)',BooleanField(Field)- 布爾值類型NullBooleanField(Field):- 可以為空的布爾值CharField(Field)- 字符類型- 必須提供max_length參數(shù), max_length表示字符長度TextField(Field)- 文本類型EmailField(CharField)- 字符串類型,Django Admin以及ModelForm中提供驗(yàn)證機(jī)制IPAddressField(Field)- 字符串類型,Django Admin以及ModelForm中提供驗(yàn)證 IPV4 機(jī)制GenericIPAddressField(Field)- 字符串類型,Django Admin以及ModelForm中提供驗(yàn)證 Ipv4和Ipv6- 參數(shù):protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時(shí)候,可解析為192.0.2.1,開啟刺功能,需要protocol="both"URLField(CharField)- 字符串類型,Django Admin以及ModelForm中提供驗(yàn)證 URLSlugField(CharField)- 字符串類型,Django Admin以及ModelForm中提供驗(yàn)證支持 字母、數(shù)字、下劃線、連接符(減號(hào))CommaSeparatedIntegerField(CharField)- 字符串類型,格式必須為逗號(hào)分割的數(shù)字UUIDField(Field)- 字符串類型,Django Admin以及ModelForm中提供對(duì)UUID格式的驗(yàn)證FilePathField(Field)- 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能- 參數(shù):path,                      文件夾路徑match=None,                正則匹配recursive=False,           遞歸下面的文件夾allow_files=True,          允許文件allow_folders=False,       允許文件夾FileField(Field)- 字符串,路徑保存在數(shù)據(jù)庫,文件上傳到指定目錄- 參數(shù):upload_to = ""      上傳文件的保存路徑storage = None      存儲(chǔ)組件,默認(rèn)django.core.files.storage.FileSystemStorageImageField(FileField)- 字符串,路徑保存在數(shù)據(jù)庫,文件上傳到指定目錄- 參數(shù):upload_to = ""      上傳文件的保存路徑storage = None      存儲(chǔ)組件,默認(rèn)django.core.files.storage.FileSystemStoragewidth_field=None,   上傳圖片的高度保存的數(shù)據(jù)庫字段名(字符串)height_field=None   上傳圖片的寬度保存的數(shù)據(jù)庫字段名(字符串)DateTimeField(DateField)- 日期+時(shí)間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]DateField(DateTimeCheckMixin, Field)- 日期格式      YYYY-MM-DDTimeField(DateTimeCheckMixin, Field)- 時(shí)間格式      HH:MM[:ss[.uuuuuu]]DurationField(Field)- 長整數(shù),時(shí)間間隔,數(shù)據(jù)庫中按照bigint存儲(chǔ),ORM中獲取的值為datetime.timedelta類型FloatField(Field)- 浮點(diǎn)型DecimalField(Field)- 10進(jìn)制小數(shù)- 參數(shù):max_digits,小數(shù)總長度decimal_places,小數(shù)位長度BinaryField(Field)- 二進(jìn)制類型

3.常用字段與非常用字段參數(shù)

(1)null如果為True,Django 將用NULL 來在數(shù)據(jù)庫中存儲(chǔ)空值。 默認(rèn)值是 False.(1)blank如果為True,該字段允許不填。默認(rèn)為False。
要注意,這與 null 不同。null純粹是數(shù)據(jù)庫范疇的,而 blank 是數(shù)據(jù)驗(yàn)證范疇的。
如果一個(gè)字段的blank=True,表單的驗(yàn)證將允許該字段是空值。如果字段的blank=False,該字段就是必填的。(2)default字段的默認(rèn)值??梢允且粋€(gè)值或者可調(diào)用對(duì)象。如果可調(diào)用 ,每有新對(duì)象被創(chuàng)建它都會(huì)被調(diào)用。(3)primary_key如果為True,那么這個(gè)字段就是模型的主鍵。如果你沒有指定任何一個(gè)字段的primary_key=True,
Django 就會(huì)自動(dòng)添加一個(gè)IntegerField字段做為主鍵,所以除非你想覆蓋默認(rèn)的主鍵行為,
否則沒必要設(shè)置任何一個(gè)字段的primary_key=True。(4)unique如果該值設(shè)置為 True, 這個(gè)數(shù)據(jù)字段的值在整張表中必須是唯一的(5)choices
由二元組組成的一個(gè)可迭代對(duì)象(例如,列表或元組),用來給字段提供選擇項(xiàng)。 如果設(shè)置了choices ,默認(rèn)的表單將是一個(gè)選擇框而不是標(biāo)準(zhǔn)的文本框,<br>而且這個(gè)選擇框的選項(xiàng)就是choices 中的選項(xiàng)。
class UserInfo(models.Model):nid = models.AutoField(primary_key=True)username = models.CharField(max_length=32)class Meta:# 數(shù)據(jù)庫中生成的表名稱 默認(rèn) app名稱 + 下劃線 + 類名db_table = "table_name"# 聯(lián)合索引index_together = [("pub_date", "deadline"),]# 聯(lián)合唯一索引unique_together = (("driver", "restaurant"),)# admin中顯示的表名稱verbose_name# verbose_name加sverbose_name_plural

4.settings配置

配置文件中的配置
默認(rèn)操作的是sqlite
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite_lqz',}
}操作mysql:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'day05','HOST':'127.0.0.1','PORT':3306,'USER':'root','PASSWORD':'1234',}
}

裝模塊:pymysql,mysqlclient

mysqlclient,有可能裝不上,看人品

沒有mysqlclient就需要在__init__文件中加上以下代碼

import pymysql
pymysql.install_as_MySQLdb()

5.基本操作(增刪改查)

# 增加刪除字段,只需要在表模型,增加,注釋字段,增加刪除字段參數(shù),再遷移就可以了-不要輕易刪除遷移記錄# 增加表記錄# 方案一:Book.object.create()#方案二:book=Book(參數(shù))book.save()# 刪除記錄-刪除方式一:查出來再刪Book.objects.all().delete()-刪除方式二:#可以重寫類中得delete方法book=Book.objects.filter(pk=1).first()book.delete() #Book 類中有個(gè)delete方法,咱們沒有寫---》父類的--》可以重寫
# 更新-更新方式一:查出來再刪Book.objects.all().update()-更新方式二:	book=Book.objects.filter(pk=1).first()book.name='ss'book.save()#查
# all():                  查詢所有結(jié)果
# filter(**kwargs):       它包含了與所給篩選條件相匹配的對(duì)象
# get(**kwargs):          返回與所給篩選條件相匹配的對(duì)象,返回結(jié)果有且只有一個(gè),如果符合篩選條件的對(duì)象超過一個(gè)或者沒有都會(huì)拋出錯(cuò)誤。# exclude(**kwargs):      它包含了與所給篩選條件不匹配的對(duì)象# order_by(*field):       對(duì)查詢結(jié)果排序('-id')# reverse():              對(duì)查詢結(jié)果反向排序# count():                返回?cái)?shù)據(jù)庫中匹配查詢(QuerySet)的對(duì)象數(shù)量。# first():                返回第一條記錄# last():                返回最后一條記錄# exists():              如果QuerySet包含數(shù)據(jù),就返回True,否則返回False#values(*field):        返回一個(gè)ValueQuerySet——一個(gè)特殊的QuerySet,運(yùn)行后得到的并不是一系列model的實(shí)例化對(duì)象,而是一個(gè)可迭代的字典序列
#values_list(*field):   它與values()非常相似,它返回的是一個(gè)元組序列,values返回的是一個(gè)字典序列# distinct():            從返回結(jié)果中剔除重復(fù)紀(jì)錄

6.多表操作,創(chuàng)建關(guān)系

class Book(models.Model):name = models.CharField(max_length=32)price = models.DecimalField(max_digits=5, decimal_places=2)publish_date = models.DateField()publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)#這不是個(gè)字段authors=models.ManyToManyField(to='Author')def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()author_detail = models.OneToOneField(to='AuthorDatail',unique=True,on_delete=models.CASCADE)class AuthorDatail(models.Model):telephone = models.BigIntegerField()birthday = models.DateField()addr = models.CharField(max_length=64)class Publish(models.Model):name = models.CharField(max_length=32)city = models.CharField(max_length=32)email = models.EmailField()# 關(guān)聯(lián)關(guān)系有如下幾種- 一對(duì)一:本質(zhì)就是一對(duì)多,只不過多的字段唯一-一對(duì)多:外鍵關(guān)聯(lián)-多對(duì)多:必須要有中間表#  OneToOneField,ForeignKey 必須寫on_delete,不寫報(bào)錯(cuò)on_delete可選的參數(shù)有哪些#1 models.CASCADE  級(jí)聯(lián)刪除---》刪除出版社---》當(dāng)前出版社下所有的圖書數(shù)據(jù)都會(huì)被刪除#2  models.SET_NULL 刪除出版社---》當(dāng)前出版社下所有的圖書數(shù)據(jù)都會(huì)的publish_id字段都是置為空publish = models.ForeignKey(to='Publish',on_delete=models.SET_NULL,null=True)#3  models.SET_DEFAULT 刪除出版社---》當(dāng)前出版社下所有的圖書數(shù)據(jù)都會(huì)的publish_id字段都設(shè)為默認(rèn)值publish = models.ForeignKey(to='Publish',on_delete=models.SET_DEFAULT,default=1)#4  models.SET(值/可調(diào)用對(duì)象)刪除出版社---》當(dāng)前出版社下所有的圖書數(shù)據(jù)都會(huì)的publish_id字段都設(shè)為SET傳入的值,如果是可調(diào)用對(duì)象,會(huì)執(zhí)行可調(diào)用對(duì)象,把return變# 5 models.DO_NOTHING 刪除出版社---》當(dāng)前出版社下所有的圖書數(shù)據(jù)都會(huì)的publish_id字段 原封不動(dòng)publish = models.ForeignKey(to='Publish',on_delete=models.DO_NOTHING,db_constraint=False)

7.基于對(duì)象的跨表查詢

# 假設(shè)拿到book對(duì)象book.namebook.pricebook.publish_id ---->數(shù)字---》出版社id號(hào)---》咱們可以通過出版社id,再去出版社表,查出當(dāng)前出版社---》很麻煩-----快捷方式-----book.publish---->拿到的是   publish對(duì)象---》當(dāng)前圖書的出版社對(duì)象book.publish.繼續(xù)往后點(diǎn)擊# 上面這種查詢方式,稱之為基于對(duì)象的跨表查詢對(duì)象=對(duì)象.字段publish=book.pulish# 有正向查詢和 反向查詢---》拿到的都是對(duì)象-正向:當(dāng)前表中,有那個(gè)字段,類似于:book.pulish   author.author_detail-通過字段-反向:當(dāng)前表中,沒有那個(gè)字段	  author_detail.author  通過author_detail拿到author-通過表名小寫# 一對(duì)一正反向太簡單
# 一對(duì)多和多對(duì)多的正反向# 正向簡單publish=book.pulish# 反向publish對(duì)象---》拿到當(dāng)前publish對(duì)象下所有出版過的圖書-->反向查詢puhlish.book_set.all() # 如果是反向,多條,就要用  表名小寫_set.all()#  多對(duì)多正反向# 正向: 拿到當(dāng)前圖書所有作者book.authors.all()  # 正向--》對(duì)象.字段.all()# 反向  拿到當(dāng)前作者寫的所有圖書author.book_set.all() #反向--》多條,就要用  表名小寫_set.all()

查找練習(xí)


import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_05.settings')
import django
django.setup()
from app01.models import Book,Author,AuthorDatail,Publish
if __name__ == '__main__':#res=Book.objects.all().values("title",'price')  # select title,price---》qs中套字典 有key,有value# res=Book.objects.all().values_list("title",'price')  # select title,price---》qs中套元組,只有value# print(res)### 一對(duì)一正反向# 正向:# author = Author.objects.all().first()# print(author.author_detail.addr)# 反向# author_detail=AuthorDatail.objects.filter(pk=3).first()# print(author_detail.author.name)# 一對(duì)多# 正向:# book=Book.objects.all().first()# print(book.publish.name)# 反向# publish=Publish.objects.filter(pk=2).first()# print(publish.book_set.all())# 多對(duì)多# 正# book=Book.objects.filter(pk=3).first()# book=Book.objects.filter(pk=2).first()# print(book.authors.all())# 反# author=Author.objects.all().first()# print(author.book_set.all())

8.基于鏈表的跨表查詢

一對(duì)一鏈表

拿出id1的作者(作者表)   的地址(作者詳情表)正向---》字段名 author_detail
res=Author.objects.filter(pk=1).values('id','name','age','author_detail__addr')
print(res)反向---》查詢 作者地址是 北京 的作者名和作者年齡
反向--》表名小寫
res=AuthorDatail.objects.filter(addr='北京').values('addr','author__name','author__age')
print(res)

一對(duì)多正反向

查詢北京出版社出版過的所有書籍的名字與價(jià)格(一對(duì)多):表名小寫
res=Publish.objects.filter(name='北京出版社').values('name','book__name','book__price')
print(res)正: 按字段
res=Book.objects.filter(publish__name='北京出版社').values('publish__name','name','price')
print(res)

多對(duì)多正反向

查詢jack出過的所有書籍的名字(多對(duì)多)反:
res=Author.objects.filter(name='jack').values("name","book__name")正:
res=Book.objects.filter(authors__name='jack').values('authors__name','name')查詢紅樓夢(mèng)這本書出版社的名字
res=Book.objects.filter(title='紅樓夢(mèng)').values('publish__name')查詢北京出版社出版過的所有書籍的名字以及作者的姓名
res=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name','book__authors__author_detail__addr')res=Book.objects.filter(publish__name='北京出版社').values('name','authors__name')res = Author.objects.filter(book__publish__name='北京出版社').values('book__name','name')
http://www.risenshineclean.com/news/11704.html

相關(guān)文章:

  • 做哪個(gè)網(wǎng)站賣一手房比較好培訓(xùn)課程安排
  • 用什么軟件做樓盤微網(wǎng)站廣州新塘網(wǎng)站seo優(yōu)化
  • 網(wǎng)站建設(shè)流程圖滿十八歲可以申請(qǐng)abc認(rèn)證嗎
  • 上市公司網(wǎng)站建設(shè)報(bào)價(jià)seo排名優(yōu)化
  • 網(wǎng)站建設(shè)圖片競(jìng)價(jià)
  • 西安高端網(wǎng)站建設(shè)公司seo案例分析100例
  • 純靜態(tài)網(wǎng)站制作seo整站優(yōu)化報(bào)價(jià)
  • 一個(gè)網(wǎng)站的后臺(tái)怎么做太原網(wǎng)站建設(shè)
  • 百度怎樣做網(wǎng)站并宣傳網(wǎng)站長春網(wǎng)站建設(shè)公司哪家好
  • 鄭州婦科醫(yī)院正規(guī)有哪些廣州seo營銷培訓(xùn)
  • 煤礦黨風(fēng)廉政建設(shè)網(wǎng)站如何注冊(cè)域名
  • 淘客做的領(lǐng)券網(wǎng)站黑帽seo優(yōu)化推廣
  • 為什么用wp做網(wǎng)站沈陽網(wǎng)站制作優(yōu)化推廣
  • 對(duì)視頻播放網(wǎng)站做性能測(cè)試查排名的軟件有哪些
  • c2c電子商務(wù)網(wǎng)站策劃深圳市龍華區(qū)
  • 做的好看的網(wǎng)站免費(fèi)網(wǎng)站優(yōu)化排名
  • 做網(wǎng)站便宜新聞源
  • wordpress隱藏服務(wù)器ip網(wǎng)站seo優(yōu)化分析
  • 廣州市做民宿什么網(wǎng)站比較好seo搜論壇
  • 什么網(wǎng)站可以免費(fèi)做找客戶谷歌seo快速排名優(yōu)化方法
  • vs做網(wǎng)站教程長春網(wǎng)站關(guān)鍵詞排名
  • 東莞模板建站軟件seo專員
  • 視頻網(wǎng)站如何建設(shè)專業(yè)代寫軟文
  • 武漢招聘一般用什么網(wǎng)站沙洋縣seo優(yōu)化排名價(jià)格
  • 對(duì)酒店網(wǎng)站建設(shè)的意見互聯(lián)網(wǎng)廣告行業(yè)
  • 喀什做網(wǎng)站seo快速排名源碼
  • wordpress 菜單 標(biāo)簽科學(xué)新概念seo外鏈平臺(tái)
  • 照片做視頻ppt模板下載網(wǎng)站知識(shí)營銷成功案例介紹
  • 淡水做網(wǎng)站網(wǎng)頁設(shè)計(jì)主題參考
  • word做招聘網(wǎng)站長尾詞挖掘