Django,如何在settings.py中访问请求对象

时间:2010-02-22 01:22:12

标签: django

以某种方式可以访问settings.py中的请求对象吗? 也许通过创建一个临时设置对象,修改它然后告诉“链”的其余部分使用它而不是正常的settings.py?

我需要它来决定使用哪个数据库连接。

作为一个额外的问题。如果我有类似5000个数据库连接的东西,那么settings.py和将它们存储在网络前端的sqlite数据库中一样有效吗? 更新连接会不会那么轻松?或者是否必须重新加载服务器以捕获settings.py中的更改?

编辑:澄清为什么我可能需要这么多连接。 我正在构建一个webapp。它是SaaS,与许多其他人一样,每个帐户都有一个子域,他们可以创建用户,并且不需要与任何其他子域/帐户进行交互。 然后将每个帐户限制在自己的DB中会很好。这可以提供一些额外的安全性并简化应用程序。它有许多优点,但这应该说得很好。 这就是为什么我可能最终得到那么多不同的数据库(但如果这会产生任何不同,那么就不会有那么多不同的物理服务器)。

4 个答案:

答案 0 :(得分:1)

如果我理解这一点,您可以使用django的新数据库路由系统,并在运行中based on model instance(例如您的用户)选择数据库,而无需using()调用。

答案 1 :(得分:1)

只需为寻找相同内容的其他人添加此内容即可。 目前还不可能。我已经在Django错误跟踪器上创建了一个功能请求(我认为#13056)并提交了一个修复原型,但我认为它不会很快被包含在内并且它可能有很多错误。< / p>

我已将项目移至Flask,因为它具有非常适合此的g对象。

答案 2 :(得分:0)

Django的ORM并不是设计用于在中间跨步切换数据库凭据。也许你会更喜欢DIY的东西,比如SQLAlchemy

答案 3 :(得分:0)

我在最近一直使用的网站上解决了这个问题,并决定让Apache / mod_wsgi完成工作。这个解决方案增加了一些内存和CPU开销,但对于我的应用程序来说,这是保持一切灵活性的最佳方式。

Apache .conf:

SetEnv DJANGO_TEMPLATE_DIR '/usr/local/www/apache22/data/django/templates/'
<VirtualHost *:80>
    ServerName encendio.whatever.com
    ServerAdmin your_admin@whatever.com
    DocumentRoot "/usr/local/www/apache22/data"
    SetEnv DJANGO_DATABASE_NAME monkeys
    SetEnv DJANGO_DATABASE_USER root
    SetEnv DJANGO_DATABASE_PASSWORD secretPass
    SetEnv DJANGO_DATABASE_PORT ''
    SetEnv DJANGO_DATABASE_HOST ''
    WSGIScriptAlias / /usr/local/www/apache22/data/django/wsgi_handler.py
</VirtualHost>

<强> settings.py:

DATABASE_NAME =     os.environ.get('DJANGO_DATABASE_NAME', '')
DATABASE_USER =     os.environ.get('DJANGO_DATABASE_USER', '')
DATABASE_PASSWORD = os.environ.get('DJANGO_DATABASE_PASSWORD', '')
DATABASE_HOST =     os.environ.get('DJANGO_DATABASE_HOST', '')

这允许您在httpd.conf

中将每个网站设置为VirtualHost