Skip to content

Commit

Permalink
替换简书图片地址到github
Browse files Browse the repository at this point in the history
  • Loading branch information
陆辉 authored and 陆辉 committed Oct 28, 2020
1 parent 9ffd1c7 commit a8d7715
Show file tree
Hide file tree
Showing 16 changed files with 35 additions and 35 deletions.
6 changes: 3 additions & 3 deletions docs/第七章:错误处理.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

在Flask应用中爆发错误时会发生什么? 得到答案的最好的方法就是亲身体验一下。 启动应用,并确保至少有两个用户注册,以其中一个用户身份登录,打开个人主页并单击“编辑”链接。 在个人资料编辑器中,尝试将用户名更改为已经注册的另一个用户的用户名,boom!(爆炸声) 这将带来一个可怕的“Internal Server Error”页面:

![Internal Server Error](http://upload-images.jianshu.io/upload_images/4961528-a0c4d67a757f320c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Internal Server Error](https://camo.githubusercontent.com/6962dc833a28d415cb3779540a7400d7718a455c/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d613063346436376137353766333230632e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

如果你查看运行应用的终端会话,将看到[stack trace](http://en.wikipedia.org/wiki/Stack_trace)(堆栈跟踪)。 堆栈跟踪在调试错误时非常有用,因为它们显示堆栈中调用的顺序,一直到产生错误的行:
```
Expand Down Expand Up @@ -56,7 +56,7 @@ sqlite3.IntegrityError: UNIQUE constraint failed: user.username

现在让应用再次崩溃,以在浏览器中查看交互式调试器:

![Flask调试器](http://upload-images.jianshu.io/upload_images/4961528-579598dfc9072e67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Flask调试器](https://camo.githubusercontent.com/24a52086ae210b14d50009ebaaab68693c3a7430/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d353739353938646663393037326536372e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

该调试器允许你展开每个堆栈框来查看相应的源代码上下文。 你也可以在任意堆栈框上打开Python提示符并执行任何有效的Python表达式,例如检查变量的值。

Expand Down Expand Up @@ -119,7 +119,7 @@ from app import routes, models, errors
```
如果在终端界面设置环境变量`FLASK_DEBUG=0`,然后再次出发重复用户名的BUG,你将会看到一个更加友好的错误页面。

![自定义500错误页面](http://upload-images.jianshu.io/upload_images/4961528-80653185821b8d8c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![自定义500错误页面](https://camo.githubusercontent.com/f18aa92c972ba8edd4e2bfa681f1b8edd2d0af2c/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d383036353331383538323162386438632e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 通过电子邮件发送错误

Expand Down
4 changes: 2 additions & 2 deletions docs/第三章:Web表单.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ def login():

此时,你可以验证结果了。运行该应用,在浏览器的地址栏中输入`http://localhost:5000/`,然后点击顶部导航栏中的“Login”链接来查看新的登录表单。 是不是非常炫酷?

![登录表单](http://upload-images.jianshu.io/upload_images/4961528-6d1753699807685a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![登录表单](https://camo.githubusercontent.com/5be5cf105f6c1de5b90c066a9b3b275100cab50f/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d366431373533363939383037363835612e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 接收表单数据

Expand Down Expand Up @@ -259,7 +259,7 @@ def login():

如果你尝试在未填写username和password字段的情况下提交表单,就可以看到显眼的红色错误信息了。

![表单验证](http://upload-images.jianshu.io/upload_images/4961528-93817f3c32374fd7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![表单验证](https://camo.githubusercontent.com/ff453a61b73542c4b15b5bdca99a50e722d2157b/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d393338313766336333323337346664372e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 生成链接

Expand Down
4 changes: 2 additions & 2 deletions docs/第九章:分页.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ def explore():

此时,我建议你在应用上再次尝试一下这个功能,以便体验最后的用户接口的完善。

![用户动态](http://upload-images.jianshu.io/upload_images/4961528-b777226f688b5e11.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![用户动态](https://camo.githubusercontent.com/e9ed3501f7d17d49e290109426d94d439bb8f0b1/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d623737373232366636383862356531312e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 用户动态的分页

Expand Down Expand Up @@ -305,7 +305,7 @@ def index():

主页和发现页都添加了分页链接。第一个链接标记为“Newer posts”,并指向前一页(请记住,我显示的用户动态按时间的倒序来排序,所以第一页是最新的内容)。 第二个链接标记为“Older posts”,并指向下一页的帖子。 如果这两个链接中的任何一个都是`None`,则通过条件过滤将其从页面中省略。

![分页](http://upload-images.jianshu.io/upload_images/4961528-d126bfd1d8dce705.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![分页](https://camo.githubusercontent.com/3f48feabac9a41940364cd7694b587a896c32165/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d643132366266643164386463653730352e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 个人主页中的分页

Expand Down
2 changes: 1 addition & 1 deletion docs/第二十一章:用户通知.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ def messages():

在这里,我直接从模板中调用上面添加到User模型中的`new_messages()`方法,并将该数字存储在`new_messages`模板变量中。 然后,如果该变量不为零,我只需添加带有该数字的徽章到消息链接后面即可。 以下是这个页面的外观:

![Messages Badge](http://upload-images.jianshu.io/upload_images/4961528-75b909c6c9854ecb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Messages Badge](https://camo.githubusercontent.com/edd9fbaf1927836975e7c6c66d48875fd37f6291/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d373562393039633663393835346563622e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 动态消息通知徽章

Expand Down
4 changes: 2 additions & 2 deletions docs/第二十二章:后台作业.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

任务队列为后台作业提供了一个便捷的解决方案。 Worker进程独立于应用程序运行,甚至可以位于不同的系统上。 应用程序和worker之间的通信是通过*消息队列*完成的。 应用程序提交作业,然后通过与队列交互来监视其进度。 下图展示了一个典型的实现:

![Task Queue Diagram](http://upload-images.jianshu.io/upload_images/4961528-61103c48694df737.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Task Queue Diagram](https://camo.githubusercontent.com/2be1de536e7cc8da47740fcbd3b0e6d0e95638b1/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d363131303363343836393464663733372e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

Python中最流行的任务队列是[Celery](http://www.celeryproject.org/)。 这是一个相当复杂的软件包,它有很多选项并支持多个消息队列。 另一个流行的Python任务队列是[Redis Queue](http://python-rq.org/)(RQ),它牺牲了一些灵活性,比如只支持[Redis](https://redis.io/)消息队列,但作为交换,它的建立要比Celery简单得多。

Expand Down Expand Up @@ -524,7 +524,7 @@ def export_posts():

为了完善这个功能,我想在后台任务运行时提醒用户任务完成的百分比进度。 在浏览Bootstrap组件选项时,我决定在导航栏的下方使用一个Alert组件。 Alert组件是向用户显示信息的带颜色的横条。 我用蓝色的Alert框来渲染闪现的消息。 现在我要添加一个绿色的Alert框来显示任务进度。 样式如下:

![Progress Alert](http://upload-images.jianshu.io/upload_images/4961528-7a3fc6383144226d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Progress Alert](https://camo.githubusercontent.com/0951eff09f9c441fe930c924ac0d4eacabfd52ea/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d376133666336333833313434323236642e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

*app/templates/base.html*:基础模板中的导出进度Alert组件。

Expand Down
2 changes: 1 addition & 1 deletion docs/第二十章:加点JavaScript魔法.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

社交网站的常见用户交互模式是,当你将鼠标悬停在用户的名称上时,可以在弹出窗口中显示用户的主要信息。 如果你从未注意到这一点,请访问Twitter,Facebook,LinkedIn或任何其他主要社交网站,当你看到用户名时,只需将鼠标指针放在上面几秒钟即可看到弹出窗口。 本章将致力于为Microblog实现该功能,你可以在下面看到预览效果:

![User Popup](http://upload-images.jianshu.io/upload_images/4961528-d34608ca599c0ca2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![User Popup](https://camo.githubusercontent.com/4b7a41fff6f962323aa6f87898693e5a30f6e211/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d643334363038636135393963306361322e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

*本章的GitHub链接为:[Browse](https://github.com/miguelgrinberg/microblog/tree/v0.20)[Zip](https://github.com/miguelgrinberg/microblog/archive/v0.20.zip)[Diff](https://github.com/miguelgrinberg/microblog/compare/v0.19...v0.20).*

Expand Down
6 changes: 3 additions & 3 deletions docs/第二章:模板.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def index():

利用上述的代码更新这个视图函数,然后再次在浏览器打开它的URL看看结果。

![模拟用户](http://upload-images.jianshu.io/upload_images/4961528-4cbdf36f1c266281.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![模拟用户](https://camo.githubusercontent.com/4360344234d8217c454068826eec68a3b7d1aa96/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d346362646633366631633236363238312e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

如果我说这个函数返回HTML的方式并不友好的话,你可能会觉得诧异。设想一下,当这个视图函数中的用户和博客不断变化时,里面的代码将会变得多么的复杂。应用的视图函数及其关联的URL也会持续增长。如果哪天我决定更改这个应用的布局,那就不得不更新每个视图函数的HTML字符串。显然,随着应用的扩张,这种方式完全不可行。

Expand Down Expand Up @@ -164,7 +164,7 @@ Jinja2提供了`for`控制结构来应对这类问题:

大道至简,对吧? 玩玩这个新版本的应用程序,一定要逐步添加更多的内容到用户动态列表,看看模板如何调度以展现视图函数传入的所有用户动态。

![模拟用户动态](http://upload-images.jianshu.io/upload_images/4961528-ed3d140cd60c7d2e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![模拟用户动态](https://camo.githubusercontent.com/7732c2f7c6276db17810c5e3ea9d797e95d078e8/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d656433643134306364363063376432652e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

## 模板的继承

Expand Down Expand Up @@ -206,5 +206,5 @@ Jinja2有一个模板继承特性,专门解决这个问题。从本质上来

自从基础模板*base.html*接手页面的布局之后,我就可以从*index.html*中删除所有这方面的元素,只留下内容部分。 `extends`语句用来建立了两个模板之间的继承关系,这样Jinja2才知道当要求呈现`index.html`时,需要将其嵌入到`base.html`中。 而两个模板中匹配的`block`语句和其名称`content`,让Jinja2知道如何将这两个模板合并成在一起。 现在,扩展应用程序的页面就变得极其方便了,我可以创建从同一个基础模板*base.html*继承的派生模板,这就是我让应用程序的所有页面拥有统一外观布局而不用重复编写代码的秘诀。

![模板继承](http://upload-images.jianshu.io/upload_images/4961528-2d5ed4ead77f74ba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![模板继承](https://camo.githubusercontent.com/fe04bb38e1b03984dbf08083b0adab641197b870/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d326435656434656164373766373462612e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

2 changes: 1 addition & 1 deletion docs/第五章:用户登录.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ def register():

这个视图函数的逻辑也是一目了然,我首先确保调用这个路由的用户没有登录。表单的处理方式和登录的方式一样。在`if validate_on_submit()`条件块下,完成的逻辑如下:使用获取自表单的username、email和password创建一个新用户,将其写入数据库,然后重定向到登录页面以便用户登录。

![注册表单](http://upload-images.jianshu.io/upload_images/4961528-28b62433a93cf278.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![注册表单](https://camo.githubusercontent.com/fc06f87607fa183a14822986bbe7a0418a1bb4e0/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d323862363234333361393363663237382e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

精雕细琢之后,用户已经能够在此应用上注册帐户,并进行登录和注销。 请确保你尝试了我在注册表单中添加的所有验证功能,以便更好地了解其工作原理。 我将在未来的章节中再次更新用户认证子系统,以增加额外的功能,比如允许用户在忘记密码的情况下重置密码。 不过对于目前的应用来讲,这已经无碍于继续构建了。

6 changes: 3 additions & 3 deletions docs/第八章:粉丝.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

我已经在[第四章](https://github.com/luhuisicnu/The-Flask-Mega-Tutorial-zh/blob/master/docs/%e7%ac%ac%e5%9b%9b%e7%ab%a0%ef%bc%9a%e6%95%b0%e6%8d%ae%e5%ba%93.md)中用过了一对多关系。这是该关系的示意图(译者注:实际表名分别为user和post):

![一对多关系](http://upload-images.jianshu.io/upload_images/4961528-789b72ec95228315.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![一对多关系](https://camo.githubusercontent.com/24953a3d07267864e9437dbbb499e310d0a57d1a/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d373839623732656339353232383331352e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

用户和用户动态通过这个关系来关联。其中,一个用户拥有**条用户动态,而一条用户动态属于**个用户(作者)。数据库在**的这方使用了一个*外键*以表示一对多关系。在上面的一对多关系中,外键是`post`表的`user_id`字段,这个字段将用户的每条动态都与其作者关联了起来。

Expand All @@ -30,7 +30,7 @@

展现多对多关系需要使用额外的*关联表*。以下是数据库如何查找学生和教师的示例:

![多对多](http://upload-images.jianshu.io/upload_images/4961528-ac7e6ea64131bc16.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![多对多](https://camo.githubusercontent.com/2dfb55edbdeafd45b017b60469dc32652a3b6033/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d616337653665613634313331626331362e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

虽然起初看起来并不明显,但具有两个外键的关联表的确能够有效地回答所有多对多关系的查询。

Expand All @@ -50,7 +50,7 @@

使用自引用多对多关系来实现粉丝机制的表结构示意图:

![多对多](http://upload-images.jianshu.io/upload_images/4961528-00282d0dec00d11c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![多对多](https://camo.githubusercontent.com/42f706333b5e7f3a082409b6f5aa07cace67d294/687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f343936313532382d303032383264306465633030643131632e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696d61676556696577322f322f772f31323430)

`followers`表是关系的关联表。 此表中的外键都指向用户表中的数据行,因为它将用户关联到用户。 该表中的每个记录代表关注者和被关注者的一个关系。 像学生和老师的例子一样,像这样的设计允许数据库回答所有关于关注和被关注的问题,并且足够干净利落。

Expand Down
Loading

0 comments on commit a8d7715

Please sign in to comment.