折腾:
【已解决】把Python3的Flask部署到远程CentOS7服务器
期间,已经实现了:
Mac本地:开发和部署Flask,且正常运行了
远程CentOS服务器:开发和部署Flask,且正常运行了
但是有些配置不太一样,比如mongo的host等等
而之前就用过,也看到过帖子介绍,最好根据不同环境,设置不同参数。
所以就去搞清楚,此处Flask中如何实现两套不同环境,加载不同的配置。
之前看到的:
Build a RESTful API with Flask – The TDD Way ― Scotch
的:
# /instance/config.py
看起来就很不错,抽空参考。
flask app different environment config
Configuration Handling — Flask Documentation (0.12)
http://flask.pocoo.org/docs/0.12/config/#development-production
有机会去试试:
Deploying with Fabric — Flask Documentation (0.12)
Flask application configuration using an environment variable and YAML
python – Flask: How to manage different environment databases? – Stack Overflow
Configuration Handling — Flask Documentation (0.12)
“The instance folder is designed to not be under version control and be deployment specific。It’s the perfect place to drop things that either change at runtime or configuration files.”
How to Configure a Flask Application
到底有哪些可以配置的值,参考:
Configuration Handling — Flask Documentation (0.12)
而Flask有这些加载配置的方式:
file-based
app.config.from_pyfile(‘config_file.cfg’)
INI file syntax
DEBUG=True
object-based
class BaseConfig(object):
DEBUG = False
TESTING = False
class DevelopmentConfig(BaseConfig):
DEBUG = True
TESTING = True
class TestingConfig(BaseConfig):
DEBUG = False
TESTING = True
app.config.from_object(‘module_name.DevelopmentConfig’)
environment-variable-based
app.config.from_envvar(‘FLASK_CONFIG_FILE’)
FLASK_CONFIG_FILE environment variable points to the configuration file
instance-folders-based
The instance folder is designed not to be under source control and could store sensitive information
This instance folder should be directly deployed on the production server.
用法:
绝对路径:
app = Flask(__name__, instance_path=’/path/to/instance/folder’)
相对路径:
app = Flask(__name__, instance_relative_config=True) # (2)
app.config.from_pyfile(‘flask.cfg’)
Best Practice:
Good practice is to have a default configuration, which is under source control and to override it with sensitive and specific information kept in instance folders.
【总结】
此处,暂时用:
和app.py同目录下新建一个:
config.py
<code>class BaseConfig(object): DEBUG = False FLASK_PORT = 12345 # FLASK_HOST = "127.0.0.1" # FLASK_HOST = "localhost" # Note: # 1. to allow external access this server # 2. make sure here gunicorn parameter "bind" is same with here !!! FLASK_HOST = "0.0.0.0" # default to production sever's local mongodb MONGODB_HOST = "localhost" MONGODB_PORT = 32018 MONGODB_USERNAME = "gridfs" MONGODB_PASSWORD = “xxx" MONGODB_AUTH_SOURCE = "gridfs" # Flask app name FLASK_APP_NAME = "RobotQA" # Log File LOG_FILE_FILENAME = "logs/" + FLASK_APP_NAME + ".log" LOG_FORMAT = "[%(asctime)s %(levelname)s %(filename)s:%(lineno)d %(funcName)s] %(message)s" LOF_FILE_MAX_BYTES = 2*1024*1024 LOF_FILE_BACKUP_COUNT = 10 # reuturn file url's host # FILE_URL_HOST = FLASK_HOST FILE_URL_HOST = "127.0.0.1" class DevelopmentConfig(BaseConfig): DEBUG = True # for local dev, need access remote mongodb MONGODB_HOST = "x.x.x.x" FILE_URL_HOST = "127.0.0.1" class ProductionConfig(BaseConfig): FILE_URL_HOST = "x.x.x.x" </code>
然后app.py去引用:
<code>app = Flask(__name__) app.config.from_object('config.DevelopmentConfig') # app.config.from_object('config.ProductionConfig’) </code>
logFormatterStr = app.config[“LOG_FORMAT”]
fileHandler = RotatingFileHandler(
app.config[‘LOG_FILE_FILENAME’],
maxBytes=app.config[“LOF_FILE_MAX_BYTES”],
backupCount=app.config[“LOF_FILE_BACKUP_COUNT”],
encoding=”UTF-8”)
purePymongo = MongoClient(
host=app.config[“MONGODB_HOST”],
port=app.config[“MONGODB_PORT”],
username=app.config[“MONGODB_USERNAME”],
password=app.config[“MONGODB_PASSWORD”],
authSource=app.config[“MONGODB_AUTH_SOURCE”]
)
同时,gunicorn中的配置文件:
gunicorn_config.py
<code>import multiprocessing import os import sys sys.path.append(".") from config import BaseConfig #currentRootPath = "/Users/crifan/xxx/robotDemo" currentRootPath = os.getcwd() print("currentRootPath=%s" % currentRootPath) flaskHost = BaseConfig.FLASK_HOST flaskPort = BaseConfig.FLASK_PORT print("flaskHost=%s, flaskPort=%s" % (flaskHost, flaskPort)) reload = True #当代码改变时自动重启服务 #bind = '127.0.0.1:12345' #绑定ip和端口号 # bind = '0.0.0.0:12345' #绑定ip和端口号 bind = ("%s:%s" % (flaskHost, flaskPort)) </code>
即可输出:
<code>currentRootPath=/Users/crifan/xxx/robotDemo flaskHost=0.0.0.0, flaskPort=12345 </code>
后续切换生产环境的话,直接去app.py中修改:
<code>app = Flask(__name__) # app.config.from_object('config.DevelopmentConfig') app.config.from_object('config.ProductionConfig’) </code>
即可。
转载请注明:在路上 » 【已解决】Flask中增加不同环境的app的config配置