[音樂播放]
EZRA ZIGMOND：嗨，大家好。
謝謝你今天出來。
本次研討會是“的Python Web應用程序與瓶。“
>> 所以，我將所討論 為什麼一點點
您可能需要使用瓶，使 與Python的網絡應用程序，而不是
其他一些框架在那裡，像 Django中，這是最公知的。
副標題是“和 peewee“，這是值得
我們要談談如何 與SQL數據庫交互。
這使得它非常好的。
>> 所以，在這裡只是一個快速綱要 是我想要走了過來。
因此，首先，只有一個幻燈片 這將是快速入門，
這是怎麼得到的一切 設置您的計算機上。
我將要展示 這在我的本地的Mac機，
只是因為這是我做這個 以前，我最舒服，
但這絕對 可能對CD50 IDE。
>> 所以，在那之後，我想 引進什麼樣瓶，
並說服你，為什麼你應該 用它擺在首位。
然後，我給一個快速 例如什麼，你
可在瓶，一個簡單的例子做 你可以在peewee做什麼，
然後我會告訴你一個更 完整的示例應用程序
我放在一起，我們 可以一起走過。
>> 然後最後，在 最後一張幻燈片，我有
你看一些資源 在網上獲取更多信息。
這不是一個完整 教程的如何使用瓶。
我會希望離開 一段時間的問題。
任何人都看在本地，只是 喜歡，喊出來在中間
如果你有任何問題。
>> 因此，快速安裝的東西， 如果你想跟隨，
或者，如果你想獲得這個 在您自己的機器，
我將要使用Python 2.7.10。
瓶做工作， Python 3中，但我喜歡
使用Python 2，因為有 一些Python包
不與3個工作呢。
如果你已經安裝了點子，這 是一個Python包管理器，
我認為，如果你的Python是 大於或等於2.7.9，
您有它已經安裝了，這是 超級容易安裝這些軟件包。
>> 你可以做PIP安裝 瓶，畫中畫安裝peewee，
通常你必須只執行sudo 這樣的權限制定。
而且，如果你使用的是 超級老版本的Python，
我建議您更新的Python， 或使用EasyInstall安裝點子。
那麼，接下來的問題是，什麼是瓶？
我想，首先一 合理的問題我不知道
很長一段時間是，什麼是一個Web應用程序？
因為這是一個詞，我 覺得周圍有很多拋出
我真的不知道。
我認為，最好的 例如一個什麼樣的Web應用程序是，
真的是CS50融資，其中， 它不是真的只是一個網站，
但它的東西，你 排序可以互動。
有用戶帳戶和 各種不同的事情。
那麼，在什麼地方你畫 區別什麼是一個網站線，
什麼是一個Web應用程序，則排序 任意的，但我想這個想法，
它比一個網站更多的東西 這是一個有用的應用程序。
>> 所以，瓶為框架 使得使用Python的網絡應用程序。
並希望，年底 這一點，我會說服你
你實際上可以寫的東西 像CS50財經使用Python，我
像很多比PHP好，個人。
>> 因此，瓶，他們所謂的 microframework，其中，
他們的意思是非常 簡單，但擴展性。
因此，它只有你所需要的， 但如果你想要更多的功能，
它很容易帶給他們進來。
但是，僅僅因為它是一個 microframework，不
意味著它是唯一的小項目。
我這裡有一個鏈接，說 奧巴馬用瓶在2012年
為他的競選 網站，該網站希望，
是值得認可的。
但事實是我 真的很喜歡瓶
的是，它並沒有真正做 任何形式的對你的決定。
正因為我們是 談到網絡應用程序，
我有比較它的Ruby on Rails和Django的，這兩個
是偉大的框架，但 他們都做出假設
你如何想 與數據庫交互，
如何你想展示你的 意見，而且他們肯定
好的方面說。
>> 例如，Ruby on Rails的 有這個活動記錄系統，
這是一個非常好的 的方式與數據進行交互，
但如果你想使用的Ruby on Rails的，你是那種綁成。
但隨著瓶，因為我會 顯示你peewee，
你可以使用任何排序 數據庫的需要，
你可以只拉，在 作為擴展到瓶中。
>> 所以這就是為什麼我真的 像瓶，那就是它
不為你做的假設 基於東西你並不需要真的。
>> 所以，你為什麼要使用瓶？
的優點是，它只是 擁有真正的核心特徵
內置到它，你需要的。
所以，你不必擔心 了解一大堆的東西
你並不真正需要。
您不必擔心 有關關閉功能
你並不真正需要。
>> 而且，正如我所說，它的超 容易的事情擴展添加
你確實需要。
他們中的一些，瓶有 自己對它的支持。
因此，有一種叫做瓶 管理，這反映了管理
面板Django提供， 這給你一個很好的可視化的方式
管理你的網站。
但同樣，如果你 製作簡單的東西，
你也許並不需要一個大管理員 面板上，所以我認為這是超級漂亮。
而缺點是，這 你有更少的功率開箱。
所以，當你第一次打開瓶， 在你的Python程序，
你剛剛從瓶式 進口*，或什麼的，
你沒有完全得到所有的 該功能，你可能希望。
所以，你必須更明確地 列出你想要的功能。
所以這是一個不利因素，但我 認為，建設小網站
喜歡我的應用我要展示 你，這不是一個真正的問題。
而最後一件事是什麼 應該說，這是一個錯字，
是，有欠規範 約定如何使用瓶，
只是因為有沒有那麼多 使用它的專業人
相比於Django的。
所以，如果你是這個樣子， 在Django“我怎麼辦×”，
你可能會發現它。
>> 有良好的設計 圖案可以使用，
但與瓶，它是 樣的走自己的路，
只是因為它是一個 漂亮的小型圖書館。
所以，這些都是 缺點，但我認為
它仍然是一個很好的庫來使用。
>> 那麼就讓我們直接進入瓶中。
這是絕對不會 是一個完整的教程，
但它給你的想法 如何構建物，
所以你感覺很舒服去 關閉並尋找文檔
並找出更多。
>> 所以，讓我開了一個非常 在第一個簡單的例子，
並且告訴你那是什麼 樣子，然後我們會
打破它，多一點點。
>> 因此，這在這裡，讓我得到它運行。
所以，我現在有應用程序的運行我的。
我要打開Safari瀏覽器，和 這是我的本地主機上運行。
所以，我只是打算讓這個更大。
但本地主機：5000
>> 所以，現在，這一切都不會 是，當您訪問的網站，
它打印出“你好瓶，” 這是不是超級有用，
但我認為這是很酷的 在這裡這個小文件，
我們有一個Web服務器上運行 正在打印出來的東西。
所以，讓我們實際上看起來 在用於第二代碼，
並能把它們一點點。
就是尺寸對大家都有好處嗎？
>> 所以，我希望，你是有點 舒適的使用Python。
我假設大家可以看看 在Python和閱讀它。
如果您有任何疑問， 任何事情，我也可以去了這一點。
>> 所以，第一行是，從瓶， 我們導入，瓶用大寫字母“F”
這是排序的所有 你需要的關鍵功能。
當你寫 一個文件，並使用燒瓶，
你將要導入的是， 只是因為有所有主要的事情。
我們做的下一件事，就是我們 調用這個函數瓶，只是
創建一個應用程序對象，而你 總是會想這樣做。
>> 然後，跳躍下至 底部很快，這部分在這裡，
'if_name _ ==“_ main_”'，這是 排序Python的公約。
因此，這只會如果執行 直接運行使用Python這個文件。
然後，我們調用app.run，這將 實際上啟動應用程序去。
>> 所以，這是最主要的結構 你必須在任何瓶的應用，
是你有這樣的 應用=合劑（_NAME_），然後app.run。
>> 因此，兩件事情，我有 在這裡，就是我們所說的路線。
那麼，讓我們來談談 路由多一點點。
我會回去的幻燈片。
>> 所以最根本 概念瓶路由。
而且它的想法，你 在Python分配功能
具體地址 在您的網頁。
所以，當你想 創建一個新的路線，
使用此@ app.route 功能裝飾。
所以，如果你不熟悉 功能裝飾在Python，
它的這個概念， 讓你把一個函數
和別的東西包圍它。
>> 因此，其實，這是什麼裝飾呢， 是，它需要在它下面的功能，
它增加了更多的信息 其實吧，但什麼瓶
沒有做到這一點是不超 至關重要的，但重要的，
是路由之前，則 把這個@ app.route，然後
的路由的地址， 所以斜線是我們
看到我們剛剛打開網頁。
所以這是主頁。
這只是斜線路線。
然後你有這個功能。
的函數的名稱 可以是任何你想要的。
它不必一定 都與路線。
然後，無論 函數的返回，
該函數返回一個字符串。
而該字符串可以 包含HTML或任何東西，
那實際上是什麼將得到 返回給Web瀏覽器為HTML，
它會渲染。
>> 因此，這是相同的代碼 這是從例如
我剛跑了，所以當我們訪問的斜線， 它調用一個Hello World功能，
只是返回一個字符串，你好瓶， 並且被顯示在屏幕上。
>> 因此，有另外一個例子， 這就是，當你訪問/你好，
它打印出您好字，這 實際上應該說，你好世界，
但讓​​我們假裝是故意的。
因此，讓我們拉了起來真快。
>> 所以，如果你去到localhost /你好， 現在將打印別的東西。
所以這是一個如何只是一個簡單的例子 你可以創建兩個不同的路線。
>> 因此，到目前為止，這是不是超級有用， 沒有了一大堆你可以做，
你可以只做的一切，與 具有不同的HTML頁面，
當你訪問一個特定的 網頁它只是加載頁面。
所以，讓我們來看看一些 有用的事情可以做。
所以，有一件事，你可能有 注意到在我把這個例子
起來，是我app.run（調試= TRUE）。
所以，這是什麼 調試的說法呢，是
當你運行你的Web服務器， 當你在你的應用程序，
如果更改一個文件時，它會 自動重新加載服務器。
>> 所以你實際上並不需要 重啟Python中，這是超級有用。
我可以證明。
讓我拉起我的代碼 在它的錯字，
並假裝錯字放在那裡 故意為啟發性的目的。
因此，讓我們加入這個。最
所以現在說的Hello World。
我會保存它。
如果我們拉回來了 終端，你會
說它是重新啟動， 因為它檢測到變化，
所以現在當我們刷新這個頁面， 它會打印出正確的事情。
>> 所以，調試是該超級有用。
此外，如果您有任何 那種崩潰的，所以
讓我做這個應用程序崩潰 有它不會返回一個字符串。
所以，我們只是把它 返回無出於某種原因。
然後，當我訪問這個 頁面，它只會崩潰，
但服務器並不僅僅崩潰，它 實際上給你一個超級有益的回
一切痕跡出了問題。
而什麼是真正好的，就是 在此回溯任何一步，
你可以打開一個互動 外殼在這裡，排序打印出什麼
你想變量來看一看。
>> 所以調試真的 為找出有用
什麼與怎麼回事你 服務器，而不是僅僅看
一些在PHP像500的內部 服務器錯誤，這是超級沒用。
有一點需要注意的，是 如果你把你的應用程序在線
所以它的公開顯示的，你 永遠都不想離開的調試模式，
因為人們實際上可以 使用控制台，我
表現出你來執行任意代碼。
>> 因此，他們可以打印出像任何 暗號你在那裡，
他們可以看看完全 如何你的網站工作。
所以這是非常有用的 進行測試，但總是
一定要拿出來之前， 你在網上發布任何東西。
>> 因此，當你使用的東西 如PHP，有這種想法
你可以通過 網頁之間的信息
通過將信息實際 在URL，它是一個GET請求，
但在瓶，你其實可以 做一些有點像的，
通過具有包含路由 一個變量作為它的一部分。
>> 所以，如果你看看這個 例如在屏幕上這裡，
我們有一個路由的 （'/你好/'），所以，如果你訪問
/你好/的東西，這東西 是要真正得到填充
到name變量。
並注意函數 隨這條路線
必須採取在參數 名字，這樣它實際上
得到傳遞給函數。
>> 然後，一旦你 該函數的內部，
你可以把像 一個普通的Python變量，
因此，然後，它會 打印出你好，和它
使用這個名字將填補 某些字符串格式化。
>> 所以可變份添加至路由， 使用尖括號標記。
而且您還可以選擇使用 什麼叫做轉換器。
所以，如果你把這個 註解與結腸，
你可以指定它的 一個int，或浮，或路徑，
它會自動將其轉換。
你也可以做轉換 Python的函數中，
只需使用一投，但有時如果 要確保它是一個int，
你可以把 在那裡轉換規則。
>> 所以，讓我們拉起一個例子 一些變量規則。
所以在這裡，這具有相同的基本 結構與從瓶進口
瓶，應用程序=瓶（_NAME_） 然後在最後的運行。
我們有兩種不同的 變量的路線在這裡。
而第一位的，是 我表現出一個
在滑動，這是 它只是需要一個字符串名稱
它會打印出你好，名稱。
>> 然後，第二 人使用的轉換。
因此，這會自動將其轉換 為int，然後雙擊該INT，
並打印了這一點。
而且，我們不做任何形式的 在它的轉換
因為瓶需要的照顧。
因此，讓我們得到這個運行。
當你有一個瓶 應用程序運行，
您可以控制​​-C出來的 停止服務器運行。
然後我將運行變量。
>> 因此，讓我們為localhost /你好/以斯拉和 但願，這會跟我打招呼。
>> 因此，它參加了我的名字，在變量 路線，並且它填充它在這裡。
所以，我也將展示一個快速 例如增加一倍。
所以，如果你去/雙/ 3， 它會打印出6。
因此，這把照顧 轉換我們。
>> 所以，你也可以做到這一點與 float和一些特別的東西，
如果你需要指定像 一個路徑，即讓它接受​​斜杠，
但通常不應是一個問題。
到目前為止，我們，還有 剛剛回國
串，這是不很有趣。
>> 我們其實可以返回 文字HTML字符串。
因此，在代碼中我們可以插入一些東西 像B-標籤，使之大膽，
但大多數時候，你 其實不願意
要編寫HTML代碼 在你的Python代碼。
它變得非常凌亂， 這不是一個好時機。
>> 燒瓶允許我們以分離出 HTML到什麼叫做模板，
所以，如果你想 在MVC模型而言
你是熟悉的， 希望，從工作
與CS50融資一點點， 你可以認為Python的文件
作為多個控制器，其中的 它們與任何交互
數據模型，你可能有。
>> 然後，他們被呼喚意見 和傳遞信息的查看
填寫信息 在HTML中，它需要。
而我們所說的這些意見 在類模板。
>> 因此，瓶用另一個Python 模塊，它會自動
安裝時，PIP安裝 瓶所謂的神社，它
允許您添加這些 註釋到HTML
你在屏幕上看到，這讓 你把東西像條件語句，
並循環到HTML。
>> 所以它看起來像你如何一點點 可以使用PHP中的HTML文件，
但是這僅僅是當瓶 服務器提供了HTML文件，
它會運行這個模板引擎和 通過分析這並填寫事物研究。
所以瓶具有render_template功能 您可以在底部看到這裡。
所以，當你訪問這個頁面時，它 會使這個hello.html的模板，
然後填寫此HTML頁面。
因此，讓我們只需要運行這個現實 很快，看看它是什麼樣子，
然後我會去通過 更詳細一點。
所以，你的模板會 走在一個模板文件夾。
它會自動尋找內 Templates文件夾為模板。
因此，讓我們打開此了。
所以，我將運行模板的例子。
>> 所以，如果我去/你好/以斯拉， 它有這個太可怕了，
討厭的字幕標記，我插嘴說。
非常好，非常有活力。
我是一個大風扇。
但是，如果發生 我剛去，/你好？
所以它只是世界您好如是說。
我並沒有傳遞給它一個名稱， 它會自動填充入。
所以，讓我們來看看它是怎麼做的，以及如何 我們可以擺脫那個帳篷的可能。
>> 所以在這裡，這是有點 一個有趣的例子，
如果你熟悉如何開關 報表的語言工作。
之所以這樣說，是有點像， 那種跌倒過的，
在這裡你居然掛的兩個 不同的路線相同的功能。
因此，我們附上/你好路線， 將/你好/名稱路線您好，
我們指定using--利用Python可以 指定默認功能arguments--
因此，如果沒有名字，所以 如果我們去剛剛/你好，
它會自動過濾 命名等於無。
>> 那麼，我們呈現 模板名稱=名稱，
所以它會通過在名稱參數 等於這個名稱功能參數，
入模板。
這仍然沒有解釋是如何 在決定是否打印的Hello World，
或打印我的名字。
因此，讓我們實際上看起來 入模板本身
而看到這是來自。
>> 所以，這個模板中，我們 實際上有一些有條件的邏輯，
有些人會 認為，你居然
不應該有很多的條件 模板本身的邏輯。
應當在更 控制器，但在本實施例
它的東西非常小。
所以在這裡，我們檢查，如果名字，所以 如果名稱不等於無，
如果一個名字實際上是 傳遞，那麼我們將
說你好，名稱 標題和字幕，
所有這些普通的HTML，否則，我們將 打印出來的Hello，World只是一般。
因此，有兩件事情這裡要注意 你如何格式化模板，
的是，所有這些 條件語句，
有點像我們如何PHP它時， 要插入一些PHP，
使用小於問題 標記，它是那種類似於這裡
與{％。
>> 所以在這裡，我們有我們的條件代碼。
然後，當你真的想 從字面上評估的東西，並打印
它的屏幕， 使用雙括號。
因此，這裡有雙重支撐， 然後我們指定的名稱，
左右的時間內，它會評估 到變量名，它
從傳遞 渲染模​​板功能，
而不是僅僅印刷 出，如果我們擺脫這些，
它只是打印出來的字“的名字。”
所以，這件事情要注意。
>> 所以，另一件事 通知是，當我們
要使用的 render_template功能，
我們其實有進口 它明確地從瓶。
這就是一個例子 合劑的模塊化，
你不必進口 東西，你不需要。
你可以只是把在 功能你其實
確實需要，有時 不錯，這樣你就不會
必須有所有這些功能 坐在那裡，你沒有使用，
而且，如果你忘了你 需要進口render_template，
你可能會得到一個警告 這將讓你知道。
所以，這就是一種模板。
>> 因此，我們已經展示了如何 製作簡單的網頁，
並添加一點點邏輯 它，在可變路由而言。
它可以讓你做不同的事情的基礎上 你去了，也再網址，給
在HTML一點點更有意義 術語要如何呈現的東西。
你不必把所有 你的HTML在你的Python，
但對於相當多 每個Web應用程序，
你會需要某種 數據模型的與它相關聯。
>> 所以傳統上，這將 是這樣的一個SQL數據庫。
而且你可以互動 直接使用SQL。
Python有，我想這就是所謂的。
SQLite的3。
你可以只導入的SQLite 3 直接執行SQL查詢，
但我不知道你， 但我真的不喜歡，只是，
寫出SQL查詢。
它往往會得到真正 漫長而複雜。
>> 因此，一些 我喜歡用的是什麼
被稱為一個ORM，這是一個 對象關係映射。
而一個點 對象 - 關係映射，
是，有兩個不同的 方法，你可以考慮一下數據庫。
>> 這樣的例子， 馬蘭教授通常
採用課堂，是Excel表格，其中 你有這些行和這些列，
而這對於真正有用的 它是如何表示的SQL
你如何與它進行交互，但 另一種方式，它實際上
去想它有時是有用的， 在類和對象方面。
>> 因此，而不是思維 每個表中的作為具有
此行有一定 信息，你其實可以
把它看作是 每個表是一個類，
的，然後每一個實例 類有一定的屬性。
所以，在這個例子中，實例 類是在表中的行，
然後每個屬性會 在表中的一列。
>> 所以，我喜歡的ORM 使用被稱為peewee。
這是非常小的，有點像瓶。
我認為他們可以融洽相處， 但也有很多其他的奧姆斯的
您可以使用。
更常用的是 被稱為SQLAlchem​​y的，
我不記得為什麼我原來 選擇peewee了SQLAlchem​​y的，
或者我會告訴你我為什麼 認為這是最好的一個，
但我們只是要使用此 一個，因為我知道如何使用它。
>> 於是，一個問題是，為什麼 如果您懶得使用ORM，
而不只是直接 編寫SQL查詢？
我認為最好的情況下， 是，你實際上並不
必須編寫SQL查詢。
這是很容易，因為我會告訴你， 做這樣的事情的選擇，插入，
缺失，尤其是創建表。
它更容易 寫一個類結構，
比它構建一個創建 表聲明，但有一件事
要注意的是， 在ORM將盡力
找出最 有效的SQL查詢是，
但有時它得到它錯了。
>> 特別是如果你是 有一個大的數據庫的工作，
你可以看到一個查詢 應該運行速度快，
實際上是需要較長時間。
如果你看看引擎蓋下如何 在ORM的解釋是到SQL，
它可能會做什麼 真是可笑，
僅僅因為幾分之 示意你的意圖是錯誤的。
而且，曾經有段時間在哪裡 我已經覆蓋它，只是
執行自己的SQL查詢，只 因為它是分析在一個陌生的方式。
所以，有一些 開銷，只是在方式
它編譯您 語句分解成SQL。
>> 所以，讓我們快速瀏覽一下超在 一個數據模型的一個簡單的例子
你可能會使用。
所以，這是Python代碼，所以 你想要做的第一件事情是從
peewee進口*。
因此，與瓶，那就是你有 所有這些單獨的模塊，
並要導入燒瓶中， 寫一個模板，和一些其他
以後我們會看到，從peewee， 你可以導入一切，
因為它是一個非常小的圖書館。
>> 所以，你要做的第一件事，就是 真正創建這個數據庫對象。
所以，你有DB = SqliteDatabase， 然後你的數據庫的名稱。
而這實際上 創建數據庫對象
您可以與互動，與peewee。
>> 然後，我們有實際的 我們要創建的模型。
因此，上表中我們要創建。
因此，在peewee，每個班都有 在數據庫中自己的表。
因此，所有的類 從基礎模型繼承，
和資本M型是 這在peewee定義的東西。
>> 所以，所有的車型都應該 繼承他們的最高超，
他們應該繼承 模式，但什麼是真的很酷，
是，你實際上可以有你 模型繼承彼此。
而且很多時候，你的 數據模型不一定
使一個很好的繼承層次，但 時間在那裡做什麼，這是非常好的，
因為你的模型 固有彼此。
>> 因此，我們定義這個類 “學生”，它繼承了一個模型，
它有三個屬性。
它的ID，它是 一個PrimaryKeyField，這
是提供真實的東西 通過peewee，名字是一個CharField，
和檔次是IntegerField。
因此，這可能會或可能不會 如何CS50實際存儲所有
學生的成績。
它不是，但是這是我會怎麼做。
>> 然後它有，內 這個類，而這
是你可以做的 Python中，你可以有嵌套類。
而這是後話 的需要的由peewee。
因此，該類元，你有 指定該數據庫
等於物體 我們在上面創建的。
這表示什麼文件該表 究竟要包含研究。
因此，這是，你有什麼 在所有的模型做。
你只需要指定 這個元類中
該數據庫是等於分貝。
所以我通常會做，如果我有 一堆不同的模式，
是，我有一個基本 模型，我平時
就叫“示範基地” 具有元類，
並設置數據庫等於分貝。
然後我所有的後續機型 將繼承該基類。
然後，我就不必擔心 有關設置元類。
>> 所以，當這實際上得到 編譯成的SQL語句，
它看起來像這個討厭的東西下來 在這裡，“創建表的學生證整數，
“ 隨你。
>> 而且，我認為，這是短， 這個SQL查詢就在這裡，
但如果你看一下這個類在這裡 你可以清楚地看到發生了什麼。
你可以看到什麼類型的字段 還有，他們是怎麼叫，
所以，我認為， 看著這個Python代碼
很多比更具可讀性 嘗試寫這個SQL查詢。
>> 所以，為了實際 使用該數據庫，
我們必須連接到它在Python的。
所以，我平時寫一個調用的函數 initialize_db，做兩件事情。
它需要在數據庫中 對象數據庫和它
連接到它，這只是打開 向上部到數據庫。
如果你只是運行雖然 網站在本地計算機上，
它不是一個超級大問題擔憂 有關連接和斷開，
但如果你正在運行 它的網站上，你
要確保，每當用戶 連接到它，當他們收出
該網站，斷開連接，這樣你 沒有一堆人連
到數據庫的一次。
>> 然後，當你 連接到數據庫，
你想打電話db.create_tables， 並列出了模型，你想要什麼
創建表。
所以在這裡，我只是想 創建了這個學生。
然後，什麼是重要的，是要 指定安全=真大部分的時間。
那麼，這種說法 會做的，就是它
創建表的 學生模型，但只
如果該表沒有 已經創建成功了。
這就是安全的指定。
所以它不會覆蓋 您現有的表，
這只會造成新的 表，如果沒有一個存在。
所以，你可以只創建 表一旦使用SQL。
再有數據庫坐 在那裡，然後連接到每一次，
但它通常是不錯的只是 把這個create_tables電話，
這樣一來，如果你曾經刪除 數據庫中，當您運行Web
再次應用程序，它會重新創建它。
>> 因此，只要確保安全 被指定為真實的，
或者你只是找到你的數據 越來越重挫每次。
然後，你可以調用 initialize_db建立
一個連接，然後創建 表，如果有必要的。
>> 因此，最常見的事 你會想要做的，
或最常見的事情之一， 是實際插入的東西
到你的數據庫。
等，而不是具有 寫一個INSERT INTO
所有的聲明 的規定值，
實際上你可以調用 功能上的學生類。
所以，當你創建一個類 繼承自模型，
它有這個創建方法。
>> 所以，你做的類name.create， 你指定的參數
要通過研究。
所以，如果我想添加一些學生 我們的CS50年級的書為例，
我會在大衛，誰擁有 非常好成績，他有一個95。
而我自己，誰沒有做 如此出色的CS50，我有一個50。
因此，該妙處 這是什麼創造功能呢，
是，它返回實例，或 行，它在表內創建的，
所以，你存儲在一個 可變的，後來又與它的工作。
你可以改變周圍，這 我將展示的一個例子。
>> 請注意，我沒有 必須指定ID，
因為既然是 PrimaryKeyField，它會自動
增加它，如果你不指定。
而且，事實上，你可能 不應指定它，
因為你可能會意外地 揍別人的ID。
而你想 確保它是獨一無二的。
>> 所以，實際上，最 你想要做平常的事情，
可能是選擇了 一旦你的數據庫
有大量的信息在裡面。
所以，如果你想要得到的一切， 所以選擇明星的等效
從學生的說法，它 也只是student.select。
這會給你回一個數組 與所有的學生在裡面對象
你遍歷你想要的。
你可以得到的東西出來。
而大多數的時候，你 不要只想做選擇，
你居然要指定一些東西。
所以，你可以鏈接 同時這些函數調用，
怎麼樣，你會鏈 一起語句在SQL中。
所以，你可以做student.select（）。其中​​， 在這個例子。
然後，你可以 規定的條件，
只是用普通的Python 布爾檢查的事情。
>> 因此，在這種情況下，要 限制你選擇什麼，
其中student.grade等於50， 和student.name等於以斯拉，
這樣只會讓我離開它。
同時注意，一個人真正 微妙的東西在這裡
，如果要指定 一個和/或與一個或/或，
在Python中，你通常會使用， 我認為實際上是“和”字，
但在這裡你使用單個號， 這通常是一個按位操作者，
但在這種特殊情況下， 只是peewee的方式這樣做，
使用單 符號指定“和”。
在這個時候， 我弄混了很多，
但它不上來 這麼多的實踐。
>> 然後，一旦你擁有所有的 學生們從數據庫中，
一旦你這樣做你選擇 和你的穿著或什麼的，
您可以使用foreach循環， 就像通常的Python語法，
與任何類型的迭代器 或與任何類型的數組。
所以，你可以做的，對於s 在student.select（）。WHE
重（Student.grade <75），並且因此這將 遍歷每個學生的表
其等級為小於75，這 在這種情況下，仍然只有我。
然後，你可以做什麼東西在 這個循環，就像給我發電子郵件
並告訴我實際 把我的習題集。
>> 所以，另一件事你可以 這樣做，是不是真的很容易
更新表內的行。
所以，請記住回到這裡， 你當我插入，
我把那價值 通過student.create返回，
我賦予它的名字叫做以斯拉。
所以現在，你可以改變的 該實例中的值，
就像你一個 師範類Python編寫的。
>> 所以，你可以設置ezra.grade = 95 將更新本地副本，
但是，如果你真的想 致力於數據庫的變化，
你必須調用ezra.save， 所以你所謂的.save方法
在實例。
>> 所以現在，我已經成功地改變 我自己等級的數據庫中。
因此，然後讓我們說，我被逮住 改變數據庫中我的成績。
馬蘭教授很可能會 想從類中刪除我的，
所以你可以調用.delete 實例方法只是對那件事。
>> 所以，如果你想去 回到這個循環在這裡，
實際上，而是 發送電子郵件所有
學生的年級少 75，你想刪除它們，
在這個循環中，你可以 致電s.delete實例。
而你想做的最後一件事， 就是當你建立連接，
而你與你的工作完成後， 你想打電話db.close，
其中db是數據庫 反對我們面前。
而你要確保 一切都被關閉掉的。
>> 涼。
所以，現在，我有一個示例應用程序。
排序我已經預先做好一切只是 使得不會有任何活的編碼
失誤，但我們可以穿行 ，看看你將如何把瓶
和peewee在一起， 並進行簡單的應用程序。
我把它叫做CS50咆哮，它的 那種簡單的博客平台。
>> 因此，首先，我要運行它， 顯示是什麼樣子，
然後我們就可以更進一步地代碼。
好了，我們只是執行這個。
酷，我會讓這個 稍微小了一點。
這是不是很漂亮，只是因為 我沒有做很多的CSS，
但它的作用是，它有 博客文章該數據庫，
並經過所有 它們，並且，將顯示它們
在訂單的最新的頁面。
所以這些都只是一些帖子 我已經保存在數據庫中。
>> 所以，如果我們要創建一個新的 文章中，我們可以去添加新帖子，
我們可以進入的稱號 後期，所以像，CS50研討會。
哇，真是享受了研討會。
>> 涼。
然後你按後，它會 重定向你回到首頁，
然後你會看到 最新帖子加入。
而且我們還有所有的人在那裡。
所以，現在，讓我們來看所有的 代碼，看看這是如何實現的。
>> 所以，我認為，我們的第一件事 看看，其實是模型。
很多的時候， 你設計的東西，
你想先說一下是怎麼想的 你要表現你的數據，
然後設計圍繞這個事情， 讓一切都很有意義。
這實際上是我怎麼 這樣做是當我做這個，
我坐下來，心想： 我該怎麼要在後。
>> 所以，在這裡，我們有相同的結構 我前面提到，
在這裡我們做DB = Sqldatabase（'posts.db“）。
在現實中，你可能不希望 在你的名字的數據庫硬編碼。
這也許應該是一個參數 一個儲存的地方，也許
在配置文件中，但在 一個小例子是這樣，
它的好硬編碼的研究。
>> 所以，現在，我們有這個Post類， 從基礎模型繼承。
它具有，再次，所述 ID = PrimaryKeyField。
事實上，如果不指定， 如果我真的擺脫了這一點，
那麼peewee我們會照顧 自動創建ID字段，
它會自動 使它的PrimaryKey，這
我覺得是非常好的，因為通常情況下， 這就是你想要擁有的東西，
但我喜歡把它放在具體而言， 只是讓我記得它在那裡。
但是，如果不指定， 它會自動在那裡。
>> 那麼，我有個約會其中 是一個DateTimeField字段，並且所有
這些不同的字段，如果 看peewee文檔，
它會給你不同的列表 類型，你可以使用領域。
在大多數情況下，它的類似 什麼，你會在SQL中看到的。
因此，有一個CharField，一個 VarCharFields，文本域，
這對於非常長的 文本，就像一個博客文章
潛在的，DateTimeFields， DoubleFields，FloatFields，
所有這樣的事情。
>> 你可以通過在其他參數 它，我沒有在這裡指定。
說，例如，你不想 讓兩個職位有相同的標題，
你可以指定 像獨特= TRUE，
而這僅僅是一個額外的參數 現場，當它編譯下來
到SQL，它將指定 它必須是唯一的。
您也可以指定像 不為空，所有其他的事情
你通常做的SQL。
所以，這是一個非常簡單的 模型具有的日期。
注意這裡，在DateTimeField字段內， 我指定的內容默認為。
我指定它是 datetime.datetime.now，
因為方式 這得到評估，
它實際上評估 該datetime.now時
它被插入到數據庫中。
>> 我認為，我有 要仔細檢查這一點，
但如果你做了這樣的事情，那麼 它實際上評估，有一次，
然後將日期時間 將始終是相同的。
所以，只是如果你正在做的事情 有日期時間，仔細檢查
，它的評估時， 實際上被插入，否則
你可能會感到困惑。
>> 標題僅僅是一個 CharField，其中有
更多參數可以傳遞 在指定究竟有多長，你
希望它是，但在這裡， 它並沒有真正的問題。
而文本將是 整個帖子的文字，
而這將是一個 文本字段只因為你想
允許它是一個相當長的字符串。
>> 然後我們有這個元 子類，只是
指定我們希望數據庫 其中，這實際上是開闢成
是，我們在這裡的數據庫對象。
而過去的事情，我們有 在這裡，只是這個功能
我們要去 我們主要的應用程序使用
初始化數據庫連接到 它，然後以創建Post表。
>> 現在，讓我們來看看在主應用程序本身。
所以，這個人是一個相當 位比那些更長
我們已經看到過， 但希望不是太糟糕。
所以，讓我延長了這一點。
好。
>> 因此，注意和頂我進口 一大堆其他東西
從瓶，我們有沒有 以前真的見過。
並希望，我們可以通過 這些逐個中的每一個
聊多一點關於 其中，排序的例子。
因此，我們有瓶， 和render_template，
這是我們所見過的， 這個請求對象，
這將拿出當我們看看如何 我是真正展示的形式
作品。
重定向，它可以讓您重定向 從創建新郵回
回到原來的網頁，然後 URL，這是一件好事，可以讓你
找出其中的 網站的某個特定頁面。
>> 那麼，下一個 我做的事情，是我進口
所有的模型信息 我們只是在看文件。
而且，是的。
>> 所以，別的新自帶 當你處理了，
尤其是數據庫， 是，你可以指定
一個之前被調用函數 每一個請求，並且功能得到
所謂的每一個請求後，使用此 功能裝飾app.before請求。
>> 因此，這將得到執行 無論此功能。
這並不必須是 請求之前調用，
但通常這件事情 理智地調用它。
您可以指定任何功能 你想獲得所謂的存在，
所以我指定了該initialize_db 函數，我們在模型有回
文件中，所以每個請求之前， 要連接到數據庫。
>> 有兩種不同的 方法可以做到這一點。
你可以做@app，我 相信這是after_request。
和之間的差 after_request和teardown_request，
是after_request只會發生 如果請求實際上是有效的。
因此，僅當 請求是成功的，
如果沒有出現任何錯誤， 但teardown_request
發生在一個成功的情況下 請求，或在出現錯誤的情況。
>> 因此，通常情況下，你想 使用teardown_request，
除非你想做的事 什麼東西，特別是不同的
在一個錯誤的情況下。
但是只是關閉數據庫， 無論是成功或失敗，
我們要斷開 從數據庫中。
因此，它被稱為，db.close 在數據庫對象。
>> 注意，teardown_request 取入一個例外。
所以，你可以檢查是否有實際 一個錯誤，當它被關閉了，
但在這裡，有希望，有 是不是一大堆的錯誤，
排序，所以我們只是忽略了。
>> 好了，和它的其餘部分是不是太糟糕。
所以，當我們去到首頁， 我們提供的這個home.html的模板
這將打開。
該過程在後 等於，而這是什麼
確實是，還記得我們有這個職位 模型，所以我們選擇所有的帖子，
然後另一件事可以做， 您可以指定WHERE子句，
你可以指定一個 按順序，所以我們採取
所有的帖子說 得到選中，然後
我們為了他們的 post.date.descending。
當這將指定， 他們居然出來了，
最近的一次 會很第一個。
>> 然後，我們傳遞到 在home.html做為模板，
讓我們實際打開了 該模板的真快，
並看看怎麼說的工作。
這是不是偉大的HTML，但 希望我們能夠專注於Python的。
>> 因此，有一個鏈接添加新 郵政，因此這個指定路線
在燒瓶內，我們 定義，這是在這裡。
這是新的佈線後， 我們在這裡指定了起來。
所以這是一個鏈接，然後去 向該燒瓶服務器內的路由。
>> 更有趣的事情 是這樣的循環在這裡。
因此，我們指定該 帖子參數，
通入 render_template功能，
在這篇文章的每一個崗位 獲取傳遞的對象。
我們要打印出 文章標題，上半年，
再下面，我們要打印出 一個段落中的文字後。
>> 在這裡，我們實際上可以 調用Python函數，
因此，我們可以調用的strftime，ST-RF-時間， 您可以通過在格式字符串
要打印出來的數據研究。
所以它是相當不錯的，你可以 實際上調用這個Python函數
從內部在這裡。
你不必做格式上 控制器方面，因為說真的，
格式化的日期是什麼， 你要處理的視圖中。
>> 而所有這些百分比 事情是不是超級重要。
如果您查找文檔 在Python中的strftime函數，
它指定所有這些 的事情，但是這
怎麼樣，當我們正在尋找 在此間舉行的首頁，
它格式化這個一個不錯的 迄今為止，它指定上午或下午，
但通常，如果我們 沒有這個這裡，
你可能會得到一些垃圾 日期沒有看起來非常好。
然後我們指定 post.text，我可以
已經把幾個 換行符在這裡，只
把一些空間各崗位之間。
>> 所以，我認為最重要的 在本實施例的東西，
是，你可以使用這個循環。
這類似於 事情可以在PHP做。
您可以遍歷， 一切都被傳遞，
而不必等，做 複製/粘貼，複製/粘貼所有的HTML，
你只需要編寫一次，然後 你可以遍歷所有的職位。
>> 而這是後話 常見的要
這樣做，當你有大量的數據， 是，一切都在你的數據，
你想要做類似的事情。
然後，只記得，當你 要明確地打印出的東西
在HTML，您使用 這裡的雙重支撐，
但是當你想指定 關於條件的一些信息，
或者約一個for循環，你 使用百分比支架。
>> 所以，要回了Python 代碼，以便解釋
發生了什麼主 路線，當我們去那裡，
它只是顯示所有 的帖子，但隨後的問題
是，我們如何真正得到 帖子到數據庫中，這
更有意思一點。
>> 所以，當你點擊新 帖子的鏈接，這是我們在這裡看到，
這將您重定向到這種形式。
而這對只是一個簡單的通話 render_template功能，然後
在HTML表單的新職位通過。
因此，讓我們來看看這一點。
所以這一塊是非常簡單的。
它有一個簡單的HTML表單，其中 看起來有點眼熟，
基於表單的CS50融資。
因此，我們在這裡指定的動作。
在這裡，如果你的工作 用PHP，通常情況下，
會是這樣， create.PHP，但在這裡
我們實際上指定路由 內瓶服務器。
因此，這條線路對應 以創建路線
我們這裡有，這 我們將進入在第二。
>> 因此，我們指定 這是一個POST方法，
因為我們想送 這種形式的數據，通常
當你從一個表單發送數據， 你可能想使用POST請求，
只是，這樣你就不會結束 這個大，笨重的URL。
但你也可以使用一個GET請求， 和可變路由通過它，
但對於形式，這是很好 在這裡POST請求。
因此然後，就像你 將與HTML和PHP做的，
也可把這些文字輸入， 並且可以指定他們的名字，
而這，將獲得通過的名稱 入內瓶的請求對象。
>> 然後我們有一個提交 按鈕後說。
在這裡，帖子是的名稱 按鈕，因為它是一個博客帖子，
但在這裡，職位要求的方法。
因此，這些都是相同的字 但實際上無關。
是啊
>> 讓我們再回到Python代碼， 當我們調用create方法，
注意在這裡，你可以 實際的路線中指定
請求方法 要接受，
所以在這裡，我指定我 只希望接受POST方法。
所以，如果我實際嘗試訪問的頁面 直接，這是使用GET請求，
它會告訴我“不允許的方法。”
>> 所以，你的頁面，有點像 這個創建頁面，我只是
真正使用的一種方式 的形式得到提交，
你可以指定不 希望人們能夠去那裡
直接通過GET請求， 或者，如果你不想，
出於某種原因，一個Post請求， 你可以只指定到這裡，
但在這個例子中，我們只 想POST請求出去。
>> 所以，當create_post被調用，當 我們參觀了經發布採購信息，
當你去一個特定的 路線，有此請求對象，
我們不得不進口 在最高層的要求，
但有此要求 獲取傳遞的對象，
您可以訪問表單數據， 它會自動得到填補
當您發送從形式的請求。
>> 然後，我認為 是真的很酷，是
即獲得通過表單對象 在，就是一個Python字典，
包含，如果你所以這裡access--，讓 我拉起HTML旁邊，只是
這樣你就可以有 作為參考，是的，所以
我們在這裡指定的名稱 對於不同的領域，所以
標題和文字中，我們 然後只使用那些在這裡
作為索引到表單中的數據。
所以這是超級方便。
>> 於是，我們稱之為post.create，這 將創建並自動插入
這個新職位的對象到數據庫中。
而且我覺得這創造功能 這裡是如何一個非常酷的例子
強大的燒瓶中，並與該工作， 因為如果你做的事情
在PHP中，您可能需要 做驗證了很多，
你必須再 建立數據庫連接，
你必須再 執行SQL查詢，
但在這裡，我們只是有這個漂亮 post.create，然後我們可以只
獲取信息了 請求的對象，
然後把它傳遞到一個新的 發布，我們正在創造。
>> 然後，在最後的 我們想要做的事情，
是重定向 用戶返回到家庭。
因此，我們用這個 瓶重定向功能。
而一些我們還沒有看到 之前，是該URL的功能。
所以，網址功能讓 你通過在實際上名字
在Python代碼的函數， 而不是特定路線
它是在。
>> 所以，我可以很容易地 重定向用戶大幅削減，
這將發送回了家，但 使用URL的功能是好的，
因為如果你改變 位置那裡的東西，
所以我們說，我改變 家是在/ home上，而不是，
這仍然然後返回/主頁， 因為實際上去，抬頭
函數的名稱，並且它 會還給你的網址為。
>> 因此，對排序 假設你
更容易改變那裡的東西 是，比的函數的名稱。
您可以使用此真 漂亮的URL的功能。
還有一件事要注意的 這是一個有點棘手，
是，你認為你可以只 呼叫重定向的URL，
但實際上所有的航線都 回到某種形式的文本和HTML，
所以你確實有 返回重定向呼叫。
否則，你會得到什麼 關於無效不返回一個字符串，
因為所有這些都返回 在HTML你真的想渲染。
>> 所以，當你調用的重定向， 它會將您重定向到頁面，
但它實際上返回的HTML 您需要執行重定向。
返回到主頁。
因此，我們有兩種不同的看法。
我們的主視圖。
或者，我想我應該說的模板。
我們有這兩個模板， 家裡模板，
顯示了我們所有的崗位， 那麼，我們有這個廣告的事情，
當你點擊後，它會 向該燒瓶內的新路線，
但是這條路並不一定 有一個相應的模板。
你沒有看到 任何東西，但你仍然可以
有這樣的工作會 幕後。
然後你重定向 回到主頁。
絕對，很容易合作 在一些更好的CSS到模板
，使這個看起來要好很多， 但所有的主邏輯
有沒有在Python。
>> 關於這個例子有問題嗎？
我知道有很多 不同的東西對那裡發生的，
很多東西我們還沒有看到 之前，但像什麼。
是啊。
>> 聽眾1：你有沒有做任何事情 特別擦洗這是該數據
從表單來了呢？
我注意到你剛才說的“創造”
EZRA ZIGMOND：是啊，所以這是 實際上，這是一個非常好的點。
所以現在的問題是，你 需要檢查並確保
該數據是有效的，並 做任何形式的洗刷
以確保它是有效的， 因為你可以在這裡看到，
我沒有這樣做。
因此，讓我們看看會發生什麼 如果我發布一些空白。
因此，它會實際上只是做一個 空白後並填寫日期時間。
>> 因此，在現實中，可能會 想要做這樣的事情，
也許註明標題等於 空字符串，那麼不這樣做。
或者說，只有這樣做，如果標題是 不等於空字符串。
因此，它實際上並沒有自動 採取洗滌護理
為你，所以你仍然需要做的。
是啊，好問題。
>> 讀者2：它是否磨砂 對於續集注射？
你知道嗎？
>> EZRA ZIGMOND：希望， peewee做到這一點。
我想，這肯定會是一個相當 糟糕的圖書館，如果它沒有這樣做。
我不知道到底。
我不得不看 查詢，它生成的。
我想，如果我輸入一個 博客文章的排序，看起來
像SQL注入攻擊， 這樣的事情，如果這
就像一個密碼字段什麼的， 你可能會做這樣的事情。
>> 我認為，還是會 獲得字面貼，
但我認為peewee不會做 某種擦洗數據的
之前，它實際上執行它。
>> 聽眾1：文本字段 設計上採用純文本，對不對？
>> EZRA ZIGMOND：是啊，這是。
是啊。
因此，我認為所有的，所以這是 正確的行為，這將做到這一點，
但我認為，peewee 希望不會做
保護對他們的最終某種。
如果你想 仔細檢查，有
是當你生成一個查詢方式。
這樣你就不必 直接執行它。
我不得不採取 看文件，
但實際上你可以查看 SQL它產生，
並看看這一點，使 確保其逃避的東西。
>> 另一個原因，你可能 想看看SQL
這peewee的輸出，是，如果 事情似乎得很慢，
你可以看看，看看它的 其實這樣做，因為它有時
容易意外增加 在，你的方式寫出來，
你可以不小心把它 首先選擇整個數據庫，
然後做一些操作 上，真當你
為了選擇一個子集。
>> 所以，如果事情不 相當在朝好的方向發展，
這是很好的看一看的要求 這實際上是如何產生的。
是啊。
>> 讀者2：當你第一次開始， 你把端口為5000。
>> EZRA ZIGMOND：是的。
讀者2：是用peewee默認， 或者是一些可以改變？
EZRA ZIGMOND：是的，所以 默認情況下是用瓶端口。
如果你運行它，而不 指定任何東西，
它會自動做到這一點。
我相信，我有 要仔細檢查這一點，
但可以指定在app.run， 我想你可以做這樣的事情，
端口= 8080。
讓我們給一個嘗試真正的快。
是啊，所以你可以只指定 端口= 8080，它將在它上面運行，
我認為，如果你想運行 在IDE中，我沒有嘗試過這一點，
但我認為，如果你 跑了8080端口，
你可能能 訪問服務器，
就像你的網站。
>> 是的，但它很容易 改變這種狀況，如果你
任何有點像端口轉發 你需要做的事情。
>> 其他問題嗎？
是嗎？
聽眾1：所以，我看到了你 是，正如你所提到的機型，
你必須指定 數據庫為每個對象。
你可知道，做 這使得如果你真的很容易
有很多的SQLite數據庫，你 要使用一個單一的Web應用程序，
那你可以指定一組 不同的人在模型？
>> EZRA ZIGMOND：是啊，讓我 打開了真正的快。
所以，你說，如果你想擁有 一堆不同的東西，也許
喜歡和同學們，對於一些 因此，這樣的事情？
是啊，所以我認為， 你還在，每個模型
必須仍然有剛 分配給它的一個數據庫，
但如果你想有 不同的模式，
分配了不同的數據庫對象 它，你肯定可以做到這一點。
所以，如果我創建了一個新的， 這樣的事情，
現在這是一個學生的 看起來奇怪的是像博客文章，
我可以指定 數據庫等於這裡db_2。
所以，我認為這是 主要的方式，你可以做到這一點。
>> 涼。
其他問題嗎？
>> 所以，剛完成了一個小 位，這裡有一些資源，
這些幻燈片將在網上公佈 這樣你就可以真正得到這些鏈接。
最好的資源是真的 對於瓶文檔
和peewee自己。
他們寫的非常好，我想。
所以，該瓶網站在這裡，並且 他們有一個快速入門教程
將穿行類似 事情是我走過，
但如果你想要的任何形式的審查 那我走過去的事情，
或者你認為我解釋 東西在一個混亂的方式，
他們將有類似的例子還有。
>> Peewee有文檔，以及 他們有一個快速入門教程
即越過主要參數 您可能需要使用。
所以，這個事情我談到了與 獨特的，並指定默認值，
不同種類領域的 您可以使用，這些都將是那裡。
>> 此外，如果你有 關於peewee問題，
並在發布的計算器， 誰做peewee實際的傢伙
接著，有時回答這些。
如果你有任何問題，希望 他將能夠回答這個問題，
因為他寫了整個事情。
我認為這是一切 我想覆蓋。
謝謝出來。