http://www.bjhee.com/flask-ad8.html

到目前为止,我们启动Flask应用都是通过”app.run()”方法,在开发环境中,这样固然可行,不过到了生产环境上,势必需要采用一个健壮的,功能强大的Web应用服务器来处理各种复杂情形。同时,由于开发过程中,应用变化频繁,手动将每次改动部署到生产环境上很是繁琐,最好有一个自动化的工具来简化持续集成的工作。本篇,我们就会介绍如何将上一篇中Flask的应用程序自动打包,分发,并部署到像Apache, Nginx等服务器中去。

系列文章

  • Flask进阶系列(一)–上下文环境
  • Flask进阶系列(二)–信号
  • Flask进阶系列(三)–Jinja2模板引擎
  • Flask进阶系列(四)–视图
  • Flask进阶系列(五)–文件和流
  • Flask进阶系列(六)–蓝图(Blueprint)
  • Flask进阶系列(七)–应用最佳实践
  • Flask进阶系列(八)–部署和分发
  • Flask进阶系列(九)–测试

使用setuptools打包Flask应用

首先,你要了解基本的使用setuptools打包分发Python应用程序的方法。接下来,就让我们开始写一个”setup.py”文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

from setuptools import setup
setup(
    name='MyApp',
    version='1.0',
    long_description=__doc__,
    packages=['myapp','myapp.main','myapp.admin'],
    include_package_data=True,
    zip_safe=False,
    install_requires=[
        'Flask>=0.10',
        'Flask-Mail>=0.9',
        'Flask-SQLAlchemy>=2.1'
    ]
)

把文件放在项目的根目录下。另外,别忘了,还要写一个”MANIFEST.in”文件:

1
2

recursive-include myapp/templates *
recursive-include myapp/static *

编写完毕后,你可以创建一个干净的虚拟环境,然后运行安装命令试下效果。

$ python setup.py install

使用Fabric远程部署Flask应用

同样,你需要先了解如何使用Fabric来远程部署Python应用。然后,我们来编写”fabfile.py”文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

from fabric.api import *
env.hosts = ['example1.com', 'example2.com']
env.user = 'bjhee'
def package():
    local('python setup.py sdist --formats=gztar', capture=False)
def deploy():
    dist = local('python setup.py --fullname', capture=True).strip()
    put('dist/%s.tar.gz' % dist, '/tmp/myapp.tar.gz')
    run('mkdir /tmp/myapp')
    with cd('/tmp/myapp'):
        run('tar xzf /tmp/myapp.tar.gz')
        run('/home/bjhee/virtualenv/bin/python setup.py install')
    run('rm -rf /tmp/myapp /tmp/myapp.tar.gz')
    run('touch /var/www/myapp.wsgi')

上例中,”package”任务是用来将应用程序打包,而”deploy”任务是用来将Python包安装到远程服务器的虚拟环境中,这里假设虚拟环境在”/home/bjhee/virtualenv”下。安装完后,我们将”/var/www/myapp.wsgi”文件的修改时间更新,以通知WSGI服务器(如Apache)重新加载它。对于非WSGI服务器,比如uWSGI,这条语句可以省去。

编写完后,运行部署脚本测试下:

$ fab package deploy

使用Apache+mod_wsgi运行Flask应用

Flask应用是基于WSGI规范的,所以它可以运行在任何一个支持WSGI协议的Web应用服务器中,最常用的就是Apache+mod_wsgi的方式。上面的Fabric脚本已经完成了将Flask应用部署到远程服务器上,接下来要做的就是编写WSGI的入口文件”myapp.wsgi”,我们假设将其放在Apache的文档根目录在”/var/www”下。

1
2
3
4
5
6
7
8
9
10
11
12

activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/bjhee/.python-eggs'
import sys;
sys.path.append("/var/www")
from myapp import create_app
import config
application = create_app('config')

注意上,你需要预先创建配置文件”config.py”,并将其放在远程服务器的Python模块导入路径中。上例中,我们将”/var/www”加入到了Python的模块导入路径,因此可以将”config.py”放在其中。另外,记得用setuptools打包时不能包括”config.py”,以免在部署过程中将开发环境中的配置覆盖了生产环境。

在Apache的”httpd.conf”中加上脚本更新自动重载和URL路径映射:

WSGIScriptReloading On
WSGIScriptAlias /myapp /var/www/myapp.wsgi

重启Apache服务器后,就可以通过”http://example1.com/myapp”来访问应用了。

使用Nginx+uWSGI运行Flask应用

你要先准备好Nginx+uWSGI的运行环境,然后编写uWSGI的启动文件”myapp.ini”:

[uwsgi]
socket=127.0.0.1:3031
callable=app
mount=/myapp=run.py
manage-script-name=true
master=true
processes=4
threads=2
stats=127.0.0.1:9191
virtualenv=/home/bjhee/virtualenv

再修改Nginx的配置文件,Linux上默认是”/etc/nginx/sites-enabled/default”,加上目录配置:

location /myapp {include uwsgi_params;uwsgi_param SCRIPT_NAME /myapp;uwsgi_pass 127.0.0.1:3031;
}

重启Nginx和uWSGI后,就可以通过”http://example1.com/myapp”来访问应用了。

你也可以将我们的应用配置为虚拟服务器,只需要将上述uWSGI的配置移到虚拟服务器的配置文件中即可。关于Nginx虚拟服务器的配置,可以参考我之前的文章。

使用Tornado运行Flask应用

Tornado的强大之处在于它是非阻塞式异步IO及Epoll模型,采用Tornado的可以支持数以万计的并发连接,对于高并发的应用有着很好的性能。本文不会展开Tornado的介绍,感兴趣的朋友们可以参阅其官方文档。使用Tornado来运行Flask应用很简单,只要编写下面的运行程序,并执行它即可:

1
2
3
4
5
6
7
8
9
10
11

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from myapp import create_app
import config
app = create_app('config')
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()

之后你就可以通过”http://example1.com:5000″来访问应用了。

使用Gunicorn运行Flask应用

Gunicorn是一个Python的WSGI Web应用服务器,是从Ruby的Unicorn移植过来的。它基于”pre-fork worker”模型,即预先开启大量的进程,等待并处理收到的请求,每个单独的进程可以同时处理各自的请求,又避免进程启动及销毁的开销。不过Gunicorn是基于阻塞式IO,并发性能无法同Tornado比。更多内容可以参阅其官方网站。另外,Gunicorn同uWSGI一样,一般都是配合着Nginx等Web服务器一同使用。

让我们先将应用安装到远程服务器上,然后采用Gunicorn启动应用,使用下面的命令即可:

$ gunicorn run:app

解释下,因为我们的应用使用了工厂方法,所以只在run.py文件中创建了应用对象app,gunicorn命令的参数必须是应用对象,所以这里是”run:app”。现在你就可以通过”http://example1.com:8000″来访问应用了。默认监听端口是8000。

假设我们想预先开启4个工作进程,并监听本地的5000端口,我们可以将启动命令改为:

$ gunicorn -w 4 -b 127.0.0.1:5000 run:app

本篇中的示例代码可以在这里下载。

转载于:https://www.cnblogs.com/davidwang456/articles/9548866.html

Flask部署和分发相关推荐

  1. flask部署机器学习_如何开发端到端机器学习项目并使用Flask将其部署到Heroku

    flask部署机器学习 There's one question I always get asked regarding Data Science: 关于数据科学,我经常被问到一个问题: What ...

  2. 用flask部署模型

    模型部署:用flask部署模型 1.https://zhuanlan.zhihu.com/p/35879835 2.https://blog.keras.io/building-a-simple-ke ...

  3. flask部署阿里云服务器,公网ip访问不了(一些问题及解答)

    flask部署阿里云服务器,公网ip访问不了(新手踩坑之路) 好朋友,你是不是一个后端初学者?相信到目前为止,你已经拥有一定的后端基础,在发现单机本地的后端开发已经无法满足你,于是你刚买一个云服务器. ...

  4. flask文件部署服务器,flask部署到云服务器

    flask部署到云服务器 内容精选 换一换 此用户指南描述如何使用华为云企业管理服务快速部署弹性云服务器与SAP S/4HANA软件,在部署前,您必须熟悉SAP解决方案及与SAP解决方案相关的华为云服 ...

  5. 在线部分:werobot服务、主要逻辑服务、句子相关模型服务、BERT中文预训练模型+微调模型(目的:比较两句话text1和text2之间是否有关联)、模型在Flask部署

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 智能对话系统:Unit对话API 在线聊天的总体架构与工具介绍 ...

  6. AI常用框架和工具丨11. 基于TensorFlow(Keras)+Flask部署MNIST手写数字识别至本地web

    代码实例,基于TensorFlow+Flask部署MNIST手写数字识别至本地web,希望对您有所帮助. 文章目录 环境说明 文件结构 模型训练 本地web创建 实现效果 环境说明 操作系统:Wind ...

  7. 学习笔记|Flask部署Pytorch模型+Gunicorn+Docker

    一.使用Flask部署Pytorch模型 其实原理很简单,我们希望使用一个已经训练好的pytorch模型,用它做预测或生成.我们的模型部署在服务器上,客户端可以通过http request调用我们部署 ...

  8. Linux 脚本部署应用宝,腾讯合作伙伴大会开幕在即 应用宝或再升级部署内容分发...

    原标题:腾讯合作伙伴大会开幕在即 应用宝或再升级部署内容分发 11月9日上午,腾讯合作伙伴大会应用分论坛将于成都召开,本届应用论坛邀请到多位行业大咖上演巅峰对话,对当下后智能时代,应用分发遇到的瓶颈进 ...

  9. python flask 部署_如何进行Python Flask项目的部署?

    先把项目传到git上,然后clone到服务器,记得先把需要的库以及版本写到 requirements.txt中 Flask==0.10.1 Flask-Bootstrap==3.0.3.1 Flask ...

最新文章

  1. Asp.net core 学习笔记 ( Web Api )
  2. C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧
  3. wingIDE右侧文件列表移动到左侧
  4. 路由器装上去没有网络_5G网络那么快,今后路由器没有存在的价值了?
  5. datetime方法
  6. 看我出招之:svchost.exe文件删不得
  7. LeetCode(811)——子域名访问计数(JavaScript)
  8. 使用MyBatis框架连接MySQL数据库查询记录,全部步骤
  9. java中map函数指针_如何用Rust编写合适的map函数?
  10. ABAQUS6.10 VS2008 Intel fortan11.1
  11. Linux下如何使用搜狗词库
  12. Android Intent详解
  13. c语言且或者是优先级,C语言笔试题
  14. 亚洲杯:艾因月夜,里皮妙手导演逆转
  15. JAVA基础学习博客007
  16. matplotlib之pyplot模块之坐标轴配置(axis():设置坐标轴外观、设置坐标轴范围)
  17. C/C++ error/exception throw: access violation reading location 0x....;
  18. csv逗号分隔符转换_pythonpandas读写csv数据
  19. OTB和VOT的评估指标
  20. 搭建Remix IDE本地开发环境

热门文章

  1. linux java ocr_Linux环境如何支持使用tess4j进行ORC
  2. lstm结构图_神经网络——单层LSTM
  3. php设置key,phpstorm8 设置及license key
  4. EasyX实现推箱子游戏
  5. 微信 商城 php,PHP微信商城
  6. mysql数据库未启动失败_mysql数据库启动失败
  7. add多个文件 git 文件夹_利用 git 提取文件夹下多个特定文件里的内容写到特定文件内...
  8. sql delete删除的数据怎么恢复_如何恢复按下Shift + DELETE键永久删除的文件和资料夹?...
  9. java平台设计zhe_基于java平台的网上评教系统的设计与实现
  10. volley 调用php接口,使用Volley发送帖子请求并使用PHP接收