2017-03-10 77 views
1

Django爲外部服務(例如Zookeeper,Cassandra,Redis等)創建客戶端實例的做法是什麼?在Django中實例化外部服務的客戶端?

我需要此客戶端從視圖內執行「設置密鑰」操作,我不想在每個請求上創建客戶端由於高開銷。

目前我已經在views.py中聲明它爲全局變量,但那不是很好,因爲它在我做python manage.py makemigrations時也被實例化了。

一個真正剝離下來例如問題:

urls.py

from django.conf.urls import url 
from app.views import MyView 

urlpatterns = [ 
    url(r'^', MyView.as_view()), 
] 

views.py

from django.shortcuts import render 
from django.views import View 
from django.http import HttpResponse 
from kazoo.client import KazooClient 
import logging 

logging.basicConfig(level=logging.DEBUG) 

zk = KazooClient(hosts="127.0.0.1:2181") 
zk.start() 


# Create your views here. 
class MyView(View): 
    def get(self, request): 
     value, _ = zk.get("/my_zk_key") 
     return HttpResponse("value: {}".format(value)) 

的問題是,動物園管理員客戶端被創建並在除runserver之外的情況下連接,如下所示:

$ python manage.py makemigrations 
INFO:kazoo.client:Connecting to 127.0.0.1:2181 
DEBUG:kazoo.client:Sending request(xid=None): Connect(protocol_version=0, last_zxid_seen=0, time_out=10000, session_id=0, passwd=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', read_only=None) 
INFO:kazoo.client:Zookeeper connection established, state: CONNECTED 
No changes detected 
$ 

我正在尋找一種在Django中處理這種情況的公認慣例。

+1

可以使它創建連接,單 –

+0

類請提供多一點有關客戶當前如何以及在哪裏創建的信息(您當前的代碼)以提供最佳解決方案。不同的服務/供應商/客戶可能有不同的建議方案。 (例如,Django在啓動時創建了單個數據庫DB 「連接」,但僅在執行查詢時才連接DB本身)。 – Udi

+0

增加了一個小例子,顯示問題 – Unknown

回答

0

如果您的問題可以降低到後點,你能避免在遷移過程中設置您的全局變量:

import sys 
if 'makemigrations' not in sys.argv and 'migrate' not in sys.argv: 
    # variable setting here 
+0

我寧願不要這樣做,它看起來像一個被接受的做法比黑客( – Unknown

+0

你肯定是對的,但它的工作!我沒有找到任何其他的意思是知道的如果當前的流程是一個遷移或不遷移,我問了SO但沒有回答。 – albar

相關問題