2014-06-30 29 views
0

這是一個begginers問題。我有一個MySQL數據庫,用表格來存儲用戶名和密碼,這很簡單。我不想使用第一次運行'SyncDb'時django安裝的身份驗證後端和表。所以我的問題是:我如何告訴django使用我創建的數據庫,而不是在預定義的數據庫中查找活動用戶。 我使用這段代碼,但當然這是在已經提到的'auth_user'表中尋找用戶。自定義身份驗證方法或者其他一些方法可以做同樣的事情? Django

class LoginView(FormView): 
    form_class = LoginForm 
    redirect_field_name = REDIRECT_FIELD_NAME 
    template_name = 'login.html' 
    success_url = 'index' 

    def form_valid(self, form): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 

     user = authenticate(username=username, 
          password=password) 
     if user is not None: 
      if user.is_active: 
       login(self.request, user) 
       return HttpResponseRedirect(self.get_success_url()) 
     else:   
      return self.form_invalid(form) 

    def form_invalid(self): 
     return HttpResponseRedirect(reverse('app_name:login')) 

    def get_success_url(self): 
     if self.success_url: 
      redirect_to = self.success_url 
     else: 
      redirect_to = self.request.REQUEST.get(self.redirect_field_name, '') 

     netloc = urlparse.urlparse(redirect_to)[1] 
     if not redirect_to: 
      redirect_to = settings.LOGIN_REDIRECT_URL 
     elif netloc and netloc != self.request.get_host(): 
      redirect_to = settings.LOGIN_REDIRECT_URL 
     return redirect_to 

    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     if form.is_valid(): 
      return self.form_valid(form) 
     else:     
      return self.form_invalid() 

所以這是我的問題。非常感謝你

PS:我的form_invalid()不工作...(錯誤:傳遞2參數而不是1)任何建議請告訴我。再次,非常感謝你

+0

爲什麼你不想使用django的身份驗證模型?你所要求的並不是微不足道的,特別是當你說自己你是新的。是否因爲你正在存儲一些django沒有提供的自定義字段?或者你想使用電子郵件地址作爲登錄名而不是用戶名?所有這些都可以在認證框架內輕鬆處理。 –

+0

在某些時候,我想使用電子郵件地址而不是用戶名。正如我所提到的那樣,新的這一點,所以我相信你對你的建議是正確的。我想與基本的東西明星,然後我可以修改登錄看看什麼是最好的方法。當我將應用程序移動到公司服務器等時,我想將數據存儲在適當的數據庫中,而不是在django中。也許我在這個問題上錯了,請讓我知道。謝謝 – user3799942

+0

如果你想從基礎開始,然後堅持任何django提供的,所以你可以學習框架;一旦你掌握了這一點 - 你就可以找出自定義。此外,你應該解釋你的意思_「將數據存儲在適當的數據庫中,而不是在Django的數據庫中」_。 –

回答

2

我們必須想出解決辦法對我們的項目和最初的混亂來自於事實,你基本上需要在Django處理兩個問題來做到這一點:

1)確保即該應用被路由到正確的數據庫 1A)確保其他數據庫實際上可以通過Django的

2項)創建一個「應用程序」模塊用來覆蓋默認的用戶模型

幸運的是,這是一旦問題明確定義,就非常簡單。

https://docs.djangoproject.com/en/dev/topics/db/multi-db/

第一部分「定義你的數據庫」將告訴您如何添加額外的數據庫項目。確保你擁有Django訪問權限,所以根據你的訪問結構,這可能包括一個額外的步驟。

之後,「自動數據庫路由」一節將解釋數據庫路由器背後的一般想法。不過,我建議您查看一下這個優秀的討論,並利用該代碼來簡化數據庫路由:http://justcramer.com/2010/12/30/database-routers-in-django/。通過這種方式,您可以讓項目使用此路由器並在settings.py(DATABASE_CONFIG)中定義一個庫,以便在將DATABASE_ROUTERS設置爲鏈接中的代碼後,告知每個應用程序要路由到哪裏。使你的默認路由器與所有的Django的東西,然後定義你的遺傳數據庫在必要時。

最後,對於用戶模型退房「在Django自定義身份驗證」(我不能發佈的鏈接,因爲這是我的第一個答案,我沒有足夠的聲譽)的文檔。您需要編寫一個自定義模型(並根據您的實現編寫可能的管理員表單和自定義身份驗證權限),並通過您的項目settings.py將其包含在AUTH_USER_MODEL中。該頁面上的關鍵部分是「替換自定義用戶模型」。如果只是將密碼與用戶進行匹配,那麼它應該基本上無痛苦,但是,要小心密碼的散列方式。您的settings.py中的PASSWORD_HASHERS告訴django保存哈希時使用的哈希(以及首選順序)。如果你想保持一定的哈希方案,你需要將它移到列表的頂部,否則,當需要進行PW訪問時,Django會將它移植到第一個列出的,因此是首選的方案。這實際上是一個很棒的功能,因爲它可以將密碼自動遷移到更強大的方案,但如果您需要與其他系統集成,可能需要注意一些問題。

作爲一般指針(並且這絕對不是用作RTM)Django文檔非常好,通常會回答您的問題(如果不是源代碼很可讀,而且我必須解決一些問題這樣的事情)。但是,正如你可能注意到的,直到你意識到你正試圖解決的問題以及Django所稱的問題,將它們合併在一起可能有點令人困惑。如果您打算根據Django做任何事情來獲得關於主要文檔的良好閱讀(可能兩次),以幫助製作這些作品,那將是值得的。希望這可以回答你的問題,並讓你瞭解去哪裏的感受,因爲你可以看到這個場景可以有一些寬泛,所以讓我知道如果一個更具體的問題給你提出問題,否則這些是我記得實施的關鍵點和在我寫這個代碼審查。

+0

嘿謝謝您這個信息,我會試着去做你正在建議的事情,並讓你知道。謝謝你的快速反應。 – user3799942

+0

很酷。此外,我想我應該提及,我假設(和所有的步驟),有理由保持你的舊數據庫完好無損。如果您只想從舊數據庫獲取用戶名和密碼,那麼讓Django爲您創建一個新的數據庫,然後編寫一些SQL以將值移動到Django授權表中的相應位置可能會更容易。在我的情況下,遺留數據庫很重要。 – Jmills

+0

其實,因爲我正在測試這個東西,我只是想讓Django在新數據庫的表中搜索用戶。我現在只有10個用戶只用於測試,他們都在我創建的數據庫中,爲什麼我只是想讓django指向那個。我會告訴你的答案,看看它是否有幫助。先謝謝你。 – user3799942