一般一个项目会配置多套环境:开发/测试/生产环境,每套环境的配置不一样,比如不同的运行环境配置的数据库不一样。
在前面的配置管理中https://www.cnblogs.com/yoyoketang/p/16629630.html,已经学会了在config.py 文件写不同环境的配置类
import os
class Config(object):
# DEBUG = False
JSON_AS_ASCII = False
# 设置SECRET_KEY
SECRET_KEY = os.urandom(24) # 随机字符串
class DevelopmentConfig(Config):
"""开发环境"""
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/web'
# 是否追踪数据库修改,一般不开启, 会影响性能
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 是否显示底层执行的SQL语句
SQLALCHEMY_ECHO = True
class ProductionConfig(Config):
"""生产环境"""
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@x.x.x.x:3306/web'
# 是否追踪数据库修改,一般不开启, 会影响性能
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 是否显示底层执行的SQL语句
SQLALCHEMY_ECHO = False
class TestingConfig(Config):
"""测试环境"""
TESTING = True
# 映射环境对象
config_env = {
'development': DevelopmentConfig,
'production': ProductionConfig,
'testing': TestingConfig
}
apps/__init__.py中写 create_app() 工厂函数
from flask import Flask
import os
from flask_sqlalchemy import SQLAlchemy
from config import config_env
from flask_migrate import Migrate
db = SQLAlchemy() # 数据库
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
# 从环境配置文件获取当前环境, 没有就拿缺省值"production"
env = os.getenv("FLASK_ENV") or "production"
print(f'环境变量FLASK_ENV:{os.getenv("FLASK_ENV")}')
print(f'config FLASK_ENV = {app.config.get("ENV")}')
app.config.from_object(config_env.get(env)) # 获取相应的配置类
# db 数据库初始化
db.init_app(app)
# migrate 迁移组件初始化
Migrate(app, db)
# app.config.from_mapping(
# SECRET_KEY='dev',
# DATABASE=os.path.join(app.instance_path, 'apps.sqlite'),
# )
#
# if test_config is None:
# # load the instance config, if it exists, when not testing
# app.config.from_pyfile('config.py', silent=True)
# else:
# # load the test config if passed in
# app.config.from_mapping(test_config)
#
# ensure the instance folder exists
try:
os.makedirs(app.instance_path)
except OSError:
pass
# 注册蓝图
from . import auth
from . import blog
app.register_blueprint(auth.bp)
app.register_blueprint(blog.bp)
return app
之前是写一个app.py 文件,通过启动这个文件来启动运行的服务,但是不方便切换运行环境。
我们可以通过命令行启动服务,在启动服务之前,先设置环境变量
Unix Bash ( Linux 、Mac 及其他):
$ export FLASK_APP=apps
$ flask run
Windows CMD:
> set FLASK_APP=apps
> flask run
Windows PowerShell:
> $env:FLASK_APP = apps
> flask run
FLASK_APP是设置我们启动的应用名称,如果项目有app.py 文件或工厂函数( create_app )会被自动探测到, 所以大部分情况这个地方FLASK_APP可以省略。
Flask 应用所运行的环境由 FLASK_ENV 环境变更指定。如果配置该变量, 那么缺省为 production ,另一个可用的环境值是 development 。
以我的电脑windows 系统为例,直接执行flask run
(venv) D:\demo\xuexi_flask>flask run
环境变量FLASK_ENV:None
config FLASK_ENV = production
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI
server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
可以看到默认启动的ENV 环境变量是production生产环境。
如果我们想启动一个开发环境,需在启动之前先设置环境变量FLASK_ENV=developmentFLASK_ENV=development
>set FLASK_ENV=development
>flask run
运行日志可以看到FLASK_ENV在2.3 版本以后会被弃用,使用’FLASK_DEBUG’代替
>flask run
'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead.
环境变量FLASK_ENV:development
config FLASK_ENV = development
'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead.
'FLASK_ENV' is deprecated and will not be used in Flask 2.3. Use 'FLASK_DEBUG' instead.
* Debug mode: on
于是可以加上’FLASK_DEBUG=True’ 重新启动
>set FLASK_ENV=development
>set FLASK_ENV=development
>flask run
再次启动就可以看到运行日志
>flask run
环境变量FLASK_ENV:development
config FLASK_ENV = development
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI
server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
环境变量FLASK_ENV:development
config FLASK_ENV = development
* Debugger is active!
* Debugger PIN: 132-957-748
启动的是development环境,并且debug模式已经开启。
在项目的根目录写一个.env 文件,写入配置内容
FLASK_ENV=development
FLASK_DEBUG=True
执行flask run会看到一个提示: * Tip: There are .env or .flaskenv files present. Do “pip install python-dotenv” to use them.
需先安装python-dotenv插件
pip install python-dotenv
重新执行flask run 就可以环境变量已经引用成功
环境变量FLASK_ENV:development
config FLASK_ENV = development
* Debug mode: on
这样只需改.env里面的参数就可以切换development和production环境
与其每次打开新的终端都要设置 FLASK_APP ,不如使用 Flask 的 dotenv 支持 功能自动设置环境变量。
如果 python-dotenv 已安装,那么运行 flask 会根据 .env 和 .flaskenv 中配置来设置环境变量。这样可以在每次打开 终端后,避免手动设置 FLASK_APP 和其他类似使用环境变量进行配置的服务部署 工作。
命令行设置的变量会重载 .env 中的变量, .env 中的变量会重载 .flaskenv 中的变量。 .flaskenv 应当用于公共变量,如 FLASK_APP 而 .env 则应用用于私有变量,并且不提交到储存库。
为了找到定位文件,将会从运行 flask 的文件夹向上扫描文件夹。 当前工作目录将被设置为文件的位置,假定这是最高级别的项目文件夹。
这些文件只能由flask命令或调用 run() 加载。如果想在生产运 行时加载这些文件,你应该手动调用 load_dotenv() 。
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru