HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端服務器模型。HTTP是一個無狀態的協議。端口號爲80html
WebSocket是HTML5開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議。前端
在WebSocket API中,瀏覽器和服務器只須要作一個握手的動做,而後,瀏覽器和服務器之間就造成了一條快速通道。二者之間就直接能夠數據互相傳送。vue
瀏覽器經過 JavaScript 向服務器發出創建 WebSocket 鏈接的請求,鏈接創建之後,客戶端和服務器端就能夠經過 TCP 鏈接直接交換數據。node
有觸發時機在知足條件時自動觸發就是魔術方法python
使用媒體查詢的方式,建立多個元素寬度是相對的的佈局理想的響應式佈局是指的對PC/移動各類終端進行響應的mysql
Bootstrap / vuejquery
AJAX是在不加載整個頁面的狀況異步下與服務器發送請求交換數據並更新部分網頁的藝術ios
特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP request,而後由服務器返回最新的數據給客戶端的瀏覽器。nginx
ajax實現:在發送ajax後,服務器端會阻塞請求直到有數據傳遞或超時纔會返回,客戶端js響應處理函數會在處理完服務器返回的信息後在次發出請求,從新創建鏈接web
Vue 的目標是經過儘量簡單的 API 實現響應的數據綁定和組合的視圖組件。
判斷每個頁面的http請求的狀態獲取內容作響應的處理
v-if
指令v-for
指令。v-on
指令:JSONP是用來解決跨域請求問題的
跨域:協議 域名 端口號有一個不同就是跨域
實現原理:
script標籤src屬性中的連接卻能夠訪問跨域的js腳本,利用這個特性,服務端再也不返回JSON格式的數據,而是返回一段調用某個函數的js代碼,在src中進行了調用,這樣實現了跨域。
CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 AJAX 跨域請求資源的方式,支持現代瀏覽器,IE支持10以上。
GET / POST
404 請求的url地址不存在
503 訪問限制有權限
200 訪問成功
302 重定向
alert(李傑)
console.log(‘武沛齊’)
console.log(‘老男孩’)
結果什麼也沒有 由於console.log.的時候xo尚未定義
alert(」武沛齊’)
alert(」武沛齊’)
Django:Python 界最全能的 web 開發框架,battery-include 各類功能完備,可維護性和開發速度一級棒。常有人說 Django 慢,其實主要慢在 Django ORM 與數據庫的交互上,因此是否選用 Django,取決於項目對數據庫交互的要求以及各類優化。而對於 Django 的同步特性致使吞吐量小的問題,其實能夠經過 Celery 等解決,倒不是一個根本問題。Django 的項目表明:Instagram,Guardian。
Tornado:天生異步,性能強悍是 Tornado 的名片,然而 Tornado 相比 Django 是較爲原始的框架,諸多內容須要本身去處理。固然,隨着項目愈來愈大,框架可以提供的功能佔比愈來愈小,更多的內容須要團隊本身去實現,而大項目每每須要性能的保證,這時候 Tornado 就是比較好的選擇。Tornado項目表明:知乎。
Flask:微框架的典範,號稱 Python 代碼寫得最好的項目之一。Flask 的靈活性,也是雙刃劍:能用好 Flask 的,能夠作成 Pinterest,用很差就是災難(顯然對任何框架都是這樣)。Flask 雖然是微框架,可是也能夠作成規模化的 Flask。加上 Flask 能夠自由選擇本身的數據庫交互組件(一般是 Flask-SQLAlchemy),並且加上 celery +redis 等異步特性之後,Flask 的性能相對 Tornado 也不逞多讓,也許Flask 的靈活性多是某些團隊更須要的。
前端請求—>nginx—>uwsgi.—>中間件—>url路由—->view試圖—>orm—->拿到數據返回給view—->試圖將數據渲染到模版中拿到字符串—->中間件—>uwsgi—->nginx—->前端渲染
url 、view、model、template、中間件
django中請求處理方式有2種:FBV 和 CBV
FBV(function base views) 就是在視圖裏使用函數處理請求。
CBV(class base views)就是在視圖裏使用類處理請求 類須要繼承view
當請求一個頁面時,Django會創建一個包含請求元數據的 HttpRequest 對象。 當Django 加載對應的視圖時,HttpRequest 對象將做爲視圖函數的第一個參數。每一個視圖會返回一個HttpResponse 對象。
返回Query Set對象的方法有:
* all()
* filter()
* exclude()
* order_by()
* reverse()
* dictinct()
特殊的QuerySet:
* values() 返回一個可迭代的字典序列
* values_list() 返回一個可迭代的元祖序列
返回具體對象的:
* get()
* first()
* last()
返回布爾值的方法有:
* existe()
返回數學的方法有:
* count( )
filter是查詢知足條件的數據
exclude是查詢不知足添加的數據
F:操做數據表中的某列值,F( )容許Django在未實際連接數據的狀況下具備對數據庫字段的值的引用,不用獲取對象放在內存中再對字段進行操做,直接執行原生產sql語句操做。
一般狀況下咱們在更新數據時須要先從數據庫裏將原數據取出後方在內存裏,而後編輯某些屬性,最後提交
Q:對對象進行復雜查詢,並支持&(and),|(or),~(not)操做符。
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個可選擇的值
Django預防CSRF攻擊的方法是在用戶提交的表單中加入一個csrftoken的隱含值,這個值和服務器中保存的csrftoken的值相同,這樣作的原理以下:
一、在用戶訪問django的可信站點時,django反饋給用戶的表單中有一個隱含字段csrftoken,這個值是在服務器端隨機生成的,每一次提交表單都會生成不一樣的值
二、當用戶提交django的表單時,服務器校驗這個表單的csrftoken是否和本身保存的一致,來判斷用戶的合法性
三、當用戶被csrf攻擊從其餘站點發送精心編制的攻擊請求時,因爲其餘站點不可能知道隱藏的csrftoken字段的信息這樣在服務器端就會校驗失敗,攻擊被成功防護
具體配置以下:
template中添加{%csrf_token%}標籤
利用dwebsocket在Django中使用Websocket
http://www.javashuo.com/article/p-hlamxgwt-e.html
http://www.javashuo.com/article/p-pddsitfb-dr.html
name 能夠用於在 templates, models, views ……中獲得對應的網址,至關於「給網址取了個小名」,只要這個名字不變,網址變了也能經過名字獲取到。
simple_tag
-參數任意,可是不能做爲if條件判斷的條件
filter
-參數最多隻能有兩個,可是能夠做爲if條件判斷的條件。
django_debug_toolbar 是django的第三方工具包,給django擴展了調試功能。
包括查看執行的sql語句,db查詢次數,request,headers,調試概覽等。
https://blog.csdn.net/weixin_39198406/article/details/78821677
https://www.jianshu.com/p/34267dd79ad6
datebase first就是表明數據庫優先,那麼前提就是先建立數據庫。
model first就是表明model優先,那麼前提也就是先建立model,而後根據model自動創建數據庫。
Django附帶一個名爲inspectdb的實用程序,能夠經過檢查現有的數據庫來建立Model(模型)
ORM框架:
對象關係映射,經過建立一個類,這個類與數據庫的表相對應!類的對象代指數據庫中的一行數據。
簡述ORM原理:
讓用戶再也不寫SQL語句,而是經過類以及對象的方式,和其內部提供的方法,進行數據庫操做!把用戶輸入的類或對象轉換成SQL語句,轉換以後經過pymysql執行完成數據庫的操做。
ORM的優缺點:
優勢:
* 提升開發效率,下降開發成本
* 使開發更加對象化
* 可移植
* 能夠很方便地引入數據緩存之類的附加功能
缺點:
* 在處理多表聯查、where條件複雜之類的查詢時,ORM的語法會變得複雜。就須要寫入原生SQL。
MTV和MVC?
MVC: 模型 視圖 控制器
MTV: 模型 模板 視圖
django內置的ContentType組件就是幫咱們作連表操做
若是一個表與其餘表有多個外鍵關係,咱們能夠經過ContentType來解決這種關聯
http://www.cnblogs.com/iyouyue/p/8810464.html
一個接口經過首先進行1次訪問,而後對該接口進行N次相同訪問的時候,對訪問對象不形成影響,那麼就認爲接口具備冪等性。
好比:
* GET, 第一次獲取數據、第二次也是獲取結果,冪等。
* POST, 第一次新增數據,第二次也會再次新增,非冪等。
* PUT, 第一次更新數據,第二次不會再次更新,冪等。
* PATCH,第一次更新數據,第二次可能再次更新,非冪等。
* DELTE,第一次刪除數據,第二次不會再次刪除,冪等。
RPC(Remote Procedure Call)—遠程過程調用,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。
超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就能夠直接讀懂其中的信息,所以,HTTP協議不適合傳輸一些敏感信息,好比:信用卡號、密碼等支付信息。
爲了解決HTTP協議的這一缺陷,須要使用另外一種協議:安全套接字層超文本傳輸協議HTTPS,爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。
1.客戶端-服務端分離
優勢:提升用戶界面的便攜性,經過簡化服務器提升可伸縮性….
2.無狀態(Stateless):從客戶端的每一個請求要包含服務器所須要的全部信息
優勢:提升可見性(能夠單獨考慮每一個請求),提升了可靠性(更容易從局部故障中修復),提升可擴展性(下降了服務器資源使用)
3.緩存(Cachable):服務器返回信息必須被標記是否能夠緩存,若是緩存,客戶端可能會重用以前的信息發送請求
優勢:減小交互次數,減小交互的平均延遲
4.統一接口
優勢:提升交互的可見性,鼓勵單獨改善組件
5.支持按需代碼(Code-On-Demand 可選)
優勢:提升可擴展性
a. 繼承 APIView
b. 繼承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
若是繼承它以後,路由中的as_view須要填寫對應關係 .as_view({‘get’:’list’,’post’:’create’})
在內部也幫助咱們提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer
c. 繼承
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
a. 基於用戶IP限制訪問頻率
b. 基於用戶IP顯示訪問頻率(利於Django緩存)
c. view中限制請求頻率
d. 匿名時用IP限制+登陸時用Token限制
1、總體設計方面
首先,二者都是很是優秀的框架。總體來說,二者設計的哲學是區別最大的地方。Django提供一站式的解決方案,從模板、ORM、Session、Authentication等等都分配好了,連app劃分都作好了,總之,爲你作儘可能多的事情,並且還有一個killer級的特性,就是它的admin,配合django-suit,後臺就出來了,其實最初Django就是由在新聞發佈公司工做的人設計的。Flask只提供了一些核心功能,很是簡潔優雅。它是一個微框架,其餘的由擴展提供,但它的blueprint使它也可以很方便的進行水平擴展。
2、路由設計
Django的路由設計是採用集中處理的方法,利用正則匹配。Flask也能這麼作,但更多的是使用裝飾器的形式,這個有優勢也有缺點,優勢是讀源碼時看到函數就知道怎麼用的,缺點是一旦源碼比較長,你要查路由就不太方便了,但這也促使你去思考如何更合理的安排代碼。
3、應用模塊化設計
Django的模塊化是集成在命令裏的,也就是說一開始Django的目標就是爲之後玩大了作準備的。每一個都是一個獨立的模塊,爲之後的複用提供了便利。Flask經過Blueprint來提供模塊化,本身對項目結構劃分紅不一樣的模塊進行組織。
內置:
- 配置
- 路由
- 視圖
- 模板
- session
- 閃現
- 藍圖
- 中間件
- 特殊裝飾器
第三方:
- Flask組件:
- flask-session
- flask-SQLAlchemy
- flask-migrate
- flask-script
- blinker
- 公共組件:
- wtforms
- dbutile
- sqlalchemy
- 自定義Flask組件
- auth ,參考flask-login組件
每次有請求過來的時候,flask 會先建立當前線程或者進程須要處理的兩個重要上下文對象,把它們保存到隔離的棧裏面,這樣視圖函數進行處理的時候就能直接從棧上獲取這些信息。
g 至關於一次請求的全局變量,當請求進來時將g和current_app封裝爲一個APPContext類,在經過LocalStack將Appcontext放入Local中,取值時經過偏函數,LocalStack、loca l中取值,響應時將local中的g數據刪除
當是web應用時:無論是單線程仍是多線程,棧中只有一個數據
- 服務端單線程:
{
111:{stack: [ctx, ]}
}
- 服務端多線程:
{
111:{stack: [ctx, ]}
112:{stack: [ctx, ]}
}
請求進來時,能夠根據URL的不一樣,交給不一樣的APP處理
Flask-SocketIO
Flask-Sockets是Flask框架的一個擴展,經過它,Flask應用程序可使用WebSocket。
WTForms是一個支持多個web框架的form組件,主要用於對用戶請求數據進行驗證。
http://www.javashuo.com/article/p-dbwsifcn-q.html
Flask的默認session利用了Werkzeug的SecureCookie,把信息作序列化(pickle)後編碼(base64),放到cookie裏了。
過時時間是經過cookie的過時時間實現的。
爲了防止cookie內容被篡改,session會自動打上一個叫session的hash串,這個串是通過session內容、SECRET_KEY計算出來的,看得出,這種設計雖然不能保證session裏的內容不泄露,但至少防止了不被篡改。
a. threading.local
做用:爲每一個線程開闢一塊空間進行數據存儲。
b. 自定義Local對象
做用:爲每一個線程(協程)開闢一塊空間進行數據存儲。
https://www.jianshu.com/p/3f38b777a621
Flask框架中的信號基於blinker,可讓開發者在flask請求過程當中 定製一些用戶行爲執行。
在請求先後,模板渲染先後,上下文先後,異常 的時候
使用scoped_session的目的主要是爲了線程安全。
scoped_session相似單例模式,當咱們調用使用的時候,會先在Registry裏找找以前是否已經建立session了。
要是有,就把這個session返回。
要是沒有,就建立新的session,註冊到Registry中以便下次返回給調用者。
這樣就實現了這樣一個目的:在同一個線程中,call scoped_session 的時候,返回的是同一個對象
概念: 對象關係映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換。
詳細介紹: 讓咱們從O/R開始。字母O起源於」對象」(Object),而R則來自於」關係」(Relational)。幾乎全部的程序裏面,都存在對象和關係數據庫。在業務邏輯層和用戶界面層中,咱們是面向對象的。當對象信息發生變化的時候,咱們須要把對象的信息保存在關係數據庫中。
當你開發一個應用程序的時候(不使用O/R Mapping),你可能會寫很多數據訪問層的代碼,用來從數據庫保存,刪除,讀取對象信息,等等。你在DAL中寫了不少的方法來讀取對象數據,改變狀態對象等等任務。而這些代碼寫起來老是重複的。
ORM解決的主要問題是對象關係的映射。域模型和關係模型分別是創建在概念模型的基礎上的。域模型是面向對象的,而關係模型是面向關係的。通常狀況下,一個持久化類和一個表對應,類的每一個實例對應表中的一條記錄,類的每一個屬性對應表的每一個字段。
ORM技術特色:
* 提升了開發效率。因爲ORM能夠自動對Entity對象與數據庫中的Table進行字段與屬性的映射,因此咱們實際可能已經不須要一個專用的、龐大的數據訪問層。
* ORM提供了對數據庫的映射,不用sql直接編碼,可以像操做對象同樣從數據庫獲取數據。
使用DBUtils模塊
兩種使用模式:
1. 爲每一個線程建立一個鏈接,鏈接不可控,須要控制線程數
1. 建立指定數量的鏈接在鏈接池,當線程訪問的時候去取,若是不夠了線程排隊,直到有人釋放。平時建議使用這種!
sqlalchemy設置編碼字符集必定要在數據庫訪問的URL上增長charset=utf8,不然數據庫的鏈接就不是utf8的編碼格式
eng = create_engine(‘mysql://root:root@localhost:3306/test2?charset=utf8’,echo=True)
UniqueConstraint 設置聯合惟一索引
Tornado的獨特之處在於其全部開發工具可以使用在應用開發的任意階段以及任何檔次的硬件資源上。並且,完整集的Tornado工具可使開發人員徹底不用考慮與目標鏈接的策略或目標存儲區大小。
Tornado 結構的專門設計爲開發人員和第三方工具廠商提供了一個開放環境。已有部分應用程序接口能夠利用並附帶參考書目,內容從開發環境接口到鏈接實現。Tornado包括強大的開發和調試工具,尤爲適用於面對大量問題的嵌入式開發人員。這些工具包括C和C++源碼級別的調試器,目標和工具管理,系統目標跟蹤,內存使用分析和自動配置. 另外,全部工具能很方便地同時運行,很容易增長和交互式開發。
http://python.jobbole.com/87310/
http://www.javashuo.com/article/p-txafhqzq-dy.html
處理方法:
static_path = os.path.join(os.paht.dirname(file), 「static」) #這裏增長設置了靜態路徑
另一個修改就是在實例化 tornado.web.Application() 的時候,在參數中,出了有靜態路徑參數 static_path ,還有一個參數設置 debug=True
torndb是一個輕量級的基於MySQLdb封裝的一個模塊,從tornado3.0版本之後,其已經做爲一個獨立模塊發行了。torndb依賴於MySQLdb模塊,所以,在使用torndb模塊時,要保證系統中已經有MySQLdb模塊。
tornado-redis
Tornado是使用Python編寫的一個強大的、可擴展的Web服務器。它在處理嚴峻的網絡流量時表現得足夠強健,但卻在建立和編寫時有着足夠的輕量級,並可以被用在大量的應用和工具中。
咱們如今所知道的Tornado是基於Bret Taylor和其餘人員爲FriendFeed所開發的網絡服務框架,當FriendFeed被Facebook收購後得以開源。不一樣於那些最多隻能達到10,000個併發鏈接的傳統網絡服務器,Tornado在設計之初就考慮到了性能因素,旨在解決C10K問題,這樣的設計使得其成爲一個擁有很是高性能的框架。此外,它還擁有處理安全性、用戶驗證、社交網絡以及與外部服務(如數據庫和網站API)進行異步交互的工具。