簡體   English   中英

自定義身份驗證方法還是其他某種方法? Django的

[英]Custom authenticate method or maybe some other way to do the same? Django

這是一個初學者的問題。 我在mysql中有一個帶有表的數據庫,用於存儲帶有用戶名和密碼的用戶,就這么簡單。 我不想使用django首次運行“ SyncDb”時安裝的身份驗證后端和表。 所以我的問題是:我如何告訴Django使用我創建的數據庫,而不是在預定義的數據庫中查找活動用戶。 我正在使用此代碼,但是當然這是在已經提到的“ auth_user”表中尋找用戶。

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個參數)任何建議請告訴我。 再次非常感謝

我們必須為我們的項目弄清楚這一點,最初的困惑來自以下事實:您基本上需要在Django中處理兩個問題才能實現:

1)確保該應用已路由到正確的數據庫1a)確保其他數據庫實際上可以由Django編寫

2)創建一個“應用”模塊以覆蓋默認的用戶模型

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

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

第一部分“定義數據庫”將向您展示如何向項目中添加其他數據庫。 確保您具有用於訪問的Django憑據,因此取決於您的訪問結構,該憑據可能包含附加步驟,也可能不包含附加步驟。

之后,“自動數據庫路由”部分將解釋db路由器背后的一般思想。 但是,我建議您檢查一下這個精彩的討論,並利用該代碼簡化數據庫路由: http : //justcramer.com/2010/12/30/database-routers-in-django/ 這樣,您就可以使您的項目使用此路由器,並在settings.py(DATABASE_CONFIG)中定義一個lib,以在將DATABASE_ROUTERS設置為鏈接中的代碼后告訴每個應用程序將路由到何處。 使您的默認路由器成為具有所有django內容的路由器,然后在必要時定義舊版數據庫。

最后,對於用戶模型,請查看“在Django中自定義身份驗證”文檔(我無法發布鏈接,因為這是我的第一個答案,並且我的信譽不高)。 您將需要編寫一個自定義模型(以及可能的管理表單和基於您的實現的權限的自定義身份驗證),並將其包含在您的項目settings.py中,並帶有AUTH_USER_MODEL。 該頁面上的關鍵部分是“替換自定義用戶模型”。 如果只是簡單地將密碼與用戶匹配就簡單,那么應該很容易,但是請注意如何對密碼進行哈希處理。 您settings.py中的PASSWORD_HASHERS告訴django哈希器在保存密碼(以及首選順序)時使用密碼。 如果要保留某種哈希方案,則需要將其移動到列表的頂部,否則,Django將在需要進行PW訪問時將其移植到第一個列出的首選方案。 這實際上是一個很棒的功能,因為它將自動將密碼遷移到更強大的方案中,但是如果您需要與其他系統集成,則可能需要牢記。

作為通用指針(決不是RTM),Django文檔非常好,並且通常會回答您的問題(如果不是,則源代碼可讀性強,我不得不以這種方式解決一些問題) 。 但是,您可能會注意到,在意識到要解決的問題以及Django所說的問題之前,將各個部分組合在一起可能會有些混亂。 如果您打算對Django進行任何操作以使主要文檔有一個很好的閱讀,這可能值得您花費時間,可能要兩次,以幫助使這些文檔變得合適。 希望這可以回答您的問題,並讓您對應該去的方向有所了解,因為您可以看到這種情況可能會有所擴展,因此,請讓我知道是否有更具體的問題給您帶來問題,否則,這些就是我記得在實施和實施過程中要注意的重點我撰寫本文時進行了代碼審查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM