Flask 教程 第一章:Hello, World!

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

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

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

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

本章的GitHub连接为: BrowseZipDiff.flask

安装Python

你说你尚未安装Python?那还等什么!立马安装吧。若是操做系统默认没有提供Python安装包,能够从Python官方网站下载。若是你使用Microsoft Windows操做系统而且打算使用WSL或者Cygwin,须要注意,不要在上面使用Windows版本的Python,而要使用类Unix版本,好比从Ubuntu获取(对应WSL)或从Cygwin上获取。浏览器

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

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

 

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

安装Flask

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

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

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

1 $ 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

1 $ mkdir microblog 2 $ cd microblog

若是你正在使用Python3,虚拟环境已经成为内置模块,能够直接经过以下命令来建立它:

1 $ 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,你可使用如下命令建立一个虚拟环境:

1 $ virtualenv venv

无论你用什么方法建立虚拟环境,建立完毕以后还须要激活才可以进入这个虚拟环境。 要激活你的全新虚拟环境,需使用如下命令:

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

若是你使用的是Microsoft Windows命令提示符窗口,则激活命令稍有不一样:

1 $ venv\Scripts\activate 2 (venv) $ _

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

成功建立和激活了虚拟环境以后,你能够安装Flask了,命令以下:

1 (venv) $ pip install flask

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

1 >>> import flask 2 >>> _

 

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

“Hello, World” Flask应用

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

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

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

1 (venv) $ mkdir app

 

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

1 from flask import Flask 2 app = Flask(__name__) 3 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中的第一个视图函数的代码:

1 from app import app 2 
3 @app.route('/') 4 @app.route('/index') 5 def index(): 6     return "Hello, World!"

 

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

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

1 from app import app

 

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

只要确保所作的操做彻底正确,那么你就能够看到以下面的项目结构图:

1 microblog/
2   venv/
3   app/
4     __init__.py 5  routes.py 6   microblog.py

 

无论你信不信,这个应用的第一个版本如今完成了! 可是在运行以前,须要经过设置FLASK_APP环境变量告诉Flask如何导入它:

1 (venv) $ export FLASK_APP=microblog.py

 

若是你使用Microsoft Windows操做系统,在上面的命令中使用set替换export

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

1 (venv) $ flask run 2  * Serving Flask app "microblog" 3  * 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被应用程序识别。

Hello, World!

完成演示以后,你能够按下Ctrl-C来中止Web服务。

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

相关文章
相关标签/搜索