[Python] flask运行+wsgi切换生产环境+supervisor配置指南

news2024/7/6 18:57:33

文章目录

      • 问题背景
      • flask启动
        • 方式1(编写main函数):
        • 方式2(编译器):
        • 方式3(命令行):
        • 方法4(重命名文件法):
        • 方法5(使用flask命令行):
      • 关于WSGI
      • 生产环境
        • 专业wsgi服务器
        • 托管平台
      • 自动化管理
        • yum安装supervisor

问题背景

flask项目本地启动时,控制台会打印如下warning

WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

在这里插入图片描述
翻译成 人话就是,“我这个环境就是你开发时用,实际生产的时候可别找我,出事我不负责。”

好家伙呀。


但是他指了另外一条路:Use a production WSGI server

依然还是带着问题学习,从本篇文章可以了解如下内容

  1. flask本身自带的为啥不能用?
  2. 他推荐的是什么?为什么他能用?
  3. 怎么部署一个wsgi?以及后续怎么用?

额外知识补充:flask的多种启动方式

Before we start, 本教程假设你已经有一个flask应用并准备部署了。

flask启动

方式1(编写main函数):

直接在文件里写个main函数然后运行

if __name__ == '__main__':
    # 本地启动
    # 这里的HOST_IP及SERVER_PORT可以自己设置
    app.run(host=HOST_IP, port=SERVER_PORT, debug=True)

方式2(编译器):

我用的是pyCharm,可以直接进行配置
在这里插入图片描述
按照如下方式进行配置,首先点击左上角加号,分类为Flask server,Additional options为运行的额外参数,需要在变量位置增加FLASK_APP=你的py文件地址。这里的py文件就是你包含了app = Flask(__name__) 这行代码的文件。

在这里插入图片描述
启动起来啦
在这里插入图片描述

在命令行中运行如下命令启动

flask run
或
python -m flask run

在这里插入图片描述

如果需要其他用户访问,则需要设置ip

flask run --host=0.0.0.0

方式3(命令行):

依然先设置环境变量,在终端中输入(非常关键的是等号旁边不要有空格!)

set FLASK_APP=D:\Code\ctb_v2\app\controllers\hello.py

检查一下设置成功没有
在这里插入图片描述
输入flask run 运行应用

在这里插入图片描述

方法4(重命名文件法):

可以把文件命名为app.py或者wsgi.py,再进入到该文件的文件夹,运行flask run启动项目。

在这里插入图片描述

方法5(使用flask命令行):

通过flask --app的命令行进行设置
在这里插入图片描述

关于WSGI

wsgi是啥?全称是Python Web Server Gateway Interface。由此可以看出它是接口,并非一个统称的服务器类型。它提供了web服务器和web应用之间的通用接口,服务器和框架的开发者需要按照WSGI的规则去实现。

需要注意的是
Flask应用本身就是一个WSGI应用!
直接看代码

# 位于flask\app.py文件
  def __call__(self, environ: dict, start_response: t.Callable) -> t.Any:
        """The WSGI server calls the Flask application object as the
        WSGI application. This calls :meth:`wsgi_app`, which can be
        wrapped to apply middleware.
        """
        return self.wsgi_app(environ, start_response)

可以看到它直接Flask app创建时实际是引用了wsgi_app.

因此回看那条报错,实际上它是说,启动flask的开发wsgi(内置)服务器不稳定,生产环境要用生产的wsgi服务器。

生产环境

在生产环境中,可以使用生产wsgi服务器或托管平台来运行flask应用。以下分别进行简单介绍。

专业wsgi服务器

1. Gunicorn

全称令人意想不到:Green Unicorn哈哈哈。

  • 不支持Windows
  • 不需要额外的依赖或编译、易安装
  • 使用方式:gunicorn myproject:app,这就等于python文件中写的 from myproject import app
  • 可设定进程数:gunicorn -w 4 myproject:app 表示要运行4个进程
  • 可开放外部访问:gunicorn -b 0.0.0.0 -w 4 myproject:app
  • 可gevent 或 eventlet 进行异步操作

2. Waitress

  • 支持windows
  • 不需要额外的依赖或编译、易安装
  • 不支持流式请求
  • 创建一个进程,由进程创建多个线程
  • 使用方式:waitress-serve --host 0.0.0.0 hello:app 等于 ‘from hello import app’
  • 若为工厂方法:waitress-serve --host 127.0.0.1 --call hello:create_app 等于 ‘from hello import create_app’

3. mod_wsgi

  • 支持windows
  • 与Apache httpd集成
  • 需要编译器和apache开发头文件来安装,可以参考这个文章apache+mod_wsgi+flask部署

4. uWSGI

  • 不支持Windows
  • 配置复杂
  • 是已编译的服务器套件
  • 支持gevent异步操作

托管平台

常见的托管平台包括以下,这里不展开了。

  • PythonAnywhere
  • Google App Engine
  • Google Cloud Run
  • AWS Elastic Beanstalk
  • Microsoft Azure

自动化管理

为了方便进程管理,这里使用supervisor来管理我们的服务,例如后台运行,重启,日志输出等等都可以通过supervisor进行控制。

可以使用两种方式进行安装,推荐yum(如果系统是centOS) ,通过pip或者agt(Ubuntu)进行安装步骤会多一些。以下介绍yum的安装方式

开始之前,先区分几个名词

supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program和supervisor服务本身。

yum安装supervisor

1. 安装

#切换为root用户
sudo su 
yum install epel-release
yum install -y supervisor
# 开机自启动
systemctl enable supervisord 
# 启动supervisord服务
systemctl start supervisord 
# 查看supervisord服务状态
systemctl status supervisord 
# 查看是否存在supervisord进程
ps -ef|grep supervisord 

2. 配置
访问supervisord的配置文件

vim /etc/supervisord.conf 

在这里插入图片描述
这个文件夹保存的是supervisor管理的服务的配置文件
我们去这个文件夹下面创建文件

vim /etc/supervisord.d/myprogram.init

这里面具体怎么写,也可以参考刚刚/etc/supervisord.conf 文件,以下提供一个示例

[program:你的服务名]   
; 启动命令 以下为gunicorn的实例,按实际情况来,比如:flask run
; 具体命令参考上面flask启动那一章
command=gunicorn pygun.conf wsgi:app --log-level=debug --preload
; 工作目录(脚本启动目录的全路径)
directory=/a/b/c
; 进程数
numprocs=1
; supervisord尝试启动一个程序时尝试的次数。默认是3
startretires=5
; supervisord守护程序启动时自动启动
autostart=true    
; supervisord守护程序重启时自动重启     
autorestart=true
;将stderr重定向到stdout        
redirect_stderr=true   
; 日志标准输出路径,同时脚本print打印信息也会在改文件显示
stdout_logfile=./stdout.log
stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
stderr_logfile=./error.log
stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)

3. 加载配置

#读取有更新的配置文件,不会启动新添加的程序
supervisorctl reread
#重启配置文件修改过的程序
supervisorctl update
#启动xx程序
supervisorctl start 你的服务名名
#查看所有服务状态
supervisorctl status

参考

  1. flask的官方使用教程:https://flask.palletsprojects.com/en/2.2.x/quickstart/
  2. flask的官方部署教程:https://flask.palletsprojects.com/en/2.2.x/deploying/
  3. WSGI官方文档:https://peps.python.org/pep-0333/
  4. 其他博主的文章:centos7安装supervisor详细教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

欧盟新规,燃油噩梦?2025年起,高速公路每60公里设立一处快充站

根据外媒The Verge报道,欧洲电动汽车用户将获得更多便捷的待遇,同时还能减少有害温室气体排放,这得益于欧盟理事会最新通过的法规。 根据欧盟的法规要求,自2025年起,TEN-T高速公路系统在欧洲将需要每隔60公里设立一座高…

WEB:ics-07

背景知识 php弱类型 文件上传漏洞 一句话木马 floatval函数 题目 点击项目管理 点击查看源代码&#xff0c;发泄一个view-source.php 访问该网页 进行代码审计 <?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) &…

ant design vue a-table表格中插入操作按钮(以switch开关 [a-switch]为例)

1.给columns添加列属性 columns() {sortedInfo sortedInfo || {};return [{title: "工程",dataIndex: "outputProject",width: 80},{title: "是否显示小数",dataIndex: "showDecimalsOrnot",width: 80,scopedSlots: { customRender:…

页面设计—FixedContainer固定容器组件详解

一、组件介绍 可任意拖动位置&#xff0c;脱离文档流布局&#xff0c;生成绝对定位的元素 二、如何使用 1、找到FixedContainer组件&#xff0c;拖放到页面位置。 2、设置是否拖动&#xff0c;设置高级样式&#xff0c;也可以在自定义样式里编写css样式 操作步骤如下&…

IO进程线程,标准IO函数

一、什么是IO I&#xff1a;input --->输入&#xff0c;从外部存储设备将数据输入到内存中。 O&#xff1a;output --->输出&#xff0c;数据从内存到外部存储设备。 总结&#xff1a;输入输出就是数据从外存到内存&#xff0c;内存到外存的流向。 二、IO分类 1. 文件…

Arcgis之 KML/KMZ文件转shp

一般我们在Goole Earth上勾画的区域导出后都为KML或者KMZ格式的&#xff0c;但无法在arcgis等软件上直接应用&#xff0c;故需进行一定的转换 1.打开ArcMap&#xff0c;选择ArcToolbox->Conversion Tools->From KML->KML To Layer 得到如下结果&#xff08;由于本KML…

三菱PLC 流水灯控制

方式一思路&#xff1a;每一秒让计数器 C0 的值加一&#xff0c;然后将 C0 对应的值赋值给输出灯 Y10 - Y15。 方式二思路&#xff1a;每一秒让寄存器 D0 的值向左移1位&#xff0c;然后使用组合位元件将 D0 的低八位值传送给输出灯 Y10 - Y17。 后面有更好的思路再来增加。

【Ajax】笔记-使用fetch函数发送AJAX请求

fetch()函数说明与使用方法详解 fetch()是XMLHttpRequest的升级版,用于在JavaScript脚本里面发出 HTTP请求,本文章向大家介绍fetch()的用法,主要包括fetch()的用法使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参…

S-NER: A Concise and Efficient Span-Based Model for NamedEntity Recognition

原文链接&#xff1a;Sensors | Free Full-Text | S-NER: A Concise and Efficient Span-Based Model for Named Entity Recognition Sensors 2022 介绍 NER中的序列标注模型使用条件随机场&#xff08;CRF&#xff09;来获取标签之间的依赖性&#xff0c;存在误差传播的问题&a…

Docker可视化管理工具Portainer多机器安装使用

一、首先得安装docker Docker安装并指定主目录:https://blog.csdn.net/wdy_2099/article/details/77367107 二、使用docker方式安装portainer 安装命令如下&#xff1a; docker run -it -d \-p 8999:9000 \--name portainer \--restart always \-v /var/run/docker.sock:/v…

@vue/cli安装

vue/cli安装 1、全局安装vue/cli包2、查看是否成功 1、全局安装vue/cli包 yarn global add vue/cli2、查看是否成功 vue -V

React Dva项目中模仿网络请求数据方法

我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…

Qt 添加MySQL驱动教程 以及 操作数据库(增删查改)

前言&#xff1a; 使用MySQL数据库前我们必须添加MySQL驱动&#xff0c;有了驱动我们才能连接数据库&#xff0c;连接数据库成功后才能操作数据库&#xff08;增删查改&#xff09;。 Qt 添加MySQL驱动教程 如下&#xff08;本人亲测成功版&#xff09;&#xff1a; https://do…

【SQL语句】

目录 一、SQL语句类型 1.DDL 2.DML 3.DLL 4.DQL 二、数据库操作 1.查看 2.创建 2.1 默认字符集 2.2 指定字符集 3.进入 4.删除 5.更改 5.1 库名称 5.2 字符集 三、数据表操作 1.数据类型 1.1 数值类型&#xff08;常见&#xff0c;下同&#xff09; 1.1.1 T…

【IDEA】IDEA 中点击Download Source(下载源码)后,下载的源码存储到哪了?

【问】如上图&#xff0c;IDEA 中点击 Download Source&#xff08;下载源码&#xff09;后&#xff0c;下载的源码存储到哪了&#xff1f; 【答】 先找到此源码所属 Jar 包在哪&#xff1b;点击 Download Source&#xff08;下载源码&#xff09;后&#xff0c;会发现存储 J…

文件读写流函数

文件 文件读写 链接 std::ifstream---std::ofstream 头文件--#include <fstream> 执行都是类&#xff0c;用这些类操作文件都要建立对象流。 1&#xff0c;建立对象流 流对象的建立有两种方式&#xff1a; &#xff08;1&#xff09;使用fstream类可以不指定文件和…

C# winform子窗口向父窗口传值

这里我使用一个简单的方法。只需要在父窗口定义一个静态变量就行。 父窗体为Form1,子窗体为Form2。 public static int get_num0; 子窗体直接给get_num赋值即可。 Form1.get_num2; 这样父窗体就能获得get_num修改后这个值了

若依vue 多table前端HTML页面导出一张Excel表

前言 导入依赖&#xff0c;具体前端vue配置就不介绍了&#xff0c;直接晒具体细节代码 实现 需要在多table外加div&#xff0c;其他都是基本操作js代码 import FileSaver from file-saver import * as XLSX from "xlsx";const htmlToExcel {getExcelNew(classNam…

实验二十四、滞回比较器电压传输特性的测量

一、题目 滞回比较器电压传输特性的测量。 二、仿真电路 电路如图1所示。 为便于观察电压传输特性的变化&#xff0c;输入信号采用信号发生器产生的幅值为 10 V 10\,\textrm V 10V、频率为 20 Hz 20\,\textrm{Hz} 20Hz 的三角波电压。采用虚拟的运算放大电路&#xff0c;其…

自学网络安全(黑客)两个月都没入门?

最近我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给你一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后…