欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1 Flask mega-tutorial(Flask超级教程)第1章 Hello world

程序员文章站 2024-03-23 13:33:16
...

如需转载请注明出处。
win10 64位、Python 3.6.3、Notepad++、Chrome 67.0.3396.99(正式版本)(64 位)
注:作者编写时间2017-12-06,linux、python 3.5.2

以下内容均是加入自己的理解与增删,以记录学习过程。不限于翻译,部分不完全照搬作者Miguel Grinberg的博客,版权属于作者,感谢他提供免费学习的资料。

传送门
00 开篇 01 Hello world 02 模板 03 Web表单
04 数据库 05 用户登录 06 个人资料和头像 07 错误处理
08 关注 09 分页 10 支持QQ邮箱 11 美化页面
12 时间和日期 13 I18n和L10n 翻译成中文 zh-CN 14 Ajax(百度翻译API 15 更好的App结构(蓝图)
16 全文搜索 17 部署到腾讯云Ubuntu 18 部署到Heroku 19 部署到Docker容器
20 JavaScript魔法 21 用户通知 22 后台工作(Redis) 23 应用程序编程接口(API)
我略去安装Python过程。 注:作者编写时间2017-12-06,linux、python 3.5.2 1、创建一个目录,名为:microblog; 2、创建虚拟环境,可参考博文:[虚拟环境使用指南](https://blog.csdn.net/weixin_38256474/article/details/81289702) ``` C:\Users\Administrator>d:

D:>cd D:\microblog

D:\microblog>python -m venv venv

D:\microblog>

3、**虚拟环境:<font color=red>activate</font>

D:\microblog>cd D:\microblog\venv\Scripts

D:\microblog\venv\Scripts>activate
(venv) D:\microblog\venv\Scripts>

注:退出虚拟环境 <font color=red>deactivate</font>

4、安装Flask:<font color=red>pip install flask</font>
安装指定版本的第三方库可用命令:pip install flask==版本号

(venv) D:\microblog\venv\Scripts>pip install flask
Collecting flask
Using cached https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl
Collecting Werkzeug>=0.14 (from flask)
Using cached https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl
Collecting itsdangerous>=0.24 (from flask)
Using cached https://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz
Collecting Jinja2>=2.10 (from flask)
Using cached https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl
Collecting click>=5.1 (from flask)
Using cached https://files.pythonhosted.org/packages/34/c1/8806f99713ddb993c5366c362b2f908f18269f8d792aff1abfd700775a77/click-6.7-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
Using cached https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz
Installing collected packages: Werkzeug, itsdangerous, MarkupSafe, Jinja2, click, flask
Running setup.py install for itsdangerous … done
Running setup.py install for MarkupSafe … done
Successfully installed Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-6.7 flask-1.0.2 itsdangerous-0.24

可看到会附带安装好:Werkzeug, itsdangerous, MarkupSafe, Jinja2, click。
并可在目录D:\microblog\<b>venv\Lib\site-packages</b>下查看到。
上述重要库对应版本:
库名 | 版本号 | 简要说明
- | :-: | -: 
flask | 1.0.2 | 内核
werkzeug | 0.14.1 | 核心1,路由模块
jinja2 | 2.10 | 核心2,模板引擎
itsdangerous | 0.24 | (加密数据)签名模块
MarkupSafe | 0.23 | 为Python实现XML / HTML / XHTML 标记安全字符串
click | 5.1 | 命令行工具库
以上的库均由Armin Ronacher及其Flask团队pallets开发编写。
<font color=red>为什么要详细列出版本号?</font>是为后面运行时可能出现的问题提供指导。有一个方法叫 左手画圆、右手画方。

5、创建一个“Hello,World!” Flask应用程序
<p>0)、该应用程序将存在于一个包(app)中。在Python中,包含<em>__init__.py</em>文件的子目录被视为包,其可被导入。当导入一个包时,<em>__init__.py</em>将会执行并定义“暴露”给外部的标识(告诉你们,我是一个包 package)。</p>
<p>在D:\microblog下创建一个目录,名为<b>app</b>。并写一个<em>__init__.py</em>文件,表明app是一个包 package。</p>

<p><em>__init__.py</em>,它将创建Flask应用程序实例,代码如下:</p>

from flask import Flask#从flask包中导入Flask类

app = Flask(name)#将Flask类的实例 赋值给名为 app 的变量。这个实例成为app包的成员。

#print(‘等会谁(哪个包或模块)在使用我:’,name)

from app import routes#从app包中导入模块routes

#注:上面两个app是完全不同的东西。两者都是纯粹约定俗成的命名,可重命名其他内容。

<p>上述脚本只是创建了一个作为Flask类的实例的应用程序对象,Flask类是从flask包中导入的。传递给Flask类的变量<em>__name__</em>是一个Python预定义的变量,该变量设置为使用它的模块的名字。<font color=red>等会谁使用它?</font>可加入一句打印用于理解,如上(不用时注释掉或删除该行代码)。当应用程序运行时,可看到打印的是<b>包 app</b>。<br>当需要加载如模板文件等相关资源时,Flask将使用此处传递的模块的位置作为起点,这将在第2章中介绍。<br>传递的变量<em>__name__</em>总是以正确的方式配置给Flask。<br>接着,从包 app中导入模块routes,目前尚未编写它。</p>

<p>还注意到:routes模块是在脚本<font color=red>底部导入</font>,而不是顶部,因为它始终是完成的。底部导入是<font color=red>避免循环导入(circular import)问题</font>的解决方法。在接下来的routes模块中,需要导入这个脚本(<em>__init__.py</em>)中的<b>变量app</b>,因此将其放置在底部导入,以避免由这俩个文件之间的相互引用引起的error。</p>
![这里写图片描述](https://img-blog.csdn.net/20180802144205316?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI1NjQ3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

关于 包 package、import导入的问题可参考博文中的一部分:[传送门](https://blog.csdn.net/weixin_38256474/article/details/81228492)
1)、routes模块
<p><b><font color=red>路由</font></b>,是处理<font color=blue>URL</font> 和<font color=blue>函数</font> 之间关系的程序。使用<a href="https://dormousehole.readthedocs.io/en/latest/api.html#flask.Flask.route">route()装饰器</a>来把函数绑定到URL。<br>在Flask中,应用程序 路由的处理程序被编写为Python函数,称为 <em><font color=blue>视图函数</font></em>,例此模块中的<em>index()</em>。 <em><font color=blue>视图函数</font></em>映射到一个或多个路由URL,以便Flask知道客户端请求给定URL时要执行的逻辑(Python代码)。</p>
![这里写图片描述](https://img-blog.csdn.net/20180802150828698?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI1NjQ3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
路由,就会用到<b>路由模块(werkzeug)</b>。Flask使用Werkzeug路由系统,该系统是自动根据复杂度来为路由进行排序的,是有算法的。
一时之间,可能不好理解 路由 概念,可联想到路由器的路由功能来加深理解。

app/routes.py代码:

from app import app#从app包中导入 app这个实例

#2个路由
@app.route(’/’)
@app.route(’/index’)
#1个视图函数
def index():
return “Hello,World!”#返回一个字符串

<code>@app.route</code>装饰器 为<font color=blue>作为一个参数给定的URL</font>和<font color=blue>函数</font>之间创建关联。代码中有两个装饰器,它们共同将URL <code>/</code> 和 <code>/index</code> 关联至<code>index()</code>函数。这意味着当浏览器这俩个URL中任一个时,<b>Flask</b>将调用此函数(<code>index()</code>)并将其<font color=red>返回值(字符串)作为响应 Response</font>传递回浏览器。

2)、为完成这个简单的应用程序,还需在顶层 top-level定义一个Flask应用程序实例 的Python脚本,命名为<em>microblog.py</em>,并仅有一行代码,即导入应用程序实例。代码如下:

from app import app#从app包中导入变量app(它是作为app包成员的变量)

目前为止,项目结构图:
<pre><code>microblog/
  venv/
  app/
    __init__.py
    routes.py
  microblog.py
</code></pre>
3)运行程序。
运行之前,设置<code>FLASK_APP</code>环境变量,它会告诉Flask如何导入刚写的应用程序。

(venv) D:\microblog\venv\Scripts>cd D:\microblog

(venv) D:\microblog>set FLASK_APP=microblog.py

使用命令 <code>flask run</code>运行程序:

(venv) D:\microblog>flask run

  • Serving Flask app “microblog.py
  • Environment: production
    WARNING: Do not use the development server in a production environment.
    Use a production WSGI server instead.
  • Debug mode: off
  • Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    127.0.0.1 - - [02/Aug/2018 16:36:28] “GET / HTTP/1.1” 200 -
    127.0.0.1 - - [02/Aug/2018 16:36:29] “GET /favicon.ico HTTP/1.1” 404 -
    127.0.0.1 - - [02/Aug/2018 16:36:41] “GET /index HTTP/1.1” 200 -
注:<font color=red>环境变量不会在终端中被记住,比如打开新的终端窗口时,得重新设置它</font>。不过,Flask允许注册 在运行flask 命令时要自动导入的环境变量。要使用这个选项,得安装python-dotenv包:

(venv) D:\microblog>pip install python-dotenv

然后,在项目的*目录中创建一个`.env`文件(如microblog/microblog.env),文件中编写环境变量名称、值:

FLASK_APP=microblog.py

[python-dotenv文档](https://pypi.org/project/python-dotenv/)
<br>

服务器初始化后,它将等待客户端链接。<code>flask run</code>命令指示服务器在IP地址127.0.0.1上运行,也即 localhost。
网络服务器侦听<font color=red>特定端口号</font>上的连接。部署在<font color=blue>生产Web服务器</font>上的应用程序通常侦听端口443(若未实施加密,可能是侦听80),但访问这些端口需要管理权限。上述应用程序是<font color=blue>开发环境</font>中运行,Flask将使用免费提供的端口5000。浏览器地址栏输入如下URL并回车:

http://localhost:5000/

或使用其他URL:

http://localhost:5000/index

当分别输入上述URL时,将看到应用程序路由映射在进行中。
![这里写图片描述](https://img-blog.csdn.net/2018080216484568?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI1NjQ3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
第一个URL映射到<code>/</code>;第二个URL映射到<code>/index</code>。两个路由都与应用程序中唯一的视图函数index()相关联,因此它们生成相同的输出(返回的字符串)。
![这里写图片描述](https://img-blog.csdn.net/20180802164326832?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI1NjQ3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
当然,输入其他URL,收到<font color=red>404</font>错误,因为应用程序只能识别这俩个URL。
![这里写图片描述](https://img-blog.csdn.net/20180802164450126?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI1NjQ3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
按Ctrl-C即可将程序停止。

![这里写图片描述](https://img-blog.csdn.net/20180803093221384?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI1NjQ3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

参考:
[作者博客](https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world)

<font color=red>如需转载请注明出处。</font>