2010-05-11 55 views
9

我想使我的用戶對象都具有相同的基本行爲,並要做到這一點,我需要添加一些方法/屬性給匿名用戶。在Django中擴展匿名用戶的最佳方式是什麼?

我已經subclassed用戶使更豐富的用戶對象,但我想知道是否有人對匿名用戶做了相同的?如果有任何喜歡的方式做!

+2

我認爲擴展用戶模型的首選方法不是爲User類繼承,而是創建一個單獨的UserProfile類,然後向它添加所需的字段並建立與User類的ForeignKey關係。 – 2010-05-11 07:53:26

+1

是的,我可以看到爲什麼會更可取,但AnonymousUser無論如何都沒有UserProfile,因爲它們沒有FK到哪裏。 – Ross 2010-05-11 09:38:58

回答

8

你的中間件的建議讓我想到了,現在我認爲最好的想法是覆蓋標準AuthenticationMiddleware。該類爲該請求分配一個LazyUser對象,該對象在訪問時通過調用contrib.auth.get_user解析爲正確的用戶。這可能是重寫事件的正確地方,因此它會調用您的自定義get_user函數,該函數會返回您的子類AnonymousUser

+1

作品讚賞丹尼爾!繼承人繁榮的副本:[自定義身份驗證後端](http://gist.github.com/397817) – Ross 2010-05-11 20:29:41

+0

後裔,,提前,謝謝 – jfunk 2016-12-08 02:23:29

0

您應該繼承或創建與AnonymousUser class具有一對一關係的模型。

+0

子類化將是理想的,但更多的是實現它的實用性,因爲AnonymousUser類直接在許多地方導入。 – Ross 2010-05-11 09:42:37

2

我開始認爲中間件可能是檢查request.user類的最簡單的解決方案,如果是AnonymousUser,然後將其替換爲具有額外屬性的子類AnonymousUser。

這聽起來合理嗎?

1

一種更簡單和更普遍的(但安全性較差)解決方案是隻用你自己的類取代django.contrib.auth.models.AnonymousUser

class YourAnonymousUser(...): 
    ... 


import django.contrib.auth.models as django_auth_models 
django_auth_models.AnonymousUser = YourAnonymousUser 

截至1.10.5,Django的懶洋洋進口匿名用戶類,這樣你就贏了不會遇到核心Django的問題。你也很少直接與AnonymousUser互動,因爲你可以使用.is_anonymous(),所以你應該沒問題,只要你知道你的依賴使用AnonymousUser

1

最好的方法是使用一個python包(或者自己寫),它將把Django默認的AnonymousUser類與你自己的類交換。你可以爲此實現一箇中間件(我認爲這是最好的地方)。

例如,您可以使用django-custom-anonymous來提供AnonymousUser的自定義。你也可以在pypi找到它。

+0

雖然此鏈接可能回答這個問題,最好包括這裏的答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18949949) – 2018-02-27 14:40:27

相關問題