一、flask博客项目实战-flask环境准备

oakcdrom0条评论 434 次浏览

一、概述

注意:本文为转载自the-flask-mega-tutorial,以及豆约翰原作者并整合了教程。

本教程的Github地址

重新整理了一下教程,之前按照整合教程做,到蓝图的位置,就不成功了,发现省去了很多步骤。。

环境介绍:

操作系统: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)。预期的输出如下:

file

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

file

有趣的是,这个方法在大多数情况下不适用。假如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代码)。

file

这是需要写入到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就可以自动加载了,如果你钟爱手动设定环境变量,那也不错,只是记得每次启动终端后要设定它。


发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen