2010-10-07 47 views
2

我想開發一個應用程序,使用Django作爲前端和芹菜做背景的東西。 現在,有時不同機器上的Celery工作人員需要通過數據庫訪問我的django前端機器(兩臺不同的服務器)。 他們需要知道一些實時的東西,並與Django芹菜生產者和工人模型數據庫

python manage.py celeryd 

他們需要提供所有型號訪問數據庫運行Django的應用程序。

我必須通過直接連接訪問我的MySQL數據庫嗎?因此,我必須允許用戶「my-django-app」不僅從我的前端機器上的本地主機,還從我的其他工作服務器ips訪問?

這是「正確」的方式,還是我錯過了什麼?只是認爲它不是很安全(沒有ssl),但也許這就是它必須的方式。

感謝您的回覆!

回答

1

他們需要訪問數據庫。該訪問將通過數據庫後端進行,後端可以是Django或one from a third party附帶的數據庫後端。

我在我的Django站點的settings.py中做過的一件事是從/etc中的文件加載數據庫訪問信息。這樣,每臺機器的訪問設置(數據庫主機,端口,用戶名,密碼)可能不同,而密碼等敏感信息不在我的項目存儲庫中。您可能希望以類似的方式限制對工作人員的訪問,方法是使用不同的用戶名連接。

您也可以通過環境變量傳遞數據庫連接信息,甚至傳遞配置文件的鍵或路徑,並在settings.py中處理它。

例如,這裏就是我拉我的數據庫配置文件:

g = {} 
dbSetup = {} 
execfile(os.environ['DB_CONFIG'], g, dbSetup) 
if 'databases' in dbSetup: 
    DATABASES = dbSetup['databases'] 
else: 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.mysql', 
      # ... 
     } 
    } 

不用說,你需要確保在DB_CONFIG文件是無法訪問到任何用戶除了數據庫管理員和Django的本身。默認情況下應該將Django引用到開發人員自己的測試數據庫中。使用ast模塊代替execfile也可能有更好的解決方案,但我還沒有研究它。

我做的另一件事是使用單獨的用戶數據庫管理任務與其他一切。在我manage.py,我增加了以下序言:

# Find a database configuration, if there is one, and set it in the environment. 
adminDBConfFile = '/etc/django/db_admin.py' 
dbConfFile = '/etc/django/db_regular.py' 
import sys 
import os 
def goodFile(path): 
    return os.path.isfile(path) and os.access(path, os.R_OK) 
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"] \ 
    and goodFile(adminDBConfFile): 
    os.environ['DB_CONFIG'] = adminDBConfFile 
elif goodFile(dbConfFile): 
    os.environ['DB_CONFIG'] = dbConfFile 

/etc/django/db_regular.py的配置是與只訪問Django的數據庫與SELECT,INSERT,UPDATE用戶和DELETE和/etc/django/db_admin.py是與用戶這些權限加上CREATE,DROP,INDEX,ALTER和LOCK TABLES。 (該migrate命令是從South)。這使我從Django的代碼我在運行時模式搞亂了一些保護,並限制了損壞的SQL注入攻擊可能會導致(雖然你還是應該檢查並過濾所有用戶輸入)。

這不是一個解決你的確切問題,但它可能會給你一些想法,以便爲你的目的來加快Django的數據庫訪問設置。

+0

謝謝!我認爲這是確保我的數據庫登錄處於最佳狀態的好方法。 – dotmoo 2010-10-07 19:05:22

+0

您可能也想以類似的方式將「SECRET_KEY」設置存儲在'settings.py'文件之外。 – 2010-10-07 20:38:51