【问题标题】:String instead of urlparse.ParseResult for redis_url on Heroku (Django)Heroku(Django)上redis_url的字符串而不是urlparse.ParseResult
【发布时间】:2013-07-09 17:36:25
【问题描述】:

非常感谢任何有将 redis 配置为 heroku 上 celery-brokered django 项目后端经验的人的意见。我的任务调度在本地主机上运行良好,但我发现将它部署在 heroku 上真的很令人沮丧:

  • 目前我正在运行 3 个 dynos、1 个 Web、1 个调度程序和 1 个工作人员
  • 我将 redistogo 插件添加到我的项目中。 Redistogo 设置为免费的 nano 计划,它为我提供 10 个连接、1 个 DB 和一个 5MB 大小的实例
  • 我按照 redistogo 文档 (https://devcenter.heroku.com/articles/redistogo#install-redis-in-python) 来配置 settings.py,或者,也尝试实现解决方案 here 的变体。也不为我工作。这是我在 settings.py 中的内容:

     redis_url = os.environ.get('REDISTOGO_URL', 'http://localhost:6959')
    
     CACHES = {
            'default': {
            'BACKEND': 'redis_cache.RedisCache',,
            'LOCATION': '%s:%s' % (redis_url.hostname, redis_url.port),
            'OPTIONS': {
                'DB': 0,   # or 1?
                'PASSWORD': redis_url.password,
                #'PARSER_CLASS': 'redis.connection.HiredisParser'
            },
        },
     }
    
    CELERY_RESULT_BACKEND = redis_url
    BROKER_URL = 'redis://localhost:6959/0'
    

这是我尝试运行应用程序时的 heroku 日志:

2013-07-11T12:16:10.998516+00:00 app[web.1]:     apps = settings.INSTALLED_APPS
2013-07-11T12:16:10.998516+00:00 app[web.1]:     mod = importlib.import_module(self.SETTINGS_MODULE)
2013-07-11T12:16:10.998263+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
2013-07-11T12:16:10.998263+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/core/management/__init__.py", line 263, in fetch_command
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
2013-07-11T12:16:10.998516+00:00 app[web.1]:     self._setup(name)
2013-07-11T12:16:10.998516+00:00 app[web.1]:     self._wrapped = Settings(settings_module)
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 132, in __init__
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
2013-07-11T12:16:10.998516+00:00 app[web.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in _setup
2013-07-11T12:16:10.998712+00:00 app[web.1]:     'LOCATION': '%s:%s' % (redis_url.hostname, redis_url.port),
2013-07-11T12:16:10.998712+00:00 app[web.1]: AttributeError: 'str' object has no attribute 'hostname'
2013-07-11T12:16:12.201202+00:00 heroku[web.1]: Process exited with status 1
2013-07-11T12:16:12.250743+00:00 heroku[web.1]: State changed from starting to crashed

如何将 redis_url 视为 URI 而不是 str?

我的过程文件:

web: python manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3 --log-level info
scheduler: python manage.py celeryd -B -E
worker: python manage.py celeryd -E -B --loglevel=INFO

在需求中我有 django-redis-cache==0.10.0、redis==2.7.6、django-celery==3.0.17、celery celery==3.0.20 和kombu==2.5.12

【问题讨论】:

    标签: django heroku redis celery


    【解决方案1】:

    使用 python urlparse 库。它将 URL 解析为组件。

    redis_url = os.environ.get('REDISTOGO_URL', 'http://localhost:6959')    
    redis_url = urlparse.urlparse(redis_url)
    

    【讨论】:

      【解决方案2】:

      看起来os.environ.get 正在返回一个字符串(或str?不熟悉python),您希望它更像一个URI 对象或其他东西。普通的 python 字符串会响应hostname 之类的方法吗?

      The documentation也有这一步:

      redis = redis.from_url(redis_url)

      其中according to these docs将字符串解析为redis对象。

      【讨论】:

      • 谢谢 - 我同意你的评估,它将 uri 解析为 str(字符串),它不会接受这样的方法。我最终选择了硬编码 CACHE 值的 hacky 解决方案,现在 redis 在我的项目中运行良好。
      【解决方案3】:

      我对我的解决方案不太满意,但我硬编码了我的 redistogo 主机名、端口和密码,现在一切运行顺利。

      【讨论】:

        猜你喜欢
        • 2019-07-19
        • 2017-07-12
        • 2011-01-08
        • 1970-01-01
        • 2015-12-19
        • 2022-06-25
        • 2014-11-02
        • 2012-01-02
        • 1970-01-01
        相关资源
        最近更新 更多