[音乐播放]
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实际的家伙
接着，有时回答这些。
如果你有任何问题，希望 他将能够回答这个问题，
因为他写了整个事情。
我认为这是一切 我想覆盖。
谢谢出来。