2014-09-02 47 views
2

數據庫連接有沒有一種方法來禁用Django的REST框架的默認行爲,使其不查找後端數據庫?在我的項目中,我有幾個不需要數據庫的簡單API。但在Django背後,嘗試與數據庫連接,在響應時間內增加了額外的毫秒數。Django的rest_framework.views如何跳過簡單的REST API

請注意,我有CONN_MAX_AGE在我的設置,以便在最好的情況下,我不會看到MySQLdb的痕跡:連接,但它仍然會做,因爲它的默認行爲的其他-SQL。

我希望如果有人已經面臨這個問題,知道一個solution.For更深入的瞭解,我也貼我的我的簡單API的New Relic的報告的痕跡。

from rest_framework.views import View 
class ServerStatusTestView(View): 
    def get(self, request): 
     return HttpResponse('Some Response') 
  • MySQLdb的:連接==> 65毫秒
  • WSGI /響應==> 21.1ms
  • 其他 - SQL ==> 11.3ms
  • django.core.urlresolvers:RegexURLResolver。解決==> .8ms
  • django.http.response:HttpResponse.close ==> .5ms
  • django.middleware.csrf:CsrfViewMiddleware.process_view ==> 5ms的
  • ServerStatusTestView ===> .2ms
  • django.middleware.common:CommonMiddleware.process_request ==> 0.1

編輯-1添加>>我剛纔注意到,可能由於遠程地發生「django.contrib.sessions.middleware.SessionMiddleware」,其中Django試圖將缺省會話保存在數據庫中。我爲django管理表單添加了它。所以我想我可能需要添加一些中間件來繞過我的簡單API,但我仍然在尋找一個合適的東西,就像我在簡單視圖頂部添加的一個裝飾器,它不測試會話。所以仍然在尋找建議!

編輯2加>>我對會議中間件的想法是錯誤的,因爲我使用簡單的查看未(ApiView),只是爲了確認起見,我禁用了所有中間件的看到影響,但一個簡單的請求仍與數據庫建立連接。更有趣的是我的設置中有2個數據庫,當我加載測試我的簡單API調用時,我的主數據庫也從其他數據庫獲得連接。 (我通過「SHOW PROCESSLIST」命令檢查我直接從MySQL而負載測試運行)

+0

我想你不要與實施測試只settings.py它沒有MySQL連接定義? – mdurant 2014-09-02 15:41:46

+0

是的,我在生產測試這個,但是我剛剛看到它可能是Django的默認會話行爲,因爲它正在發生,我也要編輯我的父郵件。 – 2014-09-02 15:54:25

回答

1

第一步。實現自定義數據庫後端並在數據庫初始化時引發異常

from django.db.backends.postgresql_psycopg2 import base 

class DatabaseWrapper(base.DatabaseWrapper): 
    def __init__(self, *args, **kwargs): 
     raise RuntimeError('db access restricted') 

step2。看追溯,並確定誰想要DB

對不起我的英語不好

+0

我這樣做了,現在它變得非常明顯,這是django的固定默認行爲,它在返回響應之前嘗試重置所有連接。按照鏈接查看堆棧跟蹤。只是爲了我使用MySql的信息。 https://docs.google.com/document/d/132BRlBjNTdfGZCFR2HJqwti95bndPllcHJ-_Q2DLShs/edit?usp=sharing – 2014-09-03 12:53:00

+0

你說得對...似乎Django在reset_queries信號上發起db連接而不管它是否需要... 您可以嘗試斷開默認的reset_queries信號,並手動清除查詢日誌,或者更簡單地使用DEBUG = True) – estin 2014-09-04 05:47:42

+0

DEBUG已被設置爲False。 :| – 2014-09-04 16:52:31