本文翻译自The Flask Mega-Tutorial Part I: Hello, World!

一趟愉快的学习之旅即将开始,跟随它你将学会用PythonFlask来创建Web应用。上面的视频包含了整个教程的内容预览(译者注:视频见原文)。通过学习本章内容,你将学会如何创建一个Flask项目,并在自己的电脑上运行一个简单的Flask Web应用。

教程中所有的代码示例都托管在GitHub上。虽然直接从GitHub下载代码可以节省写代码的步骤,但是我强烈建议你至少在前几章自己动手书写这些代码。一旦你熟悉了Flask和示例应用,一些繁琐重复的代码就可以直接从GitHub复制了。

在每章的开头,我都将提供三个GitHub的链接来帮助你顺畅地学习本章的内容。点击Browse链接会打开GitHub上Microblog项目在本章的对应代码库页面,不会包含之后章节的任何新增代码。而Zip链接则提供了这份代码库的zip打包文件的下载地址。如果点击Diff链接,打开的将会是本章节的代码变更信息。

本章的GitHub链接为: BrowseZipDiff.

安装Python

你说你还没有安装Python?那还等什么!立马安装吧。如果操作系统默认没有提供Python安装包,可以从Python官方网站下载。如果你使用Microsoft Windows操作系统并且打算使用WSL或者Cygwin,需要注意,不要在上面使用Windows版本的Python,而要使用类Unix版本,比如从Ubuntu获取(对应WSL)或从Cygwin上获取。

为了验证Python是否正确安装,你可以打开一个终端窗口并输入python3(如果不存在这个命令,那就输入python)。预期的输出如下:

 $ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> _

Python解释器中,光标不断闪烁,等待着你输入Python语句。在未来的章节中,你可以充分体会到交互式解释器的魅力。至少现在它能够帮你确认Python已经成功安装的事实。可以输入exit()并回车来退出交互式解释器。在Linux和Mac OS X操作系统上,按下快捷键Ctrl-D也可以快速退出交互式解释器。在Windows操作系统上,则是通过按下Ctrl-Z后跟上Enter快捷键来快速退出。

安装Flask

下一步开始安装Flask,在这之前我要告诉你安装Python三方包的最佳实践。

Python将所有三方包托管到一个公共仓库,任何人都能从这个公共仓库下载并安装所有的三方包。Python将三方包公共仓库命名为PyPI以表示Python Package Index的缩写(被一些人戏称为”cheese shop”)。从PyPI上安装三方包非常简单,Python专门提供了一个名为pip的工具来解决这个问题(Python2.7中不含pip工具,需要单独安装)。

安装三方包时,使用pip命令如下:

 $ pip install <package-name>

有趣的是,这个方法在大多数情况下不适用。假如Python解释器是全局安装的,所有用户都能使用,那么普通用户则没有权限来修改它,因此只能用管理员账户来执行安装操作。即使忽略操作的复杂性,使用这种全局安装的方式会发生什么?pip工具从PyPI上下载三方包并安装到全局Python目录下,即刻起,所有Python脚本都可以访问到这个三方包。想象这样一个场景,你之前用当时的最新版本Flask——0.11版本的Flask开发了一个Web应用,现在Flask已经更新到了0.12版本,你想要使用0.12版本的Flask开发第二个Web应用。但是,如果将Flask从0.11版本升级到0.12版本可能会导致第一个Web应用出现故障。解决这个问题的方法最好不过为旧Web应用安装和使用Flask0.11版本,为新Web应用安装和使用Flask0.12版本。

为了解决维护不同应用程序对应不同版本的问题,Python使用了虚拟环境的概念。 虚拟环境是Python解释器的完整副本。在虚拟环境中安装三方包时只会作用到虚拟环境,全局Python解释器不受影响。 那么,就为每个应用程序安装各自的虚拟环境吧。 虚拟环境还有一个好处,即它们由创建它们的用户所拥有,所以不需要管理员帐户。

我们先创建项目目录,我将这个应用命名为microblog

 $ mkdir microblog
$ cd microblog

如果你正在使用Python3,虚拟环境已经成为内置模块,可以直接通过如下命令来创建它:

 $ python3 -m venv venv

译者注:这个命令不一定能够执行成功,比如译者在Ubuntu16.04环境下执行,提示需要先安装对应的依赖。sudo apt-get install python3-venv

使用这个命令来让Python运行venv包,它会创建一个名为venv的虚拟环境。 命令中的第一个“venv”是Python虚拟环境包的名称,第二个是要用于这个特定环境的虚拟环境名称。 如果你觉得这样很混乱,可以用你自定义的虚拟环境名字替换第二个venv。我习惯在项目目录中创建了名为venv的虚拟环境,所以无论何时cd到一个项目中,都会找到相应的虚拟环境。

请注意,在一些操作系统中,你可能需要在上面的命令中使用python而不是python3。 一些安装规范对Python 2.x版本使用python,对3.x版本使用python3,而另一些则将python映射到3.x版本。

命令执行完成后,当前目录下就会新增一个名为venv的目录来存储这个虚拟环境的相关文件。

如果你使用的Python版本低于3.4(包括2.7版本),则不会默认支持虚拟环境。 对于这些版本的Python,在创建虚拟环境之前,需要下载并安装称为virtualenv的第三方工具。 一旦安装了virtualenv,你可以使用以下命令创建一个虚拟环境:

 $ virtualenv venv

不管你用什么方法创建虚拟环境,创建完毕之后还需要激活才能够进入这个虚拟环境。 要激活你的全新虚拟环境,需使用以下命令:

 $ source venv/bin/activate
(venv) $ _

如果你使用的是Microsoft Windows命令提示符窗口,则激活命令稍有不同:

 $ venv\Scripts\activate
(venv) $ _

激活一个虚拟环境,终端会话的环境配置就会被修改,之后你键入python的时候,实际上是调用的虚拟环境中的Python解释器。 此外,终端提示符也被修改成包含被激活的虚拟环境的名称的格式。这种激活是临时的和私有的,因此在关闭终端窗口时它们将不会保留,也不会影响其他的会话。 那么,当你需要同时打开多个终端窗口来调试不同的应用时,每个终端窗口都可以激活不同的虚拟环境而不会相互影响。

成功创建和激活了虚拟环境之后,你可以安装Flask了,命令如下:

 (venv) $ pip install flask

想要验证安装是否成功,可以打开Python解释器,并用import语句来导入它:

 >>> import flask
>>> _

如果语句没有报错,那么恭喜你,Flask安装成功了!

“Hello, World” Flask应用

Flask网站展示了一个仅有五行代码的简单示例应用程序。 而我会告诉你一个稍微更复杂的例子,它将为你编写更大的应用程序提供一个很好的基础结构。

应用程序是存在于中的。 在Python中,包含__init__.py文件的子目录被视为一个可导入的包。 当你导入一个包时,__init__.py会执行并定义这个包暴露给外界的属性。

那就创建一个名为app的包来存放整个应用吧。记得切换到microblog目录下,并执行如下命令:

 (venv) $ mkdir app

并在其下创建文件__init__.py,输入如下的代码:

 from flask import Flask
app = Flask(__name__)
from app import routes

上面的脚本仅仅是从flask中导入的类Flask,并以此类创建了一个应用程序对象。 传递给Flask类的__name__变量是一个Python预定义的变量,它表示当前调用它的模块的名字。当需要加载相关的资源,如我将在第二章讲到的模板文件,Flask就使用这个位置作为起点来计算绝对路径。 代码的最后,应用程序导入尚未存在的routes模块。

这段代码,乍一看可能会让人迷惑。

其一,这里有两个实体名为app。 app包由app目录和__init__.py脚本来定义构成,并在from app import routes语句中被引用。 app变量被定义为__init__.py脚本中的Flask类的一个实例,以至于它成为app包的属性。

其二,routes模块是在底部导入的,而不是在脚本的顶部。 最下面的导入是解决循环导入的问题,这是Flask应用程序的常见问题。 你将会看到routes模块需要导入在这个脚本中定义的app变量,因此将routes的导入放在底部可以避免由于这两个文件之间的相互引用而导致的错误。

那么在routes模块中有些什么? 路由是应用程序实现的不同URL。 在Flask中,应用程序路由的处理逻辑被编写为Python函数,称为视图函数。 视图函数被映射到一个或多个路由URL,以便Flask知道当客户端请求给定的URL时执行什么逻辑。

这是需要写入到app/routes.py中的第一个视图函数的代码:

 from app import app

 @app.route('/')
@app.route('/index')
def index():
return "Hello, World!"

这个视图函数简单到只返回一个字符串作为问候用语。 函数上面的两个奇怪的@app.route行是装饰器,这是Python语言的一个独特功能。 装饰器会修改跟在其后的函数。 装饰器的常见模式是使用它们将函数注册为某些事件的回调函数。 在这种情况下,@app.route修饰器在作为参数给出的URL和函数之间创建一个关联。 在这个例子中,有两个装饰器,它们将URL //index索引关联到这个函数。 这意味着,当Web浏览器请求这两个URL中的任何一个时,Flask将调用该函数并将其返回值作为响应传递回浏览器。这样做是为了在运行这个应用程序的时候会稍微有一点点意义。

要完成应用程序,你需要在定义Flask应用程序实例的顶层(译者注:也就是microblog目录下)创建一个命名为microblog.py的Python脚本。 它仅拥有一个导入应用程序实例的行:

 from app import app

还记得两个app实体吗? 在这里,你可以在同一句话中看到两者。 Flask应用程序实例被称为app,是app包的成员。from app import app语句从app包导入其成员app变量。 如果你觉得这很混乱,你可以重命名包或者变量。

只要确保所做的操作完全正确,那么你就可以看到如下面的项目结构图:

 microblog/
venv/
app/
__init__.py
routes.py
microblog.py

不管你信不信,这个应用的第一个版本现在完成了! 但是在运行之前,需要通过设置FLASK_APP环境变量告诉Flask如何导入它:

 (venv) $ export FLASK_APP=microblog.py

如果你使用Microsoft Windows操作系统,在上面的命令中使用set替换export

万事俱备,只欠东风!运行如下命令来运行你的第一个Web应用吧:

 (venv) $ flask run
* Serving Flask app "microblog"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

服务启动后将处于阻塞监听状态,将等待客户端连接。 flask run的输出表明服务器正在运行在IP地址127.0.0.1上,这是本机的回环IP地址。 这个地址很常见,并有一个更简单的名字,你可能已经看过:localhost。 网络服务器监听在指定端口号等待连接。 部署在生产Web服务器上的应用程序通常会在端口443上进行监听,如果不执行加密,则有时会监听80,但启用这些端口需要root权限。 由于此应用程序在开发环境中运行,因此Flask使用自由端口5000。 现在打开您的网络浏览器并在地址栏中输入以下URL:

    http://localhost:5000/

或者,你也可以使用另一个URL:

 http://localhost:5000/index

应用程序路由映射执行了吗? 第一个URL映射到/,而第二个映射到/ index。 这两个路由都与应用程序中唯一的视图函数相关联,所以它们产生相同的输出,即函数返回的字符串。 如果你输入任何其他网址,则会出现错误,因为只有这两个URL被应用程序识别。

完成演示之后,你可以按下Ctrl-C来停止Web服务。

真是可喜可贺!你已经成功地向成为一名Web开发者的道路上迈出了重要的第一步!

Flask 教程 第一章:Hello, World!的更多相关文章

  1. 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因

    1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...

  2. [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍

    注:为了看上去比较清晰这里只转载了中文 原地址:  [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍 本章将引导您完成安装和设置开发环境,然后你就可 ...

  3. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...

  4. [ABP教程]第一章 创建服务端

    Web应用程序开发教程 - 第一章: 创建服务端 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发 ...

  5. 《进击吧!Blazor!》系列入门教程 第一章 8.部署

    <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...

  6. OpenGL完全教程 第一章 初始化OpenGL

    第一章 初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化.如果你之前使用过GDI,你应该也多多少少了解到GDI在绘制图形之前要为之创建渲染环境.OpenGL也一样.本章给出的代码,大 ...

  7. Flask 教程 第二章:模板

    本文翻译自 The Flask Mega-Tutorial Part II: Templates 在Flask Mega-Tutorial系列的第二部分中,我将讨论如何使用模板. 学习完第一章之后,你 ...

  8. python 教程 第一章、 简介

    第一章. 简介 官方介绍: Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使 ...

  9. Flask 教程 第九章:分页

    本文翻译自The Flask Mega-Tutorial Part IX: Pagination 这是Flask Mega-Tutorial系列的第九部分,我将告诉你如何对数据列表进行分页. 在第八章 ...

随机推荐

  1. php中文乱码原因和维修方法

    一.首先是PHP网页的编码 1.如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/html; charset=gb2312”),静态页面添加,所有文 ...

  2. Java题库——Chapter9 String的用法

    1)Which code fragment would correctly identify the number of arguments passed via the command line t ...

  3. Java入门系列之集合LinkedList源码分析(九)

    前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...

  4. session购物车中的移除功能部分(学生笔记)

    function onclick_remove(r) { if (confirm("确认删除么!此操作不可恢复")) { var out_momey = $(".out_ ...

  5. 怎样使用element-starter快速搭建ElementUI项目

    场景 为了能快速搭建起一个ElementUI项目,我们可以使用element-starter这个模板进行快速搭建. element-starter的Github https://github.com/ ...

  6. The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

    介绍 再使用spring操作mysql数据库报错 @Test public void test() { try { //创建连接池,先使用spring框架内置的连接池 DriverManagerDat ...

  7. PHPStudyLite启动不成功怎么办

    点击环境端口检测 有端口打开则关闭 一切正常后重新开启

  8. 随意看看AtomicInteger类和CAS

    最近在读jdk源码,怎么说呢?感觉收获还行,比看框架源码舒服多了,一些以前就感觉很模糊的概念和一些类的用法也清楚了好多,举个很简单的例子,我在读Integer类的时候,发现了原来这个类自带缓存,看看如 ...

  9. SAP 客户信贷重建一则

    前段时间接到业务的一个需求,需要将标准和定制业务的信贷分开.原来目前公司是将标准和定制的客户信贷金额整在一起,共用一个信贷范围.而定制业务特殊性决定了公司要收到客户全款才会接单生产并发货,而客户打预收 ...

  10. sync.Map与Concurrent Map

    1. sync.Map 1.1. map并发不安全 go1.6以后map有了并发的安全检查,所以如果在并发环境中读写map就会报错 func unsafeMap() { // 创建一个map对象 m ...