#!usr/bin/env python
#encoding:utf-8
from __future__ import division
__Author__:沂水寒城
功能: gunicorn+flask Demo
from flask import *
#过滤掉警示信息
import warnings
warnings.filterwarnings("ignore")
启动命令如下所示:
gunicorn -w 10 -b 0.0.0.0:5000 myApp:app
在Linux终端执行上面的命令后就可以看到相应的输出了,这里就不进行展示了,后面会有具体的实例。
下午了解到的启动方式主要有两种,上面的直接命令行启动是第一种方式,第二种方式是基于配置文件的启动,这里就需要编写一个config.py的配置文件来对gunicorn的配置项进行配置了,我们在终端可以简单地通过下面的命令来查看gunicorn所有的配置选项:
gunicorn -h
下面是所有的可选配置项信息:
usage: gunicorn [OPTIONS] [APP_MODULE]
optional arguments:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-m INT, --umask INT A bit mask for the file mode on files written by
Gunicorn. [0]
--worker-connections INT
The maximum number of simultaneous clients. [1000]
--max-requests INT The maximum number of requests a worker will process
before restarting. [0]
--graceful-timeout INT
Timeout for graceful workers restart. [30]
--access-logfile FILE
The Access log file to write to. [None]
--reload-engine STRING
The implementation that should be used to power
:ref:`reload`. [auto]
--preload Load application code before the worker processes are
forked. [False]
-D, --daemon Daemonize the Gunicorn process. [False]
--strip-header-spaces
Strip spaces present between the header name and the
the ``:``. [False]
--certfile FILE SSL certificate file [None]
--log-syslog-to SYSLOG_ADDR
Address to send syslog messages. [udp://localhost:514]
--statsd-prefix STATSD_PREFIX
Prefix to use when emitting statsd metrics (a trailing
``.`` is added, []
-w INT, --workers INT
The number of worker processes for handling requests.
--max-requests-jitter INT
The maximum jitter to add to the *max_requests*
setting. [0]
--no-sendfile Disables the use of ``sendfile()``. [None]
--reuse-port Set the ``SO_REUSEPORT`` flag on the listening socket.
[False]
--worker-tmp-dir DIR A directory to use for the worker heartbeat temporary
file. [None]
-u USER, --user USER Switch worker processes to run as this user. [0]
--reload Restart workers when code changes. [False]
--chdir CHDIR Chdir to specified directory before apps loading.
[/root/cgb/demo]
--access-logformat STRING
The access log format. [%(h)s %(l)s %(u)s %(t)s
"%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"]
--limit-request-fields INT
Limit the number of HTTP headers fields in a request.
[100]
--ca-certs FILE CA certificates file [None]
--spew Install a trace function that spews every line
executed by the server. [False]
--forwarded-allow-ips STRING
Front-end's IPs from which allowed to handle set
secure headers. [127.0.0.1]
--do-handshake-on-connect
Whether to perform SSL handshake on socket connect
(see stdlib ssl module's) [False]
-R, --enable-stdio-inheritance
Enable stdio inheritance. [False]
--paste STRING, --paster STRING
Load a PasteDeploy config file. The argument may
contain a ``#`` [None]
--proxy-allow-from PROXY_ALLOW_IPS
Front-end's IPs from which allowed accept proxy
requests (comma separate). [127.0.0.1]
--logger-class STRING
The logger you want to use to log events in Gunicorn.
[gunicorn.glogging.Logger]
--keep-alive INT The number of seconds to wait for requests on a Keep-
Alive connection. [2]
-c CONFIG, --config CONFIG
The Gunicorn config file. [None]
--log-level LEVEL The granularity of Error log outputs. [info]
--paste-global CONF Set a PasteDeploy global config variable in
``key=value`` form. [[]]
--pythonpath STRING A comma-separated list of directories to add to the
Python path. [None]
--reload-extra-file FILES
Extends :ref:`reload` option to also watch and reload
on additional files [[]]
--capture-output Redirect stdout/stderr to specified file in
:ref:`errorlog`. [False]
--ciphers CIPHERS SSL Cipher suite to use, in the format of an OpenSSL
cipher list. [None]
--keyfile FILE SSL key file [None]
-k STRING, --worker-class STRING
The type of workers to use. [sync]
--log-config-dict LOGCONFIG_DICT
The log config dictionary to use, using the standard
Python [{}]
--log-syslog-prefix SYSLOG_PREFIX
Makes Gunicorn use the parameter as program-name in
the syslog entries. [None]
--backlog INT The maximum number of pending connections. [2048]
--limit-request-line INT
The maximum size of HTTP request line in bytes. [4094]
-p FILE, --pid FILE A filename to use for the PID file. [None]
-b ADDRESS, --bind ADDRESS
The socket to bind. [['127.0.0.1:8000']]
--disable-redirect-access-to-syslog
Disable redirect access logs to syslog. [False]
--limit-request-field_size INT
Limit the allowed size of an HTTP request header
field. [8190]
-n STRING, --name STRING
A base to use with setproctitle for process naming.
[None]
--error-logfile FILE, --log-file FILE
The Error log file to write to. [-]
--ssl-version SSL_VERSION
SSL version to use. [_SSLMethod.PROTOCOL_SSLv23]
--cert-reqs CERT_REQS
Whether client certificate is required (see stdlib ssl
module's) [0]
-g GROUP, --group GROUP
Switch worker process to run as this group. [0]
--proxy-protocol Enable detect PROXY protocol (PROXY mode). [False]
--threads INT The number of worker threads for handling requests.
-t INT, --timeout INT
Workers silent for more than this many seconds are
killed and restarted. [30]
--dogstatsd-tags DOGSTATSD_TAGS
A comma-delimited list of datadog statsd (dogstatsd)
tags to append to statsd metrics. []
--suppress-ragged-eofs
Suppress ragged EOFs (see stdlib ssl module's) [True]
--log-config FILE The log config file to use. [None]
--initgroups If true, set the worker process's group access list
with all of the [False]
--check-config Check the configuration. [False]
--log-syslog Send *Gunicorn* logs to syslog. [False]
--log-syslog-facility SYSLOG_FACILITY
Syslog facility name [user]
--statsd-host STATSD_ADDR
``host:port`` of the statsd server to log to. [None]
-e ENV, --env ENV Set environment variable (key=value). [[]]
感觉有很多很多,不过不是说所有的都是需要去手动配置的,我们只需要配置最常使用到的几个就行了,下面是我编写的一个配置文件:
#!usr/bin/env python
#encoding:utf-8
import os
import gevent.monkey
gevent.monkey.patch_all()
import multiprocessing
#开发环境可以打开,生产环境可以
#debug = True
#用于控制errorlog的信息级别,可以设置为debug、info、warning、error、critical
loglevel = 'debug'
#监听地址+端口
bind = "0.0.0.0:5000"
#定义日志存储
if not os.path.exists('log/'):
os.makedirs('log/')
pidfile = "log/gunicorn.pid"
#访问日志
accesslog = "log/access.log"
#错误日志
errorlog = "log/debug.log"
#开启后台运行,默认值为False
daemon = True
#启动的进程数,推荐值为:CPU核数*2+1
workers = multiprocessing.cpu_count()*2+1
#指开启的每个工作进程的模式类型,默认为sync模式,也可使用gevent模式
worker_class = 'gevent'
x_forwarded_for_header = 'X-FORWARDED-FOR'
个人感觉写得是很清晰的了,相应的配置项都已经写上了注释说明了方便具体的改动处理。我们使用第一种启动方式启动,下面是具体的输出截图:
gunicorn -w 4 -b 172.19.6.213:5000 myApp:app
启动命令中,我们设置了4个进程,从结果来看一共有4个不同的pid编号说明启动了4个不同的进程。关闭可以使用【Ctrl+C】的方式,截图如下所示:
接下来使用第二种启动方式执行,命名如下:
gunicorn --config=config.py API:app
结果截图如下所示:
第二种方式是基于配置文件的启动方式,这里我们启动的同时还生成了日志文件:
首先来看debug.log的内容,因为内容比较多,这里只看最后几行:
然后是看gunicorn.pid的内容:
细心的你是不是发现了什么呢?57523这个pid是不是。
最后看access.log的内容,这是访问日志存储文件,因为我们没有访问接口,所以文件就是空的。
到这里整个的生产环境部署实践差不多就结束了,感觉也是收获很多,学海无涯啊!
Python是一门非常友好的语言,学习成本很低,这也是我很喜欢写Python的原因之一,在与应用端或者是业务端做整合的时候我们经常会将模型或者是数据分析的应用做成可以被直接调用的web服务来提供外部的访问,在web服务搭建这一块,有很多的第三方库可以完成这一任务,这里列举出来我了解的web框架,欢迎补充:Django: Python Web应用开发框架Diesel:基于Green...
传说中的python web开发有2大宝器,一个是倚天剑,一个就是屠龙刀。django作为倚天剑已经被大众所熟知,今天我们就来看看flask这把屠龙宝刀。
Flask 是依赖Jinja模板引擎和 WerkzeugWSGI 套件的一套web微框架。
它是小巧的,它是符合wsgi标准的,它是优雅的,也是容易上手的框架,可以说谁掌握了flask这把屠龙刀,谁就可以号令python的web江湖。
包管理工具的出现使得软件安装变得异常简单和容易。python中的包管理工具是pip。一般这个工具都会随着python的安装而自带。
pip3 install flask
一行简单命令就安装成功
意思是这个只是一个测试开发环境,不能用于生产环境。
这种部署方式在有1个以上线程请求就崩掉,根本不保证稳定性和性能
在不需要复杂的代码修改了环境部署前提下,我实测了下面这种可以用于生产环境的部署方式:
一.安装gunicorn
pip install gunicorn
二、导入proxyfix
from werkzeug.middleware.proxy_fix import ProxyFix
python flask实时播放算法处理后的实时视频流。详情:https://blog.csdn.net/qq_34717531/article/details/125079685?spm=1001.2014.3001.5502。
本代码实现python,flask部署web端,可输入图片,视频,RTSP数据流。
可实时得到检测结果,并在web端实时演示。
对于某些应用程序,请求可能需要返回来自实时源的数据。实时视频或音频提要就是一个很好的例子。许多安全摄像机使用此技术将视频流传输到 Web 浏览器。
构建一个完整的应用程序,将实时视频流传输到 Web 浏览器。
实现的一个基于人体姿态识别的AI健身系统,可统计训练次数。
1.中间数字为角度。采用的是12,14,16,可自由更改。
2.左上角为fps,左下角为次数统计。
在本文记录了我在Ubuntu中部署Flask Web站点的过程, 其中包括用户创建、代码获取、Python3环境的安装、虚拟环境设置、uWSGI启动程序设置,并将Nginx作为前端反向代理。希望对各位有所帮助。
建立一个Python Web程序专用账户
adduser haseo
vim /etc/sudoers #将haseo用户加入导sudo用户清单中
sudo usermod -a -G www-data haseo
安装Python3并配置程序运行环境
1.更新Ubuntu的软件库
sudo apt-get update
sudo apt-get -y upgrade
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服
为了实现 Flask 的生产环境部署和可移植性,可以采取以下措施:
1. 选择合适的 Web 服务器:Flask 可以运行在多种 Web 服务器上,如 uWSGI、Gunicorn、Apache、Nginx 等。选择适合自己业务需求的 Web 服务器,进行部署。
2. 使用 WSGI 接口:WSGI 是 Python Web 服务器和 Web 应用程序之间的接口标准。Flask 内置了一个简单的 WSGI 服务器,但是不适合用于生产环境。因此,可以使用第一步选择的 Web 服务器,通过 WSGI 接口将 Flask 应用程序部署到服务器上。可以使用 WSGI 库,如 uWSGI、mod_wsgi 等,来进行部署。
3. 使用虚拟环境:为了解决不同版本的 Python 或依赖库之间的冲突,可以使用虚拟环境。虚拟环境可以隔离不同应用程序的 Python 环境,使得它们互不干扰。有些虚拟环境工具,如 virtualenv 和 Anaconda,可以在不同的操作系统上运行,从而实现 Flask 的可移植性。
4. 配置生产环境:生产环境和开发环境的配置不同,需要对应修改。例如,禁用调试模式、启用 HTTPS、设置数据库连接等。可以使用 Flask 内置的 Config 对象,根据不同的环境进行配置。
5. 使用日志系统:将 Flask 应用程序的日志输出到文件中,可以方便地进行查看和分析。可以使用 Python 的 logging 库来实现日志功能,也可以使用第三方库,如 Flask-Logging、Flask-Logstash 等。
6. 使用容器化技术:如果想要更方便地部署 Flask 应用程序,可以考虑使用容器化技术,如 Docker。Docker 可以将 Flask 应用程序和其依赖库打包成一个容器,以便于在不同的环境中进行部署和移植。
综上所述,采取以上措施可以实现 Flask 的生产环境部署和可移植性。