簡體   English   中英

更改頁面后,Django request.user變為匿名。 使用自定義用戶模型

[英]Django request.user becomes anonymous after changing page. Using custom user model

我正在使用擴展AbstractBaseUser的自定義用戶模型。 這是用戶模型:

class cUser(AbstractBaseUser):
    def save(self, *args, **kwargs):
        pass
    role_id = models.IntegerField()
    user_id = models.IntegerField()
    email = models.CharField(max_length=40)
    password = models.CharField(max_length=40)
    f_name = models.CharField(max_length=40)
    l_name = models.CharField(max_length=40)
    address_id = models.IntegerField()
    phone_num = models.IntegerField()
    loan_item_count = models.IntegerField()
    id = models.IntegerField(unique = True, primary_key = True)

    def __init__(self, dictionary, *args, **kwargs):
        self.role_id = int(dictionary['role_id'])
        self.user_id = dictionary['user_id']
        self.email = dictionary['email']
        self.password = dictionary['password']
        self.f_name = dictionary['f_name']
        self.l_name = dictionary['l_name']
        self.address_id = dictionary['address_id']
        self.phone_num = dictionary['phone_num']
        self.loan_item_count = dictionary['loan_item_count']
        self.id = self.user_id

    USERNAME_FIELD = 'user_id'
    class Meta:
        managed = False

我不希望模型以任何方式影響數據庫。 我正在通過網關方法中的簡單原始SQL查詢來加載它。

這是我處理登錄的方式:

def login_request(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = request.POST['username']
            password = request.POST['password']
            user = userGateway(username,password)
            if user is not None:
                print("=========USER==========")
                print(user.email)
                user.backend = 'django.contrib.auth.backends.ModelBackend'
                login(request,user)
                print(request.user.is_authenticated)
                if user.role_id==1:
                    return render(request, 'biblioteca/admin/landing.html')
                    # return HttpResponseRedirect('/')
                else:
                    return render(request, 'biblioteca/landing.html')
            else:
                print("=========NOT USER==========")
    else:
        if(request.user is not None and not request.user.is_anonymous):
            return render(request, 'biblioteca/admin/landing.html')
        form = LoginForm()
        return render(request, 'biblioteca/login.html', {'form': form})

如您所見,我在登錄前將后端設置為無需通過密碼即可進行身份驗證-通過將傳入的密碼與從數據庫檢索到的密碼進行比較來創建用戶對象時,便完成了密碼檢查。

如果返回一個render ,如此處所示,下一頁將包含正確的request.user對象。 如果返回重定向,則不會。 另外,如果我根本不離開該頁面,則該用戶將再次變得未經身份驗證且匿名,從而丟失會話。

對於為什么發生這種情況的任何幫助將不勝感激。

重定向時,請求完成,並且重定向代碼發送到客戶端,客戶端隨后向新頁面發出新請求,而沒有登錄表單的POST數據。 用戶可能沒有得到他們的令牌。 在這種情況下,請渲染一個頁面以將其記錄在延遲中幾秒鍾,然后將其重定向到正確的位置。

因此,可以通過將userGateway()轉換為適當的auth后端並像這樣實現來解決此問題。

原因說明:

django中的sessionID存儲用戶PK的哈希值以及用於登錄的auth后端。每當發送新請求時,所需的數據就使用該哈希值從數據庫中延遲加載。

這就是為什么login()在登錄頁面上正確驗證用戶身份的原因,因為它幾乎被迫進行身份驗證。 但是,一旦發生另一個請求,它將無法從數據庫中加載用戶的數據,並將刷新會話ID。

暫無
暫無

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

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