一、flask博客项目实战-flask环境准备
一、概述
注意:本文为转载自the-flask-mega-tutorial,以及豆约翰和原作者并整合了教程。
重新整理了一下教程,之前按照整合教程做,到蓝图的位置,就不成功了,发现省去了很多步骤。。
环境介绍:
操作系统:CentOS7.8 mini
python版本:python3.9
flask版本:1.1.2
通过学习本章内容,你将学会如何创建一个Flask项目,并在自己的电脑上运行一个简单的Flask Web应用。
教程中所有的代码示例都托管在GitHub上。虽然直接从GitHub下载代码可以节省写代码的步骤,但是我强烈建议你至少在前几章自己动手书写这些代码。一旦你熟悉了Flask和示例应用,一些繁琐重复的代码就可以直接从GitHub复制了。
二、安装python3.9
你说你还没有安装Python?那还等什么!立马安装吧。如果操作系统默认没有提供Python安装包,可以从Python官方网站下载。如果你使用Windows操作系统并且打算使用WSL或者Cygwin,需要注意,不要在上面使用Windows版本的Python,而要使用类Unix版本,比如从Ubuntu获取(对应WSL)或从Cygwin上获取。
# yum install sqlite* -y
# wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz
# tar Jxvf Python-3.9.0.tar.xz
# cd Python-3.9.0
# ./configure --prefix=/usr/local/python3
# make && make install
#ln -s /usr/local/python3/bin/python3 /usr/bin/python3
# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
为了验证Python是否正确安装,你可以打开一个终端窗口并输入python3(如果不存在这个命令,那就输入python)。预期的输出如下:
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命令如下:
# pip3 install flask
有趣的是,这个方法在大多数情况下不适用。假如Python解释器是全局安装的,所有用户都能使用,那么普通用户则没有权限来修改它,因此只能用管理员账户来执行安装操作。即使忽略操作的复杂性,使用这种全局安装的方式会发生什么?pip工具从PyPI上下载三方包并安装到全局Python目录下,即刻起,所有Python脚本都可以访问到这个三方包。想象这样一个场景,你之前用当时的最新版本Flask——1.0版本的Flask开发了一个Web应用,现在Flask已经更新到了1.12版本,你想要使用1.12版本的Flask开发第二个Web应用。但是,如果将Flask从1.0版本升级到1.12版本可能会导致第一个Web应用出现故障。解决这个问题的方法最好不过为旧Web应用安装和使用Flask1.0版本,为新Web应用安装和使用Flask1.12版本。
为了解决维护不同应用程序对应不同版本的问题,Python使用了虚拟环境的概念。 虚拟环境是Python解释器的完整副本。在虚拟环境中安装三方包时只会作用到虚拟环境,全局Python解释器不受影响。 那么,就为每个应用程序安装各自的虚拟环境吧。 虚拟环境还有一个好处,即它们由创建它们的用户所拥有,所以不需要管理员帐户。
我们先创建项目目录,我将这个应用命名为blog:
# mkdir microblog
# cd microblog
如果你正在使用Python3,虚拟环境已经成为内置模块,可以直接通过如下命令来创建它:
# python3 -m venv venv
命令执行完成后,当前目录下就会新增一个名为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) # pip3 install flask
想要验证安装是否成功,可以打开Python解释器,并用import语句来导入它:
>>> import flask
>>> _
如果语句没有报错,那么恭喜你,Flask安装成功了!
库名 | 版本号 | 内核 |
---|---|---|
flask | 1.1.2 | 内核 |
werkzeug | 0.14.1 | 核心1,路由模块 |
jinja2 | 2.10 | 核心2,模板引擎 |
itsdangerous | 0.24 | (加密数据)签名模块 |
MarkupSafe | 0.23 | 为Python实现XML / HTML / XHTML 标记安全字符串 |
click | 5.1 | 命令行工具库 |
"Hello, World" Flask应用
Flask网站展示了一个仅有五行代码的简单示例应用程序。 而我会告诉你一个稍微更复杂的例子,它将为你编写更大的应用程序提供一个很好的基础结构。
应用程序是存在于包中的。 在Python中,包含init.py文件的子目录被视为一个可导入的包。 当你导入一个包时,init.py会执行并定义这个包暴露给外界的属性。
那就创建一个名为app的包来存放整个应用吧。记得切换到microblog目录下,并执行如下命令:
(venv) # mkdir app
并在其下创建文件init.py,输入如下的代码:
from flask import Flask #从flask包中导入Flask类
app = Flask(__name__) #将Flask类的实例 赋值给名为 app 的变量。这个实例成为app包的成员。
#print('等会谁(哪个包或模块)在使用我:',__name__)
from app import routes #从app包中导入模块routes
#注:上面两个app是完全不同的东西。两者都是纯粹约定俗成的命名,可重命名其他内容。
上述脚本只是创建了一个作为Flask类的实例的应用程序对象,Flask类是从flask包中导入的。传递给Flask类的变量name是一个Python预定义的变量,该变量设置为使用它的模块的名字。可加入一句打印用于理解,如上(不用时注释掉或删除该行代码)。当应用程序运行时,可看到打印的是包 app。
当需要加载如模板文件等相关资源时,Flask将使用此处传递的模块的位置作为起点。
传递的变量name总是以正确的方式配置给Flask。
接着,从包 app中导入模块routes,目前尚未编写它。
还注意到:routes模块是在脚本底部导入,而不是顶部,因为它始终是完成的。底部导入是避免循环导入(circular import)问题的解决方法。在接下来的routes模块中,需要导入这个脚本(init.py)中的变量app,因此将其放置在底部导入,以避免由这俩个文件之间的相互引用引起的error。
routes模块
路由,是处理URL 和函数 之间关系的程序。使用route()装饰器来把函数绑定到URL。
在Flask中,应用程序 路由的处理程序被编写为Python函数,称为 视图函数,例此模块中的index()。 视图函数映射到一个或多个路由URL,以便Flask知道客户端请求给定URL时要执行的逻辑(Python代码)。
这是需要写入到app/routes.py中的第一个视图函数的代码:
from app import app #从app包中导入 app这个实例
#2个路由
@app.route('/')
@app.route('/index')
#1个视图函数
def index():
return "Hello, World!" #返回一个字符串
@app.route装饰器 为作为一个参数给定的URL和函数之间创建关联。代码中有两个装饰器,它们共同将URL / 和 /index 关联至index()函数。这意味着当浏览器这俩个URL中任一个时,Flask将调用此函数(index())并将其返回值(字符串)作为响应 Response传递回浏览器。
要完成应用程序,你需要在定义Flask应用程序实例的顶层(译者注:也就是blog目录下)创建一个命名为blog.py的Python脚本。 它仅拥有一个导入应用程序实例的行:
from app import app #从app包中导入变量app(它是作为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 "blog"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
如果想要局域网其他机器访问,需要使用命令
flask run -h 172.16.100.4 -p 5000
服务启动后将处于阻塞监听状态,将等待客户端连接。 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开发者的道路上迈出了重要的第一步!
在结束本章节之前,我想提醒一下你,在终端会话中直接设置的环境变量不会永久生效,因此你不得不在每次新开终端时设定 FLASK_APP 环境变量,从 1.0 版本开始,Flask 允许你设置只会在运行flask命令时自动注册生效的环境变量,要实现这点,你需要安装 python-dotenv
:
(venv) # pip3 install python-dotenv
此时,在项目的根目录下新建一个名为 .flaskenv 的文件,其内容是:
FLASK_APP=microblog.py
通过此项设置,FLASK_APP就可以自动加载了,如果你钟爱手动设定环境变量,那也不错,只是记得每次启动终端后要设定它。
共有 0 条评论