django網站源碼
1. 如何開始使用PyCharm,並擁有一個高效的python IDE
初步使用
當您第一次啟動PyCharm的時候,他會問你要使用的鍵盤布局和主題。我不喜歡它的Emacs鍵盤映射,所以我用的是默認的Mac OS X鍵盤映射並且自定義了我想要的快捷方式:
如果這是你第一次使用PyCharm,並沒有什麼配置可以導入的。你可能會想在歡迎屏幕中點擊「配置」,設置一些基本的配置:
我喜歡顯示出行號和方法分隔符(Editor→Appearance→Show method separators, Show line numbers):
另外,我喜歡Solarized主題。我遵循指示安裝了它,並選擇它作為編輯器的默認主題→顏色和字體。 淺色版的Solarized IntelliJ有一些奇怪的顏色選擇(例如,它採用灰色為默認的文本,而不是更清晰的黑色),所以我在編輯器上進行了修改→Colors & Fonts→General。我的建議是不要害怕修改顏色為你自己喜歡的。你可以導出你的配置,以防你需要重新安裝PyCharm。
相比於別的一些IDE,我覺得PyCharm在視覺上的效果上非常干凈,如果你想要一個更簡潔的用戶界面,您可以隱藏工具欄,工具按鈕,導航欄和狀態欄(在視圖菜單上):
Virtualenv和Python解釋器
您可以創建新的項目文件→File→New Project or open an existing project withFile→Open Directory。 PyCharm支持多種類型的Python項目,如Django,Flask等等。在這里,我將創建一個簡單的項目,以測試pyquery庫(我會選擇「Empty project」)。
你需要告訴PyCharm你想用哪個Python解釋器,因為它可以使用不同的解釋器對於不同的項目。它將利用這些信息來索引的所有可用的庫。一個好的做法是對於每個項目建立一個virtualenv。您可以使用一個已經存在的virtualenv或從PyCharm創建一個新的(Settings→Project Interpreter→Python Interpreters)。
對於這個項目,我將創建一個新的virtualenv並使其用於所有的項目:
您可以快速搜索,閱讀說明,並從PyCharm安裝軟體包。沒有什麼是你在在終端上不能做的,但它能夠使你無需離開IDE,更加方便地夠搜索包。
一些軟體包可能需要安裝一段時間,特別是如果他們需要進行編譯。 PyCharm運行安裝過程是在後台,你可以通過單擊狀態欄看到正在發生的事情:
正如我們所看到的,它不僅安裝pyquery報,所依賴的包,如lxml也一並安裝(正如我們所期望的):
快捷鍵
PyCharm是沒有Vim的,但你也可以只靠鍵盤做很多事情。您可以將快捷方式設置到幾十個(如果不是數百個)快捷動作在Settings→Keymap。我修改了相當多的默認鍵盤映射,因為我喜歡有像Control-a, Control-e, Control-k,and Control-y那樣的快捷鍵,而這幾個快捷鍵在默認情況下多用於文本框,並沒有設置默認在「Mac OS X」的鍵盤映射。您還可以定義滑鼠快捷鍵。舉例來說,我使用Option-Click來改變快速文檔。如果你是一個Vim的用戶,您可能希望嘗試一下IdeaVim,一個Vim的模擬器插件。我聽說過這個好東西,但我沒有機會去嘗試它。
我用的是Dvorak keyboard layout,但煩人的是,一但用到不對的快捷鍵就會有bug。有人反映了這個問題,French Canadian and German layouts也有這個問題。這意味著我必須重新綁定不少的快捷方式來避免這個問題。
PyCharm使用功能鍵,如F1和F2等很多。正如你可能知道的,在Mac上,頂部的按鍵多作為默認「多媒體」鍵,並通過按下Fn鍵的來生效。我們可以在System Preferences→Keyboard交換這種方式。
我希望能夠控制音量和改變亮度,而不需要使用Fn鍵,但我也喜歡使用功能鍵,而無需觸碰較遠的Fn鍵(我很懶惰,我能說什麼?)。我用Palua在「多媒體」和功能鍵之間切換。你可以用全局鍵切換,也可以配置Palua在使用特定應用程序時,自動切換。我為所有應用程序使用多媒體鍵的(默認值),並配置Palua為Xcode和PyCharm使用功能鍵。
外部編輯器
PyCharm可以啟動任何外部工具,所以我將其配置用Emacs來打開當前文件。當你想要利用你喜歡的編輯器(Emacs,Vim,TextMate等等)做一些快速編輯,這非常有用。
進入Settings→External Tools,確保「Open console」未選中,將路徑插入程序,參數(在這種情況下,我們可以用FilePath來得到完整的文件名)和工作目錄(ProjectFileDir/ FileRelativeDir /)。
你可以把它分配給一個快捷方式:
現在它可以從菜單欄獲得。
運行代碼和REPL
PyCharm有很多方式來讓我們運行代碼。我們可以用古老的print 函數(或聲明語句,這取決於你的Python版本),在REPL導入代碼,發送代碼到控制台,使用調試器,或在終端上使用IPython。
列印輸出
使用列印來顯示值是一個有用的並被廣泛使用的技術,但是如果不小心使用的話,它可能會導致混亂的代碼。
如果該文件已被選中運行,我們可以通過單擊「play」按鈕或Control-R來開始。
如果沒有選擇文件來運行,會從上下文菜單中選擇一個文件,用Control-Option-R或右擊來運行她。 PyCharm會記住你的選擇,下一次你可以繼續使用Control-R。這聽起來很復雜,但它其實非常簡單。檢查手冊,以便了解更多的信息。
控制台和REPL
我最喜歡的方法是在REPL運行代碼。您可以在PyCharm的工具欄中打開一個Python控制台,Tools→Run Python Console(我已經分配到Control-C)。它會使用IPython(如果可用)(我建議你在virtualenv內安裝IPython),並將當前文件的路徑添加到Python的路徑。在控制台上,你可以像往常一樣導入你要來執行的功能。
在控制台中補全功能仍然可用:
我們可以像平時一樣正常使用已經導入的函數,並且可以利用⌘–4輕松切換控制台的可視性。
在控制台執行所選擇的代碼
如果我想運行的代碼是多了幾個單行,並沒有編寫正式的單元測試(例如,可能我玩的是數據)我可以將它保存在一個臨時文件。我們可以選擇我們想要運行的代碼(通常我只需要利用⌘-A選擇整個文件),並選擇從上下文菜單中選擇「Execute Selection in Console」(或者,更好的方式,使用鍵盤快捷鍵)。 [我省略了一些菜單項中的截圖以使文章短一些。
在下面的例子中,標題變數在控制台中可用,因為我們在控制台中選擇整個臨時文件來執行:
宏
如果我們可以在一個操作中發送整個文件到控制台,那就太好了。幸運的是,我們可以記錄一個宏。選擇Select Edit→Macros→Start Macro Recording and performthe operations as before(選擇整個文件,發送到控制台,切換到控制台)。正如你所看到的,我的宏只有四個動作(我按向下箭頭鍵取消選擇):
當您錄制的宏已經在宏菜單,你可以分配給它快捷方式(我使用Control-C Control-E,但由於某些原因PyCharm只顯示兩個快捷方式的一半)。
調試
很多人喜歡使用調試器來檢查數據。即使我喜歡使用REPL,有時調試程序更有效,在檢驗復雜的對象時尤其如此。 PyCharm不允許你在一個空行設置一個斷點,因此,在這短短的例子,我不得不添加一個額外的行(我使用print函數,但我本可以使用pass),因為我想要調試停止在設置的headlines變數後。在真正的代碼中,很少有這個必要。
IPyhton
最後,利用IPython來運行外部終端並使用一些功能,比如%run和自動重載沒有任何不妥。
搜尋命令
這很容易變得不知所措,因為有這么多的命令。如果您在Mac上使用PyCharm,你可以像往常一樣使用Help→Search,或者您可以在任何平台上使用Help→Find Action。它可以讓你搜索任何PyCharm命令,包括不能從菜單中獲得的。 (Emacs的使用者會注意到這有點類似於Emacs的M-X)。這是非常有用和強大的功能,我一直使用它。
代碼補全
代碼補全功能在PyCharm上是一流的。默認情況下PyCharm會在你輸入的時候給出建議:
由於此功能可有點耗電,你可以通過選擇File→Power Save Mode來禁用它。您仍然可以通過Control-Space顯式使用這一功能。
在輸入的時候,您可以通過鍵入一個子串來縮小建議列表:
或者,您可以鍵入CammelCaseClasses或function_names_with_underscores的第一個字母:
如果您鍵入Ctrl-Space一次,PyCharm將嘗試列出最相關的項目:
如果你再次鍵入Control-Space,將列出它所知道的每一個名字。這可能是壓倒性的,但要注意,它列出了沒有導入的文件 bar.py中的函數name_of_mother。
但往往你只是想補全在打開的緩沖區中的一個局部變數的名稱。很久以前可以在Emacs和Vim實現這一功能,二現在也可以在PyCharm上實現。手冊將其稱為Hippie Completion,但實際的命令名稱(即,你會發現在Find Action的那個名字)是「Cyclic Expand Word」,並且在我的測試中,它甚至對文檔字元串有效。
代碼補全可能無法在某些情況下工作,比如當一個庫沒有類型提示。這個StackOverflow頁面建議在PDB中設置斷點並用dir列出所有可能的屬性。一個類似的解決方案是在PyCharm創建斷點,並執行一條表達式——通過在調試工具欄點擊最後一個圖標(或使用適當的鍵盤快捷鍵)。在這種情況下,我計算的表達式是「dir(r)」。
訪問文檔
PyCharm有三種方式可以訪問文檔:快速定義,快速文檔,外部文檔,以及參數信息。您可以從查看菜單或者從各自的快捷方式去訪問它們。
快速定義將顯示整個定義的符號(類,方法,功能等)的(廢話!),當然也包括文檔。如果你只是想快速瀏覽一下的定義,而跳躍到它是很有用的。
快速文檔將顯示符號的文檔和簽名。
最後,外部文檔,以及參數信息是非常簡單的。第一個在默認瀏覽器中打開文檔,第二個給出了一個函數或方法(例如快速查詢關鍵字參數的名稱是很有用)參數信息。
外部文檔工作外適用於Python(當然),PyQt4,PySide,GTK,WX,numpy,SciPy,和kivy,並且您可以為外部文檔添加路徑,在Settings→Python External Documentation中設置。
代碼質量
當你在打字的時候,PyCharm會檢查你的代碼是否符合PEP8。它會讓你知道,你是否有太多的空格或空行等等。如果你願意,你可以配置PyCharm運行pylint作為外部工具。
在源代碼找到自己的方式
當你掌握了它的導航命令時,PyCharm開始變得強大起來。它可以跳轉到類,函數等等。在Mac上你可以利用⌘-B或者⌘-Click跳轉到類,方法,函數,變數的定義,同樣在Windows和Linux上使用 或Ctrl-B或者Ctrl-Click。
導航到類,文件或符號的機制幾乎是一樣的。在你輸入一個字元串的時候,你將看到一個對話框,包括你當前項目以外的項目,同市匹配過濾的結果。轉至導航菜單或使用相應的鍵盤快捷鍵:
這是一個類定義典型的對話框:
你可以輸入名稱的一部分,包括文件擴展名。舉例來說,如果你想打開Django項目的一個JavaScript文件是,但又不記得它的名字,你可以搜索「.js」。
這些功能使我們能夠非常快速地瀏覽源代碼。假設我們正在研究Django的源代碼,我們希望看到的是功能實現的過程。我們不知道它的定義,所以我們去Navigate→Symbo(⌥-⌘-O),輸入「render」,並選擇第一個選項(我們可以看到它在django.shortcuts定義)。如果我們隱藏了導航欄,我們可以使用Navigate→Jump到導航欄(⌘-↑),快速顯示它並查看該文件定位(django→django→shortcuts.py):
有時在去掉你並不感興趣的那部分東西之後,代碼補全的效率會更高。在下面的例子中,我刪除相關的JavaScript的結果,得到了一個更加簡潔的列表:
PyCharm可以讓你折疊塊,如類,方法和函數,但你可以創建自己的可折疊的區域。當涉及到成組的一些東西時,就很有用(類,方法,函數等)。這些模塊可以折疊的話,會使我們能夠專注於代碼的特定區域。你可以通過Navigate→Custom Region或使用相應的鍵盤快捷鍵來顯示列表文件中的所有區域。遺憾的是有沒有辦法在一個工程中列出所有區域。
單元測試
在我們可以運行測試文件之前,我們需要添加一個新的運行/調試配置。我們去Run→Edit Configurations,然後點擊在左上角的加號按鈕。然後,我們選擇「Python tests」,開始測試。在這個例子中,我將使用單元測試:
最後,我們需要添加這些測試的文件夾,並選擇正確的Python解釋器:
現在就像我們運行代碼一樣,我們可以運行我們的測試:通過點擊工具欄或者選擇Run→Run(Control-⌥-R)。這將打開一個對話框,你可以在對話框中選擇你想要運行的代碼(你可以運行別的)。您可以進行所有測試或僅測試游標。
當你運行測試是,PyCharm會記住你最後的選擇,這樣你就可以利用Control-R來重復測試。這非常有用,如果你解決了一個特定的測試情況,並希望多次運行它,但不運行其他測試。你並不需要定位到你想要運行的測試文件;你可以從任意文件中運行測試。您可以通過選擇Navigate→Test(或相應的熱鍵)完成代碼的測試。
處理多個文件
正如你看到的那樣,PyCharm為每一個文件使用一個標簽
要切換到標簽,我們可以使用命令選擇下一個標簽或者選擇上一個標簽。默認快捷鍵是Control-→ 和Control-←,但OS X使用這些按鍵,讓我重新綁定它們至Control-⌘-N
和Control-⌘-P(在終端我使用同樣的快捷方式切換標簽頁)。
一個更直接的方法選定標簽就是使用Navigate→File,或者View→Recent Files(⌘-E)和View→Recently Changed Files(⇧-⌘-E)。最後兩個命令將顯示文件,你可以通過輸入子串來縮小選擇范圍。在下面的例子中,我只需要輸入「⌘-E」,「S」,「ENTER」鍵進入scratch.py文件的標簽:
多窗口
PyCharm支持多窗口,雖然不如Emacs中那麼優秀,但也足夠用了。
在默認情況下沒有已分配的快捷方式來處理分割窗口,所以你必須自己做。這些是我用的快捷鍵:
垂直分割,Control-S
水平分割,Control-H
非剖分,Control-C Control-U
非剖分所有,Control-C Control-A
轉到下一個分離器,Control -C Control -N
轉到上一頁分離器,Control -C Control -P
移動到相對組,Control -C Control –M
再有兩個窗格的情況下拖動標簽比較方便。
2. Django源碼閱讀 (一) 項目的生成與啟動
誠實的說,直到目前為止,我並不欣賞django。在我的認知它並不是多麼精巧的設計。只是由功能堆積起來的"成熟方案"。但每一樣東西的崛起都是時代的選擇。無論你多麼不喜歡,但它被需要。希望有一天,python能有更多更豐富的成熟方案,且不再被詬病性能和可維護性。(屁話結束)
取其精華去其糟粕,django的優點是方便,我們這次源碼閱讀的目的是探究其方便的本質。計劃上本次源碼閱讀不會精細到每一處,而是大體以功能為單位進行解讀。
django-admin startproject HelloWorld 即可生成django項目,命令行是exe格式的。
manage.py 把參數交給命令行解析。
execute_from_command_line() 通過命令行參數,創建一個管理類。然後運行他的 execute() 。
如果設置了reload,將會在啟動前先 check_errors 。
check_errors() 是個閉包,所以上文結尾是 (django.setup)() 。
直接看最後一句 settings.INSTALLED_APPS 。從settings中抓取app
注意,這個settings還不是我們項目中的settings.py。而是一個對象,位於 djangoconf\__init__.py
這是個Settings類的懶載入封裝類,直到 __getattr__ 取值時才開始初始化。然後從Settings類的實例中取值。且會講該值賦值到自己的 __dict__ 上(下次會直接在自己身上找到,因為 __getattr__ 優先順序較低)
為了方便debug,我們直接寫個run.py。不用命令行的方式。
項目下建個run.py,模擬runserver命令
debug抓一下setting_mole
回到 setup() 中的最後一句 apps.populate(settings.INSTALLED_APPS)
開始看 apps.populate()
首先看這段
這些App最後都會封裝成為AppConfig。且會裝載到 self.app_configs 字典中
隨後,分別調用每個appConfig的 import_models() 和 ready() 方法。
App的裝載部分大體如此
為了方便debug我們改寫下最後一句
res的類型是 Command <django.contrib.staticfiles.management.commands.runserver.Command object at 0x00000101ED5163A0>
重點是第二句,讓我們跳到 run_from_argv() 方法,這里對參數進行了若干處理。
用pycharm點這里的handle會進入基類的方法,無法得到正確的走向。實際上子類Commond重寫了這個方法。
這里分為兩種情況,如果是reload重載時,會直接執行 inner_run() ,而項目啟動需要先執行其他邏輯。
django 項目啟動時,實際上會啟動兩次,如果我們在項目入口(manage.py)中設置個print,會發現它會列印兩次。
第一次啟動時, DJANGO_AUTORELOAD_ENV 為None,無法進入啟動邏輯。會進入 restart_with_reloader() 。
在這里會將 DJANGO_AUTORELOAD_ENV 置為True,隨後重啟。
第二次時,可以進入啟動邏輯了。
這里創建了一個django主線程,將 inner_run() 傳入。
隨後本線程通過 reloader.run(django_main_thread) ,創建一個輪詢守護進程。
我們接下來看django的主線程 inner_run() 。
當我們看到wsgi時,django負責的啟動邏輯,就此結束了。接下來的工作交由wsgi伺服器了
這相當於我們之前在fastapi中說到的,將fastapi的app交由asgi伺服器。(asgi也是django提出來的,兩者本質同源)
那麼這個wsgi是從哪來的?讓我們來稍微回溯下
這個settings是一個對象,在之前的操作中已經從 settings.py 配置文件中獲得了自身的屬性。所以我們只需要去 settings.py 配置文件中尋找。
我們來尋找這個 get_wsgi_application() 。
它會再次調用 setup() ,重要的是,返回一個 WSGIHandler 類的實例。
這就是wsgiapp本身。
load_middleware() 為構建中間件堆棧,這也是wsgiapp獲取setting信息的唯一途徑。導入settings.py,生成中間件堆棧。
如果看過我之前那篇fastapi源碼的,應該對中間件堆棧不陌生。
app入口→中間件堆棧→路由→路由節點→endpoint
所以,wsgiapp就此構建完畢,伺服器傳入請求至app入口,即可經過中間件到達路由進行分發。
3. Python 有哪些好的 Web 框架
python的web框架很多
django (大而全,模板,orm都自帶)
flask (pocoo出品,比屬精品,自帶jinja2模板,可以替換)
web.py (這個我沒用過,作者自殺,白瞎了一個高手)
bottle (只有一個文件的框架,需要自己構建整個開發體系)
uliweb (中國人開發的,也很不錯)
Tornado (非同步框架,適合長連接,比如在線聊天之類的)
Python框架雖然說是百花齊放,但仍然有那麼一家是最大的,它就是Django。Django為人所稱道的地方主要有:
①完美的文檔,Django的成功,我覺得很大一部分原因要歸功於Django近乎完美的官方文檔(包括Django book)。
②
全套的解決方案,Django象Rails一樣,提供全套的解決方案(full-stack framework + batteries
included),基本要什麼有什麼(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,開發網
站應手的工具Django基本都給你做好了,因此開發效率是不用說的,出了問題也算好找,不在你的代碼里就在Django的源碼里。
③強大的URL路由配置,Django讓你可以設計出非常優雅的URL,在Django里你基本可以跟醜陋的GET參數說拜拜。
④自助管理後台,admin interface是Django里比較吸引眼球的一項contrib,讓你幾乎不用寫一行代碼就擁有一個完整的後台管理界面。
4. 如何用django開發一個簡易個人Blog-Python
1.網站首頁展示已發布的博客記錄,包括名稱、摘要信息、發布日期、閱讀量及評論數。
2.首頁文章列表可按照分類篩選。
3.點擊標題或閱讀全文鏈接,進入博客閱讀頁面,展示文章標題、內容及評論內容。
博客後台管理部分:(後台套用了一個叫做ACE的後台模板,改造成了django形式的)
1.管理員登錄功能
2.分頁展示文章列表,可查看、編輯、刪除選中文章,並支持批量刪除功能。
3.增加新文章功能,利用網路ueEditor富文本編輯器,支持代碼高亮顯示功能。
4.支持分類的增、刪、改、查功能。
下面是幾張截圖:
首頁文章顯示:
開發環境及軟體版本:
開發是在windows 7,利用sublime text2編輯器。
採用python2.7.3+django1.7.0+mysql
前端採用bootstrap和一些成熟的jquery插件。
開發過程:
1.創建項目及app,規劃項目結構。
2.設計數據模型,即資料庫表及表結構。
3.設計公共展示部分樣式,及後台數據與模板視圖的展示。
4.改造ACE後台模板,添加文章管理、類別管理功能及登錄驗證功能。
5.部署到CentOS6.5,部署方式:nginx+uwsgi+django1.6+mysql