0

的返回值我有在Django的數據庫連接的一個小功能如下:檢查函數在Python

def db_connection(query_name): 
    try: 
     cursor = connection.cursor() 
     cursor.execute(query_name) 
     descr = cursor.description 
     rows = cursor.fetchall() 
     result = [dict(zip([column[0] for column in descr], row)) for row in rows] 
     return result 
    except Exception as e: 
     return e 
    finally: 
     cursor.close() 

此功能在我的Django的REST框架功能視圖用於執行SQL查詢。一般的語法如下:

@api_view(['GET']) 
def foo_bar(request): 
    .... 
    .... 
    .... 
    query1 = "Select name from table" 
    result = db_connection(query1) 

    return Response(result, status=status.HTTP_200_OK) 

不過,我需要的是改變取決於我db_connection功能即返回值在響應元組的狀態值返回一個200 OK,如果別人發生無異常500.如何檢查函數的返回值離子是一個例外?

+0

Django有一個很好的訪問數據庫的框架..有沒有一個原因,你沒有使用它? – Sayse

+0

我很好意識到通過傳遞ORM..like手動預防SQL注入的手段來命名其中的一個頭疼..但是,這個應用程序是一個分析應用程序,Django ORM對我來說不夠好需要,因此原始的SQL .. – Amistad

回答

2

你明確地繞過了例外已經給你的所有漂亮的控制流程。不要這樣做。

如果你只是想要返回一個500,那麼根本不要捕捉異常;只是讓它冒出來,Django的異常處理中間件會抓住它並返回500響應。

在任何情況下,您都不應該捕獲基本Exception類;只抓住你實際可以處理的事情。而當你發現異常時,你應該實際上處理它;返回它而不是提高它是沒有用的。

+0

嗯..感覺..所以這樣做的正確方法是隻使用try語句,而不使用except語句,然後最後關閉連接? – Amistad

+2

根本不在函數中執行try ... finally,使用遊標作爲上下文管理器https://docs.djangoproject.com/en/1.8/topics/db/sql/#connections-and -cursors – Anentropic

+0

這真的很不錯..謝謝.. – Amistad

2

我想通過result = db_connection(query1)代碼移動foo_bar函數中的try catch塊,並從那裏返回一個500的狀態,以及一些包含解釋其失敗原因的錯誤的錯誤。我這樣說是因爲我假設你正在製作一個REST API,它必須始終返回一個答案,而不會崩潰正常的Django方式。

+0

然而,這將打敗我的目的,使db_connection函數在第一位..我有多個視圖,並希望有一個單一的函數調用,而不是整個try catch塊.. – Amistad

+1

你可以嘗試使用'isinstance(result,Exception)',參見https://docs.python.org/2/library/functions.html#isinstance – gplayer

+0

我不確定的是如果你的行爲是如何的只是不要處理異常並讓它冒泡。 – gplayer