㈠ 後端編程Python3-資料庫編程
對大多數軟體開發者而言,術語資料庫通常是指RDBMS(關系資料庫管理系統)慶敗派, 這些系統使用表格(類似於電子表格的網格),其中行表示記錄,列表示記錄的欄位。表格及其中存放的數據是使用SQL (結構化査詢語言)編寫的語句來創建並操縱的。Python提供了用於操縱SQL資料庫的API(應用程序介面),通常與作為標準的SQLite 3資料庫一起發布。
另一種資料庫是DBM (資料庫管理器),其中存放任意數量的鍵-值項。Python 的標准庫提供了幾種DBM的介面,包括某些特定於UNIX平台的。DBM的工作方式 與Python中的字典類似,區別在於DBM通常存放於磁碟上而不是內存中,並且其鍵與值總是bytes對象,並可能受到長度限制。本章第一節中講解的shelve模塊提供了方便的DBM介面,允許我們使用字元串作為鍵,使用任意(picklable)對象作為值。
如果可用的 DBM 與 SQLite 資料庫不夠充分,Python Package Index, pypi.python.org/pypi中提供了大量資料庫相關的包,包括bsddb DBM ("Berkeley DB"),對象-關系映射器,比如SQLAlchemy (www.sqlalchemy.org),以及流行的客戶端/伺服器數據的介面,比如 DB2、Informix、Ingres、MySQL、ODBC 以及 PostgreSQL。
本章中,我們將實現某程序的兩個版本,該程序用於維護一個DVD列表,並追蹤每個DVD的標題、發行年份、時間長度以及發行者。該程序的第一版使用DBM (通過shelve模塊)存放其數據,第二版則使用SQLite資料庫。兩個程序都可以載入與保存簡單的XML格式,這使得從某個程序導出DVD數據並將其導入到其他程序成為可能。與DBM版相比,基於SQL的程序提供了更多一些的功能,並且其數據設計也稍干凈一些。
12.1 DBM資料庫
shelve模塊為DBM提供了一個wrapper,藉助於此,我們在與DBM交互時,可以將其看做一個字典,這里是假定我們只使用字元串鍵與picklable值,實際處理時, shelve模塊會將鍵與值轉換為bytes對象(或者反過來)。
由於shelve模塊使用的是底層的DBM,因此,如果其他計算機上沒有同樣的DBM,那麼在某台計算機上枯森保存的DBM文件在其他機器上無法讀取是可能的。為解決這一問題,常見的解決方案是對那些必須在機器之間可傳輸的文件提供XML導入與導出功能,這也是我們在本節的DVD程序dvds-dbm.py中所做的。
對鍵,我們使用DVD的標題;對值,則使用元組,其中存放發行者、發行年份以及時間。藉助於shelve模塊,我們不需要進行任何數據轉換,並可以把DBM對象當做一個字典進行處理。
程序在結構上類似於我們前面看到的那種菜單驅動型的程序,因此,這里主要展示的是與DBM程序設計相關的那部分。下面給出的是程序main()函數中的一部分, 忽略了其中菜單處理的部分代碼。
db = None
try:
db = shelve.open(filename, protocol=pickle.HIGHEST_PROTOCOL)
finally:
if db is not None:
db.dose()
這里我們已打開(如果不存在就創建)指定的DBM文件,以便於對其進行讀寫操作。每一項譽賀的值使用指定的pickle協議保存為一個pickle,現有的項可以被讀取, 即便是使用更底層的協議保存的,因為Python可以計算出用於讀取pickle的正確協議。最後,DBM被關閉——其作用是清除DBM的內部緩存,並確保磁碟文件可以反映出已作的任何改變,此外,文件也需要關閉。
該程序提供了用於添加、編輯、列出、移除、導入、導出DVD數據的相應選項。除添加外,我們將忽略大部分用戶介面代碼,同樣是因為已經在其他上下文中進行了展示。
def add_dvd(db):
title = Console.get_string("Title", "title")
if not title:
return
director = Console.get_string("Director", "director")
if not director:
return
year = Console.get_integer("Year", "year",minimum=1896,
maximum=datetime,date.today().year)
ration = Console.get_integer("Duration (minutes)", "minutes「, minimum=0, maximum=60*48)
db[title] = (director, year, ration)
db.sync()
像程序菜單調用的所有函數一樣,這一函數也以DBM對象(db)作為其唯一參數。該函數的大部分工作都是獲取DVD的詳細資料,在倒數第二行,我們將鍵-值項存儲在DBM文件中,DVD的標題作為鍵,發行者、年份以及時間(由shelve模塊pickled在一起)作為值。
為與Python通常的一致性同步,DBM提供了與字典一樣的API,因此,除了 shelve.open() 函數(前面已展示)與shelve.Shelf.sync()方法(該方法用於清除shelve的內部緩存,並對磁碟上文件的數據與所做的改變進行同步——這里就是添加一個新項),我們不需要學習任何新語法。
def edit_dvd(db):
old_title = find_dvd(db, "edit")
if old_title is None:
return
title = Console.get.string("Title", "title", old_title)
if not title:
return
director, year, ration = db[old_title]
...
db[title]= (director, year, ration)
if title != old_title:
del db[old_title]
db.sync()
為對某個DVD進行編輯,用戶必須首先選擇要操作的DVD,也就是獲取DVD 的標題,因為標題用作鍵,值則用於存放其他相關數據。由於必要的功能在其他場合 (比如移除DVD)也需要使用,因此我們將其實現在一個單獨的find_dvd()函數中,稍後將査看該函數。如果找到了該DVD,我們就獲取用戶所做的改變,並使用現有值作為默認值,以便提高交互的速度。(對於這一函數,我們忽略了大部分用戶介面代碼, 因為其與添加DVD時幾乎是相同的。)最後,我們保存數據,就像添加時所做的一樣。如果標題未作改變,就重寫相關聯的值;如果標題已改變,就創建一個新的鍵-值對, 並且需要刪除原始項。
def find_dvd(db, message):
message = "(Start of) title to " + message
while True:
matches =[]
start = Console.get_string(message, "title")
if not start:
return None
for title in db:
if title.lower().startswith(start.lower()):
matches.append(title)
if len(matches) == 0:
print("There are no dvds starting with", start)
continue
elif len(matches) == 1:
return matches[0]
elif len(matches) > DISPLAY_LIMIT:
print("Too many dvds start with {0}; try entering more of the title".format(start)
continue
else:
matches = sorted(matches, key=str.lower)
for i, match in enumerate(matches):
print("{0}: {1}".format(i+1, match))
which = Console.get_integer("Number (or 0 to cancel)",
"number", minimum=1, maximum=len(matches))
return matches[which - 1] if which != 0 else None
為盡可能快而容易地發現某個DVD,我們需要用戶只輸入其標題的一個或頭幾個字元。在具備了標題的起始字元後,我們在DBM中迭代並創建一個匹配列表。如果只有一個匹配項,就返回該項;如果有幾個匹配項(但少於DISPLAY_LIMIT, 一個在程序中其他地方設置的整數),就以大小寫不敏感的順序展示所有這些匹配項,並為每一項設置一個編號,以便用戶可以只輸入編號就可以選擇某個標題。(Console.get_integer()函數可以接受0,即便最小值大於0,以便0可以用作一個刪除值。通過使用參數allow_zero=False, 可以禁止這種行為。我們不能使用Enter鍵,也就是說,沒有什麼意味著取消,因為什麼也不輸入意味著接受默認值。)
def list_dvds(db):
start =」"
if len(db)> DISPLAY.LIMIT:
start = Console.get_string(「List those starting with [Enter=all]」, "start」)
print()
for title in sorted(db, key=str.lower):
if not start or title.Iower().startswith(start.lower()):
director, year, ration = db[title]
print("{title} ({year}) {ration} minute{0}, by "
"{director}".format(Util.s(ration),**locals()))
列出所有DVD (或者那些標題以某個子字元串引導)就是對DBM的所有項進行迭代。
Util.s()函數就是簡單的s = lambda x: "" if x == 1 else "s",因此,如果時間長度不是1分鍾,就返回"s"。
def remove_dvd(db):
title = find_dvd(db, "remove")
if title is None:
return
ans = Console.get_bool("Remove {0}?".format(title), "no")
if ans:
del db[title]
db.sync()
要移除一個DVD,首先需要找到用戶要移除的DVD,並請求確認,獲取後從DBM中刪除該項即可。
到這里,我們展示了如何使用shelve模塊打開(或創建)一個DBM文件,以及如何向其中添加項、編輯項、對其項進行迭代以及移除某個項。
遺憾的是,在我們的數據設計中存在一個瑕疵。發行者名稱是重復的,這很容易導致不一致性,比如,發行者Danny DeVito可能被輸入為"Danny De Vito",用於 一個電影;也可以輸入為「Danny deVito",用於另一個。為解決這一問題,可以使用兩個DBM文件,主DVD文件使用標題鍵與(年份,時間長度,發行者ID)值; 發行者文件使用發行者ID (整數)鍵與發行者名稱值。下一節展示的SQL資料庫 版程序將避免這一瑕疵,這是通過使用兩個表格實現的,一個用於DVD,另一個用於發行者。
12.2 SQL資料庫
大多數流行的SQL資料庫的介面在第三方模塊中是可用的,Python帶有sqlite3 模塊(以及SQLite 3資料庫),因此,在Python中,可以直接開始資料庫程序設計。SQLite是一個輕量級的SQL資料庫,缺少很多諸如PostgreSQL這種資料庫的功能, 但非常便於構造原型系統,並且在很多情況下也是夠用的。
為使後台資料庫之間的切換盡可能容易,PEP 249 (Python Database API Specification v2.0)提供了稱為DB-API 2.0的API規范。資料庫介面應該遵循這一規范,比如sqlite3模塊就遵循這一規范,但不是所有第三方模塊都遵循。API規范中指定了兩種主要的對象,即連接對象與游標對象。表12-1與表12-2中分別列出了這兩種對象必須支持的API。在sqlite3模塊中,除DB-API 2.0規范必需的之外,其連接對象與游標對象都提供了很多附加的屬性與方法。
DVD程序的SQL版本為dvds.sql.py,該程序將發行者與DVD數據分開存儲,以 避免重復,並提供一個新菜單,以供用戶列出發行者。該程序使用的兩個表格在圖12-1
def connect(filename):
create= not os.path.exists(filename)
db = sqlite3.connect(filename)
if create:
cursor = db.cursor()
cursor.execute("CREATE TABLE directors ("
"id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
"name TEXT UNIQUE NOT NULL)")
cursor.execute("CREATE TABLE dvds ("
"id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "
"title TEXT NOT NULL, "
"year INTEGER NOT NULL,"
"ration INTEGER NOT NULL, "
"director_id INTEGER NOT NULL, 」
"FOREIGN KEY (director_id) REFERENCES directors)")
db.commit()
return db
sqlite3.connect()函數會返回一個資料庫對象,並打開其指定的資料庫文件。如果該文件不存在,就創建一個空的資料庫文件。鑒於此,在調用sqlite3.connect()之前,我們要注意資料庫是否是准備從頭開始創建,如果是,就必須創建該程序要使用的表格。所有査詢都是通過一個資料庫游標完成的,可以從資料庫對象的cursor()方法獲取。
注意,兩個表格都是使用一個ID欄位創建的,ID欄位有一個AUTOINCREMENT 約束——這意味著SQLite會自動為ID欄位賦予唯一性的數值,因此,在插入新記錄時,我們可以將這些欄位留給SQLite處理。
SQLite支持有限的數據類型——實際上就是布爾型、數值型與字元串——但使用數據'『適配器」可以對其進行擴展,或者是擴展到預定義的數據類型(比如那些用於日期與datetimes的類型),或者是用於表示任意數據類型的自定義類型。DVD程序並不需要這一功能,如果需要,sqlite3模塊的文檔提供了很多詳細解釋。我們使用的外部鍵語法可能與用於其他資料庫的語法不同,並且在任何情況下,只是記錄我們的意圖,因為SQLite不像很多其他資料庫那樣需要強制關系完整性,sqlite3另一點與眾不同的地方在於其默認行為是支持隱式的事務處理,因此,沒有提供顯式的「開始事務」 方法。
def add_dvd(db):
title = Console.get_string("Title", "title")
if not title:
return
director = Console.get_string("Director", "director")
if not director:
return
year = Console.get_integer("Year", "year」, minimum=1896,
maximum=datetime.date.today().year)
ration = Console.get_integer("Duration (minutes)", "minutes",
minimum=0,maximum=60*48)
director_id = get_and_set_director(db, director)
cursor = db.cursor()
cursor.execute("INSERT INTO dvds 」
"(title, year, ration, director_id)"
"VALUES (?, ?, ?, ?)",
(title, year, ration, director_id))
db.commit()
這一函數的開始代碼與dvds-dbm.py程序中的對應函數一樣,但在完成數據的收集後,與原來的函數有很大的差別。用戶輸入的發行者可能在也可能不在directors表格中,因此,我們有一個get_and_set_director()函數,在資料庫中尚無某個發行者時, 該函數就將其插入到其中,無論哪種情況都返回就緒的發行者ID,以便在需要的時候插入到dvds表。在所有數據都可用後,我們執行一條SQL INSERT語句。我們不需要指定記錄ID,因為SQLite會自動為我們提供。
在査詢中,我們使用問號(?)作為佔位符,每個?都由包含SQL語句的字元串後面的序列中的值替代。命名的佔位符也可以使用,後面在編輯記錄時我們將看到。盡管避免使用佔位符(而只是簡單地使用嵌入到其中的數據來格式化SQL字元串)也是可能的,我們建議總是使用佔位符,並將數據項正確編碼與轉義的工作留給資料庫模塊來完成。使用佔位符的另一個好處是可以提高安全性,因為這可以防止任意的SQL 被惡意地插入到一個査詢中。
def get_and_set_director(db, director):
director_id = get_director_id(db, director)
if directorjd is not None:
return director_id
cursor = db.cursor()
cursor.execute("lNSERT INTO directors (name) VALUES (?)」,(director,))
db.commit()
return get_director_id(db, director)
這一函數返回給定發行者的ID,並在必要的時候插入新的發行者記錄。如果某個記錄被插入,我們首先嘗試使用get_director_id()函數取回其ID。
def get_director_id(db, director):
cursor = db.cursor()
cursor.execute("SELECT id FROM directors WHERE name=?",(director,))
fields = cursor.fetchone()
return fields[0] if fields is not None else None
get_director_id()函數返回給定發行者的ID,如果資料庫中沒有指定的發行者,就返回None。我們使用fetchone()方法,因為或者有一個匹配的記錄,或者沒有。(我們知道,不會有重復的發行者,因為directors表格的名稱欄位有一個UNIQUE約束,在任何情況下,在添加一個新的發行者之前,我們總是先檢査其是否存在。)這種取回方法總是返回一個欄位序列(如果沒有更多的記錄,就返回None)。即便如此,這里我們只是請求返回一個單獨的欄位。
def edit_dvd(db):
title, identity = find_dvd(db, "edit")
if title is None:
return
title = Console.get_string("Title","title", title)
if not title:
return
cursor = db.cursor()
cursor.execute("SELECT dvds.year, dvds.ration, directors.name"
「FROM dvds, directors "
"WHERE dvds.director_id = directors.id AND "
"dvds.id=:id", dict(id=identity))
year, ration, director = cursor.fetchone()
director = Console.get_string("Director", "director", director)
if not director:
return
year = Console,get_integer("Year","year", year, 1896,datetime.date.today().year)
ration = Console.get_integer("Duration (minutes)", "minutes",
ration, minimum=0, maximum=60*48)
director_id = get_and_set_director(db, director)
cursor.execute("UPDATE dvds SET title=:title, year=:year,"
"ration=:ration, director_id=:directorjd "
"WHERE id=:identity", locals())
db.commit()
要編輯DVD記錄,我們必須首先找到用戶需要操縱的記錄。如果找到了某個記錄,我們就給用戶修改其標題的機會,之後取回該記錄的其他欄位,以便將現有值作為默認值,將用戶的輸入工作最小化,用戶只需要按Enter鍵就可以接受默認值。這里,我們使用了命名的佔位符(形式為:name),並且必須使用映射來提供相應的值。對SELECT語句,我們使用一個新創建的字典;對UPDATE語句,我們使用的是由 locals()返回的字典。
我們可以同時為這兩個語句都使用新字典,這種情況下,對UPDATE語句,我們可以傳遞 dict(title=title, year=year, ration=ration, director_id=director_id, id=identity)),而非 locals()。
在具備所有欄位並且用戶已經輸入了需要做的改變之後,我們取回相應的發行者ID (如果必要就插入新的發行者記錄),之後使用新數據對資料庫進行更新。我們採用了一種簡化的方法,對記錄的所有欄位進行更新,而不僅僅是那些做了修改的欄位。
在使用DBM文件時,DVD標題被用作鍵,因此,如果標題進行了修改,我們就需要創建一個新的鍵-值項,並刪除原始項。不過,這里每個DVD記錄都有一個唯一性的ID,該ID是記錄初次插入時創建的,因此,我們只需要改變任何其他欄位的值, 而不需要其他操作。
def find_dvd(db, message):
message = "(Start of) title to " + message
cursor = db.cursor()
while True: .
start = Console.get_stnng(message, "title")
if not start:
return (None, None)
cursor.execute("SELECT title, id FROM dvds "
"WHERE title LIKE ? ORDER BY title」,
(start +"%",))
records = cursor.fetchall()
if len(records) == 0:
print("There are no dvds starting with", start)
continue
elif len(records) == 1:
return records[0]
elif len(records) > DISPLAY_LIMIT:
print("Too many dvds ({0}) start with {1}; try entering "
"more of the title".format(len(records),start))
continue
else:
for i, record in enumerate(records):
print("{0}:{1}".format(i + 1, record[0]))
which = Console.get_integer("Number (or 0 to cancel)",
"number", minimum=1, maximum=len(records))
return records[which -1] if which != 0 else (None, None)
這一函數的功能與dvdsdbm.py程序中的find_dvd()函數相同,並返回一個二元組 (DVD標題,DVD ID)或(None, None),具體依賴於是否找到了某個記錄。這里並不需要在所有數據上進行迭代,而是使用SQL通配符(%),因此只取回相關的記錄。
由於我們希望匹配的記錄數較小,因此我們一次性將其都取回到序列的序列中。如果有不止一個匹配的記錄,但數量上又少到可以顯示,我們就列印記錄,並將每條記錄附帶一個數字編號,以便用戶可以選擇需要的記錄,其方式與在dvds-dbm.py程序中所做的類似:
def list_dvds(db):
cursor = db.cursor()
sql = ("SELECT dvds.title, dvds.year, dvds.ration, "
"directors.name FROM dvds, directors "
"WHERE dvds.director_id = directors.id")
start = None
if dvd_count(db) > DISPLAY_LIMIT:
start = Console.get_string("List those starting with [Enter=all]", "start")
sql += " AND dvds.title LIKE ?"
sql += 」 ORDER BY dvds.title"
print()
if start is None:
cursor.execute(sql)
else:
cursor.execute(sql, (start +"%",))
for record in cursor:
print("{0[0]} ({0[1]}) {0[2]} minutes, by {0[3]}".format(record))
要列出每個DVD的詳細資料,我們執行一個SELECT査詢。該査詢連接兩個表,如果記錄(由dvd_count()函數返回)數量超過了顯示限制值,就將第2個元素添加到WHERE 分支,之後執行該査詢,並在結果上進行迭代。每個記錄都是一個序列,其欄位是與 SELECT査詢相匹配的。
def dvd_count(db):
cursor = db.cursor()
cursor.execute("SELECT COUNT(*) FROM dvds")
return cursor.fetchone()[0]
我們將這幾行代碼放置在一個單獨的函數中,因為我們在幾個不同的函數中都需要使用這幾行代碼。
我們忽略了 list_directors()函數的代碼,因為該函數在結構上與list_dvds()函數非常類似,只不過更簡單一些,因為本函數只列出一個欄位(name)。
def remove_dvd(db):
title, identity = find_dvd(db, "remove")
if title is None:
return
ans = Console.get_bool("Remove {0}?".format(title), "no")
if ans:
cursor = db.cursor()
cursor.execute("DELETE FROM dvds WHERE id=?", (identity,))
db.commit()
在用戶需要刪除一個記錄時,將調用本函數,並且本函數與dvds-dbm.py程序中 相應的函數是非常類似的。
到此,我們完全查閱了 dvds-sql.py程序,並且了解了如何創建資料庫表格、選取 記錄、在選定的記錄上進行迭代以及插入、更新與刪除記錄。使用execute()方法,我們可以執行底層資料庫所支持的任意SQL語句。
SQLite提供了比我們這里使用的多得多的功能,包括自動提交模式(以及任意其他類型的事務控制),以及創建可以在SQL查詢內執行的函數的能力。提供一個工廠函數並用於控制對每個取回的記錄返回什麼(比如,一個字典或自定義類型,而不是欄位序列)也是可能的。此外,通過傳遞「:memory:」作為文件名,創建內存中的SQLite 資料庫也是可能的。
以上內容部分摘自視頻課程05後端編程Python22 資料庫編程,更多實操示例請參照視頻講解。跟著張員外講編程,學習更輕松,不花錢還能學習真本領。
㈡ java後端需要學什麼
java後端開發需要學JavaSE、資料庫、JDBC、Java Web、框架等。比如JavaSE方面主要學習的內容有基本語法、數據類型、面向對象、常用API、線程與並發、網路編程等等。
㈢ 前端輸入框輸入int類型後段接收到的是什麼類型
前端vue怎麼傳遞int類型的數據給後台?
就算是把數據轉換了,到後台還是string類型
js並沒有int類型的數據,如果後台定義的是要接受int類型的數據,那就直接傳遞一個整數就可以了,也就是直接傳遞number類型的整數就好了
前端vue怎麼傳遞int類型的數據給後台?
就算是把數據轉換了,到後台還是string類型。
㈣ 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經典演算法解析
知識體系差不多就這么多了,再就是項目部分,具體項目要看需求了,學會了釣魚的方法,不怕釣不到魚哦,無論在哪個行業做什麼樣的項目都沒問題呢!
我自己也搜集了一些經典的資料,要是想要加我網路網盤:艾美電商,我發給你!