2014-09-03 49 views
0
SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.associate_by_email', 
) 

例外...的Django通過使用<code>settings.py</code>上面的代碼中我能避免提高地方

(1062, "Duplicate entry '[email protected]' for key 'email'")錯誤消息。

但我在網上搜索,我發現這個方便的代碼所需的HTML頁面扔exception

[代碼1]: #backends.py

class MySocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware): 
    def process_exception(self, request, exception): 
     msg = None 
     if #no duplicate email: 
      return HttpResponse("# catched exception") 
     else: 
      # processing msg here 
      return render_to_response(# html, {msg}, context) 

#設置.py

MIDDLEWARE_CLASSES = (
    'frontend.backends.MySocialAuthExceptionMiddleware' 
) 

根據上面的代碼我的問題是solved。但在以前我使用下面的代碼與另一個功能合作,它與上述概念完全不同。

[代碼2]:

def function(request): 
    #actual code here 
    return HttpResponse('msg here') 

但是在運行上面的代碼,以及我得到在此MySocialAuthExceptionMiddleware錯誤消息等,

tuple index out of range ..

其實對於上面的代碼,這是不正確的錯誤消息。此消息與代碼「[代碼1]「。

然後,我怎樣才能得到「[代碼2]」的實際錯誤信息。

+0

因爲這就是引發異常的地方,但是不能查看回溯來找出根本原因嗎? – 2014-09-03 11:09:53

+0

@Knyght我編輯我的問題更友好閱讀.. – 2014-09-03 11:46:24

+0

@Knyght'代碼1'是專爲處理該特定的異常而已。但爲什麼'代碼2'錯誤消息去'MySocialAuthExceptionMiddleware'。 – 2014-09-03 11:52:32

回答

1

你不需要經歷所有這些頭痛。例外在django中並不特別,它們是Python的一部分。

如果你想提出一個自定義異常 - 無論你想這樣做:

class MyException(Exception): 
    pass 

def function(request): 
    raise MyException('msg here') 

你所面對的問題是,在Django,中間件是每次請求呼籲,即使請求與該中間件不「相關」。

因此,在編寫中間件時,您需要牢記它將針對每個請求進行調用,並且它應該正確處理這些情況。

+0

哦..這是每個請求,然後我會尋找另一種方法來實現。我應該在視圖函數中使用'middleware' api嗎? – 2014-09-03 12:16:34

+1

沒有中間件「API」不適用於視圖,它的中間件。爲什麼不寫一篇文章來描述你的問題?這樣,沒有人浪費時間幫助你找出解決方案,當他們不知道問題是什麼時。 – 2014-09-03 12:18:13

+0

在這種情況下,我沒有其他選擇。我會在工作時禁用它 – 2014-09-03 12:22:47