[19] [烧瓶里的部落格] 09. 正式部署

本篇的情境是你要把写好的应用部署到服务器上,只会就怎麽建立发行档和安装
不会说明要怎麽选择服务器,要测试的话可以另外开一个虚拟环境

并不建议直接使用这个方法进行正式环境部署
想了解在不同的主机上怎麽部署可以参考官方文件:Deployment Options

Build 和安装

当需要把应用部署到其他地方时,需要建立一个发行文件
目前 Python 的发行标准文件是 wheel 格式的档案,副档名为.whl
先安装 wheel 套件包

pip install wheel

用 Python 执行setup.py会得到用来建立发行档的一个终端机互动工具
bdist_wheel 指令会建立一个 wheel 发行档

python setup.py bdist_wheel

所产生的档案为dist/flaskr-1.0.0-py3-none-any.whl
档案名由专案名称名称、版本号和一些关於专案安装要求的标记组成
像这样:{project name}-{version}-{python tag}-{abi tag}-{platform tag}

复制这个档案到另一台机器或是建立一个新的虚拟环境,然後用 pip 安装这个文件

pip install flaskr-1.0.0-py3-none-any.whl

Pip 会安装项目和相关依赖项目
既然这是一个不同的机器,就需要再次执行init-db指令,在实例资料夹中中建立资料库

export FLASK_APP=flaskr
flask init-db

当 Flask 探测到它已被安装(非编辑模式下)
和前面不同会使用venv/var/flaskr-instance作为实例资料夹

SECRET_KEY

在一开始__init__.py中我们给了 SECRET_KEY 一个预设值dev
但是在正式环境中我们应该使用随机字串
否则骇客就可以使用公开金钥的「dev」来窜改 session 和 cookie 或者其他任何使用这组金钥的东西

可以使用下面的指令输出一个随机金钥

python -c 'import os; print(os.urandom(16))'

>>> b'\t\xa2\x00\x9aax\x88\xfc\xcd\x03\x94-\xe0\xe54\xb7'

接着在实例资料夹建立一个档案config.py
工厂会读取这个档案,如果档案存在的话就把值复制进去用

venv/var/flaskr-instance/config.py

SECRET_KEY = b'\t\xa2\x00\x9aax\x88\xfc\xcd\x03\x94-\xe0\xe54\xb7'

如果有其他必须的参数设定也可以写入该文件中,而 Flaskr 只需要SECRET_KEY

在正式服务器执行

我们在这篇的最一开始提过,不该直接用内建的开发服务器(flask run)部署在正式环境
开发用服务器为了方便起见使用 Werkzeug,问题是他不是为了效能、稳定和安全而生的

应该使用正式的 WSGI 服务器,例如 Waitress

第一步我们先在虚拟环境中安装

pip install waitress

你要告诉 Waitree 关於你的专案,但不是像在使用flask run的时候透过FLASK_APP
而是引用并呼叫应用工厂来得到一个应用程序物件

waitress-serve --call 'flaskr:create_app'

>>> INFO:waitress:Serving on http://0.0.0.0:8080

其他还有很多不同的部署方式,不论是云端主机或是自行架设主机的方案:Deployment Options
会选择使用 Waitress 示范是因为他同时支援 Windows、Mac 和 Linux 系统
还有其他许多 WSGI 服务器和部署选项可供选择!


<<:  Re-architect - ContextMenuView

>>:  Day 18 Flask 错误处理与回应

万事真能从影片完整复制学习吗?(教与学篇)

我们看电视综艺节目的森川葵,不管学习什麽技艺,都能很快学会,让教的人相当惊讶,且啧啧称奇,把这个电视...

30天程序语言研究

今天是30天程序语言研究的第九天,研究的语言一样是python,今天主要学习的是档案的写入和写出 网...

缺乏计画的目标,只能叫做愿望。----目标设定篇(上)

缺乏计画的目标,只能叫做愿望。 A goal without a plan is just a wi...

Day21 探讨setting(3)

昨天我们已经介绍到ALLOW_HOSTS了,那我们今天就继续介绍吧! 下一个我们看到的是INSTAL...

DAY29 CNN(卷积神经网路 续三)

昨天介绍完CNN卷积神经网路反向传播程序,今天要来研究CNN卷积神经网路实际运作程序: 首先是全部正...