flask+gunicorn部署

flask实际上就是用来作为python部署服务的框架,方便别人调用你写的服务。本文主要记载下自己的使用过程

pip install flask
from flask import Flask
app = Flask(__name__)

绑定路由的作用是,通过路由绑定一个视图函数 @app.route( '/'): 告诉Flask哪个URL才能出发对应的函数。

1. 导入Flask类;

from flask import  Flask

2. 实例化一个Flask对象;

    __name__是模块的名称或者包的名称

    作用: 根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径;

    模块就是python文件; 包就是目录(跟普通目录多加一个__init__.py);

#

app = Flask(__name__)

3-1.基本路由:通过路由绑定一个视图函数

  @app.route('/'): 告诉Flask哪个URL才能出发对应的函数, 又称为路由;

  对应定义了一个视图函数, 也就是返回给用户浏览器显示的内容;

@app.route('/')

def index():

    return  "<h1>hello world</h1>"

@app.route('/login/')

def login():

    return  "login"

4. &#x8FD0;&#x884C;Flask&#x5E94;&#x7528;&#xFF0C; &#x53EF;&#x4EE5;&#x6307;&#x5B9A;ip&#x548C;&#x7AEF;&#x53E3;&#xFF1B;

'0.0.0.0' &#x6240;&#x6709;&#x7684;IP&#x90FD;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x5230;;

app.run('0.0.0.0', 9000)

比如你想调取login这个应用,就是在url为0.0.0.0:9000/login/。

蓝图主要是为了方便多个应用扩展使用的,每当我们想加一个app时都可以通过蓝图注册,然后通过绑定一个不同的路由来实现。蓝图注册如下:

color = Blueprint('color_tagging', __name__)

注册蓝图后绑定路由也不再是app.route,而是你蓝图注册的名字’color’

@color.route(rule='/get', methods=['GET'])

然后再如下进行app的注册

#&#x5B9E;&#x4F8B;&#x5316;&#x4E00;&#x4E2A;Flask&#x7C7B;
app = Flask(__name__)
#&#x6CE8;&#x518C;&#x84DD;&#x56FE;
app.register_blueprint(color, url_prefix='/color_tagging')
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
pip install gunicorn
gunicorn app.flaske:app --config bin/gunicorn_config.py

这里app.flaske是我app实例化的py文件所在地,–config后面是gunicorn配置文件的路径

import os

#docker&#x73AF;&#x5883;&#x90E8;&#x7F72;&#x65F6;&#x83B7;&#x53D6;&#x6307;&#x5B9A;&#x7684;&#x7AEF;&#x53E3;&#xFF0C;&#x6CA1;&#x6709;&#x5C31;&#x7528;&#x9ED8;&#x8BA4;&#x7684;
port = os.getenv('PORT', '8080')
#docker&#x73AF;&#x5883;&#x90E8;&#x7F72;&#x65F6;&#x83B7;&#x53D6;&#x6307;&#x5B9A;&#x7684;ip&#x5730;&#x5740;&#xFF0C;&#x6CA1;&#x6709;&#x5C31;&#x7528;&#x9ED8;&#x8BA4;&#x7684;
ip = os.getenv('IPADDR', '0.0.0.0')
bind = '{0}:{1}'.format(ip, port)
docker&#x73AF;&#x5883;&#x90E8;&#x7F72;&#x65F6;&#xFF0C;os.cpu_count()&#x83B7;&#x53D6;&#x5230;&#x7684;cpu&#x6838;&#x6570;&#x4E3A;&#x7269;&#x7406;&#x673A;&#x6838;&#x6570;&#xFF0C;&#x5B9E;&#x9645;&#x5206;&#x4E0D;&#x5230;&#x90A3;&#x4E48;&#x591A;&#x8D44;&#x6E90;
workers = int(os.getenv('CPU_COUNT', 4))
print('Child process number: {} with port: {}'.format(workers, port))

keepalive = 60
timeout = keepalive + 1
graceful_timeout = 1
backlog = 1

proc_name = 'gunicorn_test'
preload_app = True
log_path = os.getenv('MATRIX_APPLOGS_DIR')
if not os.path.exists(log_path):
    os.makedirs(log_path)

#&#x63A7;&#x5236;gunicorn&#x6253;&#x7684;&#x65E5;&#x5FD7;&#x7ED3;&#x6784;
logconfig_dict = dict(
    version=1,
    disable_existing_loggers=False,
    loggers={
        "gunicorn.error": {
            "level": "INFO",
            "handlers": ["error_console", "error_file"],
            "propagate": True,
            "qualname": "gunicorn.error"
        },
        "gunicorn.access": {
            "level": "INFO",
            "handlers": ["access_file"],
            "propagate": True,
            "qualname": "gunicorn.access"
        }
    },
    handlers={
        "error_console": {
            "class": "logging.StreamHandler",
            "formatter": "generic",
            "stream": "ext://sys.stderr"
        },
        "access_file": {
            "class": "logging.FileHandler",
            "formatter": "simple",
            "filename": os.path.join(log_path, 'access.log')
        },
        "error_file": {
            "class": "logging.FileHandler",
            "formatter": "generic",
            "filename": os.path.join(log_path, 'error.log')
        }
    },
    formatters={
        "generic": {
            "format": "%(asctime)s,%(msecs)03d | %(process)d | %(module)s | %(levelname)s | %(message)s",
            "datefmt": "%Y-%m-%d %H:%M:%S",
            "class": "logging.Formatter"
        },
        'simple': {
            "format": "%(message)s",
            "class": "logging.Formatter"
        }
    }
)
app = Flask(__name__)
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)

Original: https://blog.csdn.net/weixin_47592657/article/details/125202532
Author: 爱逛街的小黑
Title: flask+gunicorn部署

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/749817/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球