❶ 【Python】淺談python中的json
一 前言
最近一直在做開發相關的工作--基於Django的web 平台,其中需要從model層傳輸數據到view 層做數據展示或者做業務邏輯處理。我們採用通用的Json格式--Json(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和程序解析。
二 認識Json
2.1 Json 結構
常見的Json格式為 「名稱/值」對的集合,其中 值可以是對象,列表,字典,字元串等等。比如
backup_data = {"back_to_host": "dbbk0",
"ip_address": "10.10.20.3",
"host_name": "rac4",
"port": 3306}
2.2 使用Json
Python的Json模塊序列化與反序列化的過程分別是 編碼和解碼。這兩個過程涉及到兩組不同的函數
編碼 把一個Python對象編碼轉換成Json字元串,json.mps(data)/json.mp(data,file_handler)
解碼 把Json格式字元串解碼轉換成Python對象,json.loads(data)/json.load(file_handler)
在python中要使用Json模塊做相關操作,必須先導入:
import Json
2.3 主要函數
編碼函數主要有 json.mps(data)/json.mp(data,file_handler)
json.mps()的參數是將python對象轉換為字元串,如使用json.mps序列化的對象json_mps=json.mps({'a':1, 'b':2}) ,json_mps='{"b": 2, "a": 1}'
json.mp 是將內置類型序列化為json對象後寫入文件。
解碼函數主要由json.loads(data)/json.load(file_handler)
json.loads的參數是內存對象,把Json格式字元串解碼轉換成Python對象,json_loads=json.loads(d_json) #{ b": 2, "a": 1},使用load重新反序列化為dict
json.load()的參數針對文件句柄,比如本地有一個文件/tmp/test.json json_load=json.load(open('/tmp/test.json'))
具體案例參考如下:
In [3]: data={"back_to_host": "rac1",
...: "ip_address": "10.215.20.3",
...: "host_name": "rac3",
...: "port": 3306}
In [7]: json_str=json.mps(data)
In [8]: print json_str
{"ip_address": "10.215.20.3", "back_to_host": "rac1", "host_name": "rac3", "port": 3306}
In [9]: json_loads=json.load(json_str)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-180506f16431> in <mole>()
----> 1 json_loads=json.load(json_str)
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in load(fp, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
284
285 ""
注意 從上面的報錯信息來看 json.loads 傳參是字元串類型,並不是文件句柄,沒有 read()屬性。
In [10]: json_loads=json.loads(json_str)
In [11]: print json_loads
{u'back_to_host': u'rac1', u'ip_address': u'10.215.20.3', u'host_name': u'rac3', u'port': 3306}
In [12]: type(json_loads)
Out[12]: dict
In [13]: type(json_str)
Out[13]: str
利用mp 將數據寫入 mp.json
In [17]: with open('/tmp/mp.json','w') as f:
...: json.mp(json_str,f)
...:
yangyiDBA:~ yangyi$ cat /tmp/mp.json
"{\"ip_address\": \"10.10.20.3\", \"back_to_host\": \"rac1\", \"host_name\": \"rac3\", \"port\": 3306}"
yangyiDBA:~ yangyi$
利用json.load 將mp.sjon的數據讀出來並賦值給 data
In [18]: with open('/tmp/mp.json','r') as f:
...: data=json.load(f)
...:
In [19]: print data
{"ip_address": "10.10.20.3", "back_to_host": "rac1", "host_name": "rac3", "port": 3306}
三 小結
本文算是一篇學習筆記,主要對比了json.loads/json.load , json.mps/ json.mp 的使用差異 ,方便以後更好的使用json 。
以上為本次分享內容,感謝觀看。
❷ Dubbo——HTTP 協議 + JSON-RPC
Protocol 還有一個實現分支是 AbstractProxyProtocol,如下圖所示:
從圖中我們可以看到:gRPC、HTTP、WebService、Hessian、Thrift 等協議對應的 Protocol 實現,都是繼承自 AbstractProxyProtocol 抽象類。
目前互聯網的技術棧百花齊放,很多公司會使用 Node.js、Python、Rails、Go 等語言來開發 一些 Web 端應用,同時又有很多服務會使用 Java 技術棧實現,這就出現了大量的跨語言調用的需求。Dubbo 作為一個 RPC 框架,自然也希望能實現這種跨語言的調用,目前 Dubbo 中使用「HTTP 協議 + JSON-RPC」的方式來達到這一目的,其中 HTTP 協議和 JSON 都是天然跨語言的標准,在各種語言中都有成熟的類庫。
下面就重點來分析 Dubbo 對 HTTP 協議的支持。首先,會介紹 JSON-RPC 的基礎,並通過一個示例,快速入門,然後介紹 Dubbo 中 HttpProtocol 的具體實現,也就是如何將 HTTP 協議與 JSON-RPC 結合使用,實現跨語言調用的效果。
Dubbo 中支持的 HTTP 協議實際上使用的是 JSON-RPC 協議。
JSON-RPC 是基於 JSON 的跨語言遠程調用協議。Dubbo 中的 bbo-rpc-xml、bbo-rpc-webservice 等模塊支持的 XML-RPC、WebService 等協議與 JSON-RPC 一樣,都是基於文本的協議,只不過 JSON 的格式比 XML、WebService 等格式更加簡潔、緊湊。與 Dubbo 協議、Hessian 協議等二進制協議相比,JSON-RPC 更便於調試和實現,可見 JSON-RPC 協議還是一款非常優秀的遠程調用協議。
在 Java 體系中,有很多成熟的 JSON-RPC 框架,例如 jsonrpc4j、jpoxy 等,其中,jsonrpc4j 本身體積小巧,使用方便,既可以獨立使用,也可以與 Spring 無縫集合,非常適合基於 Spring 的項目。
下面先來看看 JSON-RPC 協議中請求的基本格式:
JSON-RPC請求中各個欄位的含義如下:
在 JSON-RPC 的服務端收到調用請求之後,會查找到相應的方法並進行調用,然後將方法的返回值整理成如下格式,返回給客戶端:
JSON-RPC響應中各個欄位的含義如下:
Dubbo 使用 jsonrpc4j 庫來實現 JSON-RPC 協議,下面使用 jsonrpc4j 編寫一個簡單的 JSON-RPC 服務端示常式序和客戶端示常式序,並通過這兩個示常式序說明 jsonrpc4j 最基本的使用方式。
首先,需要創建服務端和客戶端都需要的 domain 類以及服務介面。先來創建一個 User 類,作為最基礎的數據對象:
接下來創建一個 UserService 介面作為服務介面,其中定義了 5 個方法,分別用來創建 User、查詢 User 以及相關信息、刪除 User:
UserServiceImpl 是 UserService 介面的實現類,其中使用一個 ArrayList 集合管理 User 對象,具體實現如下:
整個用戶管理業務的核心大致如此。下面我們來看服務端如何將 UserService 與 JSON-RPC 關聯起來。
首先,創建 RpcServlet 類,它是 HttpServlet 的子類,並覆蓋了 HttpServlet 的 service() 方法。我們知道,HttpServlet 在收到 GET 和 POST 請求的時候,最終會調用其 service() 方法進行處理;HttpServlet 還會將 HTTP 請求和響應封裝成 HttpServletRequest 和 HttpServletResponse 傳入 service() 方法之中。這里的 RpcServlet 實現之中會創建一個 JsonRpcServer,並在 service() 方法中將 HTTP 請求委託給 JsonRpcServer 進行處理:
最後,創建一個 JsonRpcServer 作為服務端的入口類,在其 main() 方法中會啟動 Jetty 作為 Web 容器,具體實現如下:
這里使用到的 web.xml 配置文件如下:
完成服務端的編寫之後,下面再繼續編寫 JSON-RPC 的客戶端。在 JsonRpcClient 中會創建 JsonRpcHttpClient,並通過 JsonRpcHttpClient 請求服務端:
在 AbstractProxyProtocol 的 export() 方法中,首先會根據 URL 檢查 exporterMap 緩存,如果查詢失敗,則會調用 ProxyFactory.getProxy() 方法將 Invoker 封裝成業務介面的代理類,然後通過子類實現的 doExport() 方法啟動底層的 ProxyProtocolServer,並初始化 serverMap 集合。具體實現如下:
在 HttpProtocol 的 doExport() 方法中,與前面介紹的 DubboProtocol 的實現類似,也要啟動一個 RemotingServer。為了適配各種 HTTP 伺服器,例如,Tomcat、Jetty 等,Dubbo 在 Transporter 層抽象出了一個 HttpServer 的介面。
bbo-remoting-http 模塊的入口是 HttpBinder 介面,它被 @SPI 註解修飾,是一個擴展介面,有三個擴展實現,默認使用的是 JettyHttpBinder 實現,如下圖所示:
HttpBinder 介面中的 bind() 方法被 @Adaptive 註解修飾,會根據 URL 的 server 參數選擇相應的 HttpBinder 擴展實現,不同 HttpBinder 實現返回相應的 HttpServer 實現。HttpServer 的繼承關系如下圖所示:
這里以 JettyHttpServer 為例簡單介紹 HttpServer 的實現,在 JettyHttpServer 中會初始化 Jetty Server,其中會配置 Jetty Server 使用到的線程池以及處理請求 Handler:
可以看到 JettyHttpServer 收到的全部請求將委託給 DispatcherServlet 這個 HttpServlet 實現,而 DispatcherServlet 的 service() 方法會把請求委託給對應接埠的 HttpHandler 處理:
了解了 Dubbo 對 HttpServer 的抽象以及 JettyHttpServer 的核心之後,回到 HttpProtocol 中的 doExport() 方法繼續分析。
在 HttpProtocol.doExport() 方法中會通過 HttpBinder 創建前面介紹的 HttpServer 對象,並記錄到 serverMap 中用來接收 HTTP 請求。這里初始化 HttpServer 以及處理請求用到的 HttpHandler 是 HttpProtocol 中的內部類,在其他使用 HTTP 協議作為基礎的 RPC 協議實現中也有類似的 HttpHandler 實現類,如下圖所示:
在 HttpProtocol.InternalHandler 中的 handle() 實現中,會將請求委託給 skeletonMap 集合中記錄的 JsonRpcServer 對象進行處理:
skeletonMap 集合中的 JsonRpcServer 是與 HttpServer 對象一同在 doExport() 方法中初始化的。最後,我們來看 HttpProtocol.doExport() 方法的實現:
介紹完 HttpProtocol 暴露服務的相關實現之後,下面再來看 HttpProtocol 中引用服務相關的方法實現,即 protocolBindinRefer() 方法實現。該方法首先通過 doRefer() 方法創建業務介面的代理,這里會使用到 jsonrpc4j 庫中的 JsonProxyFactoryBean 與 Spring 進行集成,在其 afterPropertiesSet() 方法中會創建 JsonRpcHttpClient 對象:
下面來看 doRefer() 方法的具體實現:
在 AbstractProxyProtocol.protocolBindingRefer() 方法中,會通過 ProxyFactory.getInvoker() 方法將 doRefer() 方法返回的代理對象轉換成 Invoker 對象,並記錄到 Invokers 集合中,具體實現如下:
本文重點介紹了在 Dubbo 中如何通過「HTTP 協議 + JSON-RPC」的方案實現跨語言調用。首先介紹了 JSON-RPC 中請求和響應的基本格式,以及其實現庫 jsonrpc4j 的基本使用;接下來我們還詳細介紹了 Dubbo 中 AbstractProxyProtocol、HttpProtocol 等核心類,剖析了 Dubbo 中「HTTP 協議 + JSON-RPC」方案的落地實現。
❸ 技術基礎--JSON-RPC2.0
最近剛加入區塊鏈學習的熱潮,從一些基本技術開始學起。本文翻譯自 JSON-RPC 2.0 Specification . 其實協議很簡單,本不需要翻譯,主要是為了記錄這個學習過程,以及加深理解。
JSON是一種輕量級的數據交換格式。它可以地標數字,字元串,有序數組,以及鍵值對。
而JSON-RPC是一種無狀態的,輕量級的遠程程序調用協議。不只一種數據結構及其處理規則可以符合這種定義。數據通過socket, http, 或其他環境傳輸,並不能確定其將在本進程內使用。它使用JSON來座位數據格式。
設計也很簡單。
關鍵詞「MUST」, "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"的解釋可以在RFC2119中找到。
由於採用了JSON協議,其可傳輸的數據類型也和JSON相同。JSON可以表示四種基本類型, Strings, Numbers, Booleans, Null,還有兩種結構類型:Objects, Arrays。當我們提到「基本類型」的時候,是指四種基本的JSON類型,而「結構類型」則指代以上兩種JSON結構類型。當提到JSON類型時,總會把第一個字母大寫,比如Object, Array, String, Number, Boolean, Null. True和False也是如此。
JSON-RPC 2.0定義的請求對象和響應對象和現有的JSON-RPC 1.0客戶端/伺服器有兼容問題。這兩個版本其實很好區分,2.0定義了一個叫"jsonrpc"的成員,其值時2.0,而1.0版本沒有。2.0的實現往往要兼容1.0的對象,即使我們在開發點對點以外或者明顯不是1.0的業務的時候亦是如此。
RPC調用是指發送一個請求對象到遠程伺服器上。請求對象包括以下成員:
jsonrpc: 用來聲明JSON-RPC協議的版本,固定為「2.0」
method:需要調用的方法。方法名以單詞rpc開頭,後面跟上期限字元,這個欄位在rpc交互的方法及其擴展上被存儲起來,並且不能用於其他意義。
params: 結構化的值,用於存儲方法響應需要用到的參數,且不能被省略。
id:客戶端分配的一個標識符,可以包含字元串,數字或者為空。如果沒有id,就會被當成是廣播通知。這個值一般不能為Null,且為數字時不能有小數。如果請求中含有這個欄位,伺服器在響應時,必須原樣返回該欄位,用來關聯以下兩個對象的不同環境:
當請求參數中不發送id成員時,該請求會被當作通知處理。對於通知,客戶端不關心響應對象,因為服務端也沒必要返回響應對象,確切的說,服務端不準答復一個通知請求,即便這個請求是批處理請求中的一個。
根據這個定義,通知請求並不會被確認,因為客戶端不會收到響應對象,更進一步說,通知請求的客戶端無法感知到錯誤,比如參數錯誤/網路錯誤等。
RPC調用的參數必須是結構化的值(對象或者數組),對象通過名字遍歷,而數組通過位置可遍歷。
數組參數的遍歷順序必須與服務端順序一致。
對象參數的成員值必須與服務端期望的一致,且在大小寫上精確匹配。一旦有成員缺失,會導致錯誤產生。
當RPC請求出錯時,伺服器響應的Response對象中,必須包含error,且包含以下成員:
code: Number類型,表示出錯類型
message: String類型 簡介的一句話來描述錯誤
data: 可以是基本類型,也可以是結構類型,來表示錯誤的額外信息,且可以預設。具體取值由伺服器自定義,比如錯誤詳情,訪問限制等等。
-32768到-32000之間的錯誤碼是系統保留錯誤碼,協議預定義方便未來使用。錯誤碼的定義和XML-RPC類似:
-32700: 解析錯誤,無效的JSON結構,伺服器在解析JSON時出錯
-32600: 請求無效,Request對象不是一個合法的JSON請求
-32601: 未知的方法,伺服器未定義該method,或者該方法不可用
-32602: 參數錯誤
-32603: 網路錯誤
-32000--32099: 伺服器錯誤,伺服器其他錯誤的保留錯誤碼
上述區間以外的錯誤碼可在應用開發時使用。
同時發送多個Request對象時, 客戶端可以把請求都放到一個數組里一起發送。
服務端收到Request對象數組並處理完成後,應當以數組的形式返回,且數組中包含了響應的請求的Response對象。每一個請求對應一個響應,如果請求是通知的話,則不包含該Response對象。服務端在批處理請求任務時,可以按任何順序或者並行化處理。
服務端對請求進行批處理時者不是至少長度為1的合法請求對象數組時,伺服器響應的對象必須是一個單的Response對象。如果沒有Response數組中不包含Response對象,那也不能返回空數組,而應該什麼都不返回。
--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}
--> {"jsonrpc": "2.0", "method": "subtract", "params": [23, 42], "id": 2}<-- {"jsonrpc": "2.0", "result": -19, "id": 2}
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}<-- {"jsonrpc": "2.0", "result": 19, "id": 3}--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4}<-- {"jsonrpc": "2.0", "result": 19, "id": 4}
--> {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]}
--> {"jsonrpc": "2.0", "method": "foobar"}
--> {"jsonrpc": "2.0", "method": "foobar", "id": "1"}
<-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"}
--> {"jsonrpc": "2.0", "method": "foobar, "params": "bar", "baz]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
--> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
--> [ {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, {"jsonrpc": "2.0", "method"]<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
--> []<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
--> [1]
<-- [ {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}]
--> [1,2,3]
<-- [ {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}]
--> [
{"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
{"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
{"foo": "boo"},
{"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
{"jsonrpc": "2.0", "method": "get_data", "id": "9"}
]
<-- [
{"jsonrpc": "2.0", "result": 7, "id": "1"},
{"jsonrpc": "2.0", "result": 19, "id": "2"},
{"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},
{"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
]
--> [
{"jsonrpc": "2.0", "method": "notify_sum", "params": [1,2,4]},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}
]
<-- //Nothing is returned for all notification batches
使用rpc開頭的方法名是系統擴展方法,且不能用於其他場合。每一個系統擴展都在相關聲明中定義。系統擴展是可選的。
1)如何撰寫一個規范,或者說一個規范由哪些部分組成,本規范是一個很好的模版
2)如何做前後兼容。jsonrpc的兼容方式很簡單,在請求頭部擴展一個jsonrpc的版本號即可。如果是良好的設計,在1.0的時候就應該加上此欄位。
3)嚴謹性。比如,我們不能簡單的使用Null作為id參數來表示通知,服務端解析id失敗也返回Null的id,無法區分這兩種情形。
4)批處理。一個好的設計必然要考慮多任務的批處理,在設計批處理時,需要考慮數據的解析,伺服器可能不按序處理,以及可能並發處理,需要考慮不同的請求在不同的時許下處理可能產生的影響
5)舉例。和測試用例的設計有點類似,盡可能覆蓋全面
JSON-RPC 2.0 Specification
❹ python後端開發需要學什麼
可以參考下面的路徑去學習,祝你學有所成,公司最近在人工智慧和自然語言處理的項目後端項目,我也是網上找了很多知識,最後給自己列了一個學習的目錄,按照這個在復習並在總結,希望能幫到你:
計算機基本認知,環境搭建 python環境搭建
計算機基本認識,進制轉換
python注釋使用
python變數使用
python數據類型_Number
python數據類型 str字元串類型
容器類型數據list,tuple,str
容器類型數據set,dict
變數緩存機制
自動類型轉換
Number強制類型轉換
python運算符的使用 容器類型數據強制類型轉換
字典強轉等長二級容器
運算符_算數_比較
運算符_賦值_成員
運算符_身份_邏輯
運算符_位運算_優先順序
python流程式控制制 代碼塊
流程式控制制if
多項巢狀分支
循環結構while
循環判斷經典題
字元串的相關操作
python循環結構
關鍵字continue_break_pass
for循環的遍歷_range
字元串,列表內置方法
字元串函數
format字元串格式化
format特殊符號的使用
列表的操作
列表函數
字典,集合內置方法+文件操作
字典的相關函數
集合操作_函數
文件操作
文件加號模式
函數,函數參數 文件相關函數
函數
形參實參
默認形參_關鍵字形參
收集參數
命名關鍵字參數
全局/局部變數,閉包 return返回值
函數名的使用
局部變數_全局變數
函數的嵌套LEGB
關鍵字nonlocal
閉包函數
遞歸,匿名函數
locals和globals
閉包特點意義
遞歸含義
斐波那契_尾遞歸
匿名函數lambda
迭代器,高階函數 迭代器
高階函數_map
高階函數_rece
高階函數_sorted
高階函數_filter
推導式 列表推導式
推導式題
集合_字典推導式
生成器表達式
生成器函數
內置方法,linux基本命令 內置函數
可滑動序列
面試題演練
linux安裝
linux基本命令
python模塊 序列化模塊
數學模塊
隨機模塊
time模塊
python模塊 os模塊
os_shutil
os.path模塊
計算文件夾大小
zipfile
tarfile
導入模塊包,oop面向對象認知
import_from絕對導入
import_from相對導入(單入口)
oop面向對象
類的封裝性
oop之封裝,繼承 類的相關操作
對象和類的刪除操作
單繼承
多繼承
菱形繼承
oop之多態,魔術方法 多態
魔術方法__new__
單態模式
析構方法__del__
oop之魔術方法,異常處理 魔術方法__call__
魔術方法__str__repr__
魔術方法__bool_add_len__
了解異常
異常處理語法
主動拋出異常
裝飾器
裝飾器
靜態綁定方法
property
正則表達式 單個字元匹配
多個字元匹配
匹配分組
命名分組
正則函數
正則計算器小程序
認識網路 bs_cs流程
傳輸數據流程
交換機和區域網的網路通訊
arp協議
認識tcp/udp協議
tcp基本語法
tcp循環發消息
udp基本語法
udp循環發消息
黏包
基於tcp協議下的應用 socketserver並發
文件校驗
伺服器合法性校驗
tcp登錄
並發編程之進程 進程
join
守護進程
lock鎖
Semaphore
生產者消費者模型 Event事件
進程隊列Queue
生產者和消費者模型
JoinableQueue
Manager.py
並發編程之線程
.線程
用類定義線程
守護線程
lock保證線程數據安全
信號量_Semaphore
死鎖,互斥鎖,遞歸鎖
線程池,進程池,協成的使用
事件Event
線程隊列
進程池和線程池
回調函數
協程
協程的爬蟲案例
mysql安裝(linux+windows+xshell+navicat)
掌握資料庫mysql基本操作
mysql登錄,服務啟動
創建賬戶,用戶授權
資料庫,數據表,數據的增刪改查
認識常用數據類型
資料庫的存儲引擎和約束
欄位約束
約束的刪減
存儲引擎區別用法
數據表之間的關系
查詢數據表
單表查詢
多表聯查
子查詢
帶EXISTS關鍵字的子查詢
python操作mysql
python連接mysql的事務處理
sql注入
python連接mysql增刪改查
mysql數據恢復
HTML/CSS html文檔介紹,html標簽,body標簽,head標簽介紹,head標簽中的meta標簽和link標簽和title標簽介紹,body中的標簽分類,基礎標簽,img、a、列表、表格、input、label、select等標簽,作業講解,form標簽介紹和示例講解,css介紹,引入,css選擇器,背景設置,高度寬度,字體效果,邊框、盒子模型、display屬性、float屬性等
CSS 偽類選擇器,文字裝飾、a標簽補充、定位、權重、小米商城導航欄講解,原型頭像示例講解
JS基礎/BOM和DOM操作 小米商城作業,js介紹和js引入,js數據類型、流程式控制制、函數等操作,js中的JSON,BOM對象的彈框、location對象、定時器、直接查找選擇器、間接查找選擇器、值操作、類值操作、樣式操作、button按鈕補充、事件和綁定事件的兩種方式,常用事件練習
jQuery/Bootstrap 作業講解,jquery介紹,引入、選擇器、篩選器、值操作、文檔操作、刪除和清空標簽、邏輯運算符、克隆、事件冒泡和事件委託、綁定事件的方式,作業講解和模態對話框示例,input事件和頁面載入事件補充、bootstrap介紹和引入、全局css樣式、組件和常用插件
自定義web框架 作業講解、web框架介紹、自定義web框架實現、動態頁面、返回不同的html頁面、函數版、多線程版、返回靜態文件版,wsgiref版等web框架通過socket來實現,還有jinja2的簡單使用
django下載安裝和URL路由系統 django介紹、MTV和MVC框架介紹、常用指令、目錄結構、pycharm創建django項目、request的常用屬性介紹、登錄示例、url路由系統介紹、有名分組和無名分組,
視圖/模板 request對象的常用方法和屬性、響應方法介紹和使用,CBV和FBV、CBV和FBV加裝飾器,CBV源碼講解,模板渲染系統介紹,語法、簡單示例、內置過濾器、for循環標簽、if標簽、with標簽、自定義過濾器和標簽、模板繼承等
Dajngo的ORM(1) orm介紹,資料庫同步指令使用和流程分析、配置連接mysql模型類中的屬性介紹和常用參數說明,創建表和數據、增加的兩種方法、刪除、更新的兩種方法、查詢的13個api介面
Dajngo的ORM(2) 單表圖書管理系統展示和添加作業講解、choices屬性、auto_now_add和auto_now參數講解、url別名和反向解析,基於雙下劃線的模糊查詢,多表結構介紹,圖書管理系統編輯和刪除作業講解、多表關系模型類創建和欄位說明和參數介紹、多表數據的添加操作,多表的刪除和修改、基於對象的跨表查詢、雙下劃線跨表查詢、查看原生sql語句的方法、聚合查詢、分組查詢、F查詢、Q查詢等
Ajax與Django/ 中間件 ajax的介紹和簡單示例,ajax登錄示例、列表數據展示示例,ajax操作cookie的補充、中間件介紹、自定義中間件的方法、5個中間件方法的介紹和使用、基於中間件的session登錄認證
cookie、session以及用戶認證組件 cookie介紹,cookie的流程解析,django操作cookie和其他參數介紹、session的說明、django的session操作等,多表圖書管理系統作業講解
vue初識、es6基本語法、指令系統 let、const、v-if、v-for、v-html、v-text、v-model、v-show、生命周期鉤子函數、
組件化開發、組件傳值、axios簡單使用 組件化開發、組件傳值、axios簡單使用、vue-router使用、vue-cli安裝
項目初始化/首頁 項目介紹、創建、初始化、element-ui的使用,單文件組件的使用和axios在單文件中的使用和配置、vue-cli的介紹和使用、路飛項目頂部導航欄頁面效果搭建,輪播圖組件的使用和調整、購物車頁面搭建和課程詳情頁面搭建,vue-video-player視頻播放插件
drf組件 序列化器、drf簡單示例、restful規范、反序列化的校驗機制
drf組件 apiview、request和response對象、modelserializer、序列化器保存數據、read_only和write_only的參數
drf組件 viewset、drf路由功能、viewset視圖基類的使用、視圖子類、通用視圖類genericapiview/排序、django-filter過濾器、頻率組件、分頁組件、介面文檔、異常處理、xadmin的安裝和使用、認證組件和許可權組件
git、消息隊列 git企業中的使用模式,rabbimq消息隊列的應用
rpc通信,grpc組件 rpc的概念以及通信模式,最火的grpc組件使用
輕量級Flask框架 Werkzeug服務介紹、Flask框架介紹
路由系統、自定義路由擴展
Cookie、Session、Http請求和響應
藍圖、消息閃現、中間件
Flask常用擴展、WTForms、使用SQLAchemy ORM
Admin、Restful、websocket原理、magic string, payload len,masking key
請求和上下文、多app應用、離線腳本、自定義擴展
服務端項目搭建,項目配置(session、資料庫、日誌相關),項目初始化
jsonrpc模塊基本配置和使用,客戶端展示首頁及登錄注冊葉綿,APICloud頁面控制管理
python進階 並發、同步、非同步、鎖,線進程概念以及協程實現原理
mysql進階課 基礎知識梳理、索引、執行計劃
mysql進階課 存儲引擎、日誌管理、備份恢復、主從賦值、優化
redis,mongodb 事務和發布訂閱、RDB和AOF持久化、緩存擊穿、緩存雪崩等原理介紹、 用戶管理和復制集(RS)總結、sharding cluster 分片集群的搭建、分片使用和相關策略等
演算法與設計模式 鏈表、二叉樹、常見演算法、二分查找、插入排序、希爾排序、快排、堆排序、哈希查找
演算法與設計模式 設計模式,單例模式、工廠模式、策略模式、觀察者模式
演算法與設計模式 leetcode經典演算法解析
知識體系差不多就這么多了,再就是項目部分,具體項目要看需求了,學會了釣魚的方法,不怕釣不到魚哦,無論在哪個行業做什麼樣的項目都沒問題呢!
我自己也搜集了一些經典的資料,要是想要加我網路網盤:艾美電商,我發給你!
❺ Python爬蟲(七)數據處理方法之JSON
JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation),是輕量級的文本數據交換格式,且具有自我描述性,更易理解。
JSON看起來像python類型(列表,字典)的字元串。
在之前的文章中,我們說到了怎麼用response的方法,獲取到網頁正確解碼後的字元串。如果還有不懂的,可以先閱讀 Python爬蟲(三)Requests庫 。接下來以有道翻譯為例子,說說怎麼通過網頁解碼後的字元串,提取到翻譯結果。
再結合上述有道翻譯的例子,得到字典類型的返回結果,並提取出來翻譯結果。
將上述例子的dict_json換成str字元串,再寫入文本中。
執行完上述的程序,會得到一個fanyi.txt的文件,其結果如下:{"type": "ZH_CN2EN", "errorCode": 0, "elapsedTime": 1, "translateResult": [[{"src": "\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528python", "tgt": "Life is too short, I use python"}]]}。這樣子的一份文檔,中文部分顯示的是二進制,且格式非常不利於閱讀,這並不是我們想要的結果。好在json.mps()為我們提供的兩個方法,以幫助我們更好閱讀文檔。
1.ensure_ascii,能夠讓中文顯示成中文;
2.indent,能夠讓下一行在第一行的基礎上空格。
其用法如下: