• 如何在 uwsgi 配置中传递自定义参数?


    1、 uwsgi.ini参数解释

    必须要以 [uwsgi] 开头!

    • 1)callable参数不是必须的:但只限“① 当Python WSGI 应用是在你模块的根级别定义(即在py文件内定义,而不是在方法或类内定义),② 而且你的应用名称是application时”,该参数才可省略!否则必须注明对应的应用名!!
    • 2)http 或 http-socket:用于设置单独使用uWSGI作为web服务器,并通过http访问服务;
      socket:用于配置了nginx代理,客服端发起的请求先到nginx,再代理到uWSGI服务器,最后发送给flask或Django应用。
    • 3)如果是Dijango,无论module 或 wsgi-file的路径都必须以 “上一级父目录”开头!例如,在该案例目录结构下,如果使用Dijango,则:
      module = cftemp.test1:app
      wsgi-file = cftemp/test1.py
      如果是Flask,则直接以文件名开头即可(具体参考本案例)。
    • 4)参数的key、value之间的空格可有可无。既可写成master = true,也可master=true。
    • 5)uwsgi.ini中指定的监听端口和 test.py中指定的port无关。如果使用uwsgi启动test1.py,则 uwsgi.ini中的9300端口生效;如果使用python test1.py直接启动,则test1.py中指定的5000端口生效。
    (1)更多参数参考:

    官网:Python/WSGI应用快速入门
    uwsgi 常用配置参数说明
    uwsgi常用参数详解

    (2)其他相关知识

    python web开发之 WSGI/uwsgi/uWSGI区别
    uwsgi的一些课外知识:uwsgi、uWSGI、WSGI、web服务器、应用服务器、socket

    2、测试案例

    普通项目部署可参考:
    使用uwsi部署flask服务
    uwsgi的http和socket使用案例


    以下是在uwsgi配置中 自定义参数的案例~~~~
    简单举了uwsgi直接接受http请求的情况,如果你使用nginx代理,需要把配置文件中的 http 改成 socket 或 http-socket。具体可参考官网:Python/WSGI应用快速入门

    2.1 项目目录

    /home/hema/cftemp:
    – test1.py
    – uwsgi.ini

    2.2 方案

    • 如果.py文件中是通过sys.argv[xx]来取值,则在.ini文件中直接配置:pyargv=参数值
    • 如果.py文件中是通过argparse来取值,则在.ini文件中配置:pyargv= --参数名 参数值

    方案一:sys.argv[xx]取值

    (1)flask项目,命名test1.py
    
    from flask import Flask
    import sys
    import argparse
    import logging
    
    app = Flask(__name__)
    
    @app.route('/hello')
    def hello():
    	# 获取pyargv参数
        arg = str(sys.argv[1])
        return f"你好啊~hello world~接受到参数{arg}"
    
    
    if __name__ == '__main__':
        # 启动服务
        ip = "0.0.0.0"
        port = 5000
        logging.info('启动服务, ip地址:{}, 端口:{}'.format(ip, port))
        app.run(host=ip, port=port, debug=True, use_reloader=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    (2)uwsgi.ini
    [uwsgi]   
    chdir=/home/hema/cftemp/
    # flask写法:第一种
    module = test1:app
    # flask写法:第二种-同时配置wsgi-file和callable。
    #wsgi-file=test1.py
    #callable=app
    
    pyargv=HUMMAN
    
    master=true
    processes=4
     
    http=127.0.0.1:9300 
    
    daemonize=/home/hema/cftemp/a.log  # 后台启动,并把日志写到a.log
    pidfile=/home/hema/cftemp/a.pid  # 记录uwsgi的主进程号
    
    http-timeout=86400   # 连接最大超时
    buffer-size=65535  # 传参最大范围,k
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    (3)启动命令

    以下命令均在/home/hema/cftemp目录下执行:
    启动:uwsgi --ini uwsgi.ini
    重启:uwsgi --reload a.pid
    杀死:uwsgi --stop a.pid

    (4)测试

    curl http://127.0.0.1:9300/hello
    输出:你好啊~hello world~接受到参数HUMAN

    方案二:argparse取值

    (1)flask项目,命名test1.py
    '''
    @Project :hippo-ai-py 
    @Author  :cf
    @Date    :2023/8/11
    @Desc    :
    '''
    
    from flask import Flask
    import sys
    import argparse
    import logging
    
    app = Flask(__name__)
    
    parser = argparse.ArgumentParser()
    # dest指定了参数的命名空间属性,打印出来是Namespace(environ='prod'),可通过args.environ获取该属性值
    parser.add_argument("--ENV", dest='environ', default='prod', help="Server environment")
    args = parser.parse_args()
    print(args)
    #print(args.environ)
    
    @app.route('/hello')
    def hello():
        return f"HELLO WORLD!!!!{args.environ}"
    
    if __name__ == '__main__':
        # 启动服务
        ip = "0.0.0.0"
        port = 5000
        logging.info('启动服务, ip地址:{}, 端口:{}'.format(ip, port))
        app.run(host=ip, port=port, debug=True, use_reloader=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    (2)uwsgi.ini
    [uwsgi]
    chdir=/home/hema/cftemp/
    # flask写法:第一种
    module = test1:app
    # flask写法:第二种-同时配置wsgi-file和callable。
    #wsgi-file=test1.py
    #callable=app
    
    pyargv=--ENV HUMMAN
    
    master=true
    processes=4
     
    http=127.0.0.1:9400 
    
    daemonize=/home/hema/cftemp/a.log
    pidfile=/home/hema/cftemp/a.pid
    
    http-timeout=86400 
    buffer-size=65535  # 设大的:wq
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    (3)启动命令

    同方案一

    (4)测试

    curl http://127.0.0.1:9400/hello
    输出:HELLO WORLD!!!HUMMAN

  • 相关阅读:
    【论文阅读】Deep Reinforcement Learning amidst Continual Structured Non-Stationarity
    年过中年危机,如果我再年轻十岁我会每天花几小时这样学习Java
    使用PCA9685控制多个舵机
    【前端知识】Three 学习日志(一)—— Three.js 的简单尝试
    图搜索的经典启发式算法A星(A*、A Star)算法详解
    强引用、软引用、弱引用、幻象引用有什么区别?
    java线程的状态与联系(一张图理解)
    不同服务器节点之间 如何实现高效可靠的文件同步?
    计算机毕业设计(附源码)python云共享知识交流平台
    【附源码】计算机毕业设计JAVA行星中小学教辅平台
  • 原文地址:https://blog.csdn.net/qq_19072921/article/details/132855785