我想使我的用戶對象都具有相同的基本行爲,並要做到這一點,我需要添加一些方法/屬性給匿名用戶。在Django中擴展匿名用戶的最佳方式是什麼?
我已經subclassed用戶使更豐富的用戶對象,但我想知道是否有人對匿名用戶做了相同的?如果有任何喜歡的方式做!
我想使我的用戶對象都具有相同的基本行爲,並要做到這一點,我需要添加一些方法/屬性給匿名用戶。在Django中擴展匿名用戶的最佳方式是什麼?
我已經subclassed用戶使更豐富的用戶對象,但我想知道是否有人對匿名用戶做了相同的?如果有任何喜歡的方式做!
你的中間件的建議讓我想到了,現在我認爲最好的想法是覆蓋標準AuthenticationMiddleware
。該類爲該請求分配一個LazyUser
對象,該對象在訪問時通過調用contrib.auth.get_user
解析爲正確的用戶。這可能是重寫事件的正確地方,因此它會調用您的自定義get_user
函數,該函數會返回您的子類AnonymousUser
。
您應該繼承或創建與AnonymousUser class具有一對一關係的模型。
子類化將是理想的,但更多的是實現它的實用性,因爲AnonymousUser類直接在許多地方導入。 – Ross 2010-05-11 09:42:37
我開始認爲中間件可能是檢查request.user
類的最簡單的解決方案,如果是AnonymousUser,然後將其替換爲具有額外屬性的子類AnonymousUser。
這聽起來合理嗎?
一種更簡單和更普遍的(但安全性較差)解決方案是隻用你自己的類取代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
。
最好的方法是使用一個python包(或者自己寫),它將把Django默認的AnonymousUser類與你自己的類交換。你可以爲此實現一箇中間件(我認爲這是最好的地方)。
例如,您可以使用django-custom-anonymous來提供AnonymousUser的自定義。你也可以在pypi找到它。
雖然此鏈接可能回答這個問題,最好包括這裏的答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18949949) – 2018-02-27 14:40:27
我認爲擴展用戶模型的首選方法不是爲User類繼承,而是創建一個單獨的UserProfile類,然後向它添加所需的字段並建立與User類的ForeignKey關係。 – 2010-05-11 07:53:26
是的,我可以看到爲什麼會更可取,但AnonymousUser無論如何都沒有UserProfile,因爲它們沒有FK到哪裏。 – Ross 2010-05-11 09:38:58