【问题标题】:How can I configure the Django DATABASES settings at runtime?如何在运行时配置 Django DATABASES 设置?
【发布时间】:2012-06-30 18:42:38
【问题描述】:

这些天我正在学习如何在 BAE 上编程。 BAE 是一个类似 GAE 的云平台。它支持 python 2.7 和 MySQL。但是有一个问题,BAE 在请求中提供了DATABASE 信息。我可以像这样获得这些设置:

port = request.META['HTTP_BAE_ENV_ADDR_SQL_PORT']

但是如何在运行时配置DATABASES 设置?

我尝试为这个问题写一个中间件,像这样:

from  django.conf import settings

class bae_database(object):
    def process_request(self, request):
        BAE_DB = {
            'default': {
                'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
                'NAME': 'django',                      # Or path to database file if using sqlite3.
                'USER': 'root',                      # Not used with sqlite3.
                'PASSWORD': '',                  # Not used with sqlite3.
                'HOST': 'localhost',                      # Set to empty string for localhost. Not used with sqlite3.
                'PORT': '3306',                      # Set to empty string for default. Not used with sqlite3.
            },
        } 
        settings.DATABASES = BAE_DB

然后在settings.py 文件中,我将此中间件添加到MIDDLEWARE_CLASSES 并设置DATABASES = {}。 结果,我收到此错误消息:

You haven't set the database ENGINE setting yet.

实际上中间件可以工作,因为在 Django 错误页面的设置部分我得到:

DATABASES   
{'default': {'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost', 'NAME': 'django', 'PASSWORD': '********************', 'PORT': '3306', 'USER': 'root'}}

不知道为什么,我改了DATABASES属性,但是没用。请帮帮我。

【问题讨论】:

    标签: database django settings


    【解决方案1】:

    DATABASES == {}settings.py 中吗? - 如果是这样,请尝试在 settings.py 中设置它 - 例如您当前在中间件中显示的测试值。

    【讨论】:

    • django 仅当我设置 DATABASE={} 时才会连接数据库,因为 runserver。测试值是我的计算机的正常配置。如果我将 DATABASES 设置为测试值,它没有问题。但是在 BAE 上,我可以从请求中获取配置。
    • 所以设置静态设置没有意义
    • 是的,但我要说的是,在settings.py 中,您应该将DATABASE 设置为非空的有效值。您可以在中间件中更改它,但您需要在 DATABASES 中有 something,当您启动时其他 Django 将拒绝运行。
    • 感谢您的建议,但它仍然不起作用。我将数据库引擎设置为'sqlite3',创建一个空的db文件并启动django,在错误页面中,异常位置:/usr/ lib/python2.7/site-packages/django/db/backends/sqlite3/base.py 在执行中,第 200 行,在设置部分 DATABASES {'default': {'ENGINE': 'django.db.backends.mysql ','HOST':'localhost','NAME':'django','PASSWORD':'********************','PORT':' 3306','用户':'root'}}
    • 我会将ENGINE 设置为与 BAE 使用的相同 - 我不熟悉 Django 的数据库代码,但我希望动态更改数据库引擎比更改更有可能失败端口或主机。最好的方法是向 BAE 查询一组数据库设置并将其用作您的初始 DATABASES 设置。这样,您的中间件将不得不更改最少数量的设置。
    猜你喜欢
    • 2017-11-01
    • 2020-04-01
    • 2019-09-26
    • 2015-09-05
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多