2017-08-13 39 views
1

我有一個簡單的聊天應用程序,我在其中自定義身份驗證後端以僅使用名稱。到目前爲止,它正在工作,用戶使用Django login()登錄。無法在Django中分配用戶

現在我有一個分配給用戶一個問題,即這個錯誤過來了,CUS應用程序的其它部分停止:

ValueError: Cannot assign "<SimpleLazyObject: 
    <django.contrib.auth.models.AnonymousUser 
    object at 0x7f7db7b71e80>>": "PChat.user" must be a "User" instance. 

View.py

from chatbot import settings 
from django.shortcuts import render 
from django.http import HttpResponse, JsonResponse,HttpResponseRedirect 
from django.views.decorators.csrf import csrf_exempt 
from django.contrib.auth import authenticate, login 
from Pchat.models import PChat 
from django.contrib.auth.models import User 


@csrf_exempt 
def P_home(request): 
    context= locals() 
    template= 'P_home.html' 
    return render(request,template,context) 

@csrf_exempt 
def P_chat(request): 
    context= locals() 
    template= 'P_chat.html' 
    return render(request,template,context) 

@csrf_exempt 
def LogIIn(request): 
    if request.method == "POST": 
     name = request.POST.get('param1') 
     user = authenticate(username=name) 
     login(request, user) 
    return HttpResponse("OK") 

    @csrf_exempt 

    def Post(request): 
    if request.method == "POST": 
     msg = request.POST.get('param1') 
     if request.user.is_authenticated(): 
      c = PChat(user=request.user, message=msg) 
      c.save() 
      return JsonResponse({ 'msg': msg, 'user': c.request.user }) 
     else: 
     return HttpResponse("Account None") 

models.py

from django.db import models 
    from django.db import models 
    from django.contrib.auth.models import User 

    class PChat(models.Model): 
     created = models.DateTimeField(auto_now_add=True) 
     user = models.ForeignKey(User) 
     message = models.CharField(max_length=200) 

     def __unicode__(self): 
      return self.message 

auth_backend.py

from django.contrib.auth.backends import ModelBackend 
    from django.contrib.auth.models import User 

    class PasswordlessAuthBackend(ModelBackend): 
     """Log in to Django without providing a password.""" 
     def authenticate(self, username=None): 
     try: 
      return User.objects.get(username=username) 
     except User.DoesNotExist: 
      return None 

     def get_user(self, user_id): 
      try: 
      return User.objects.get(pk=user_id) 
      except User.DoesNotExist: 
      return None  

回答

1

你必須在線路問題:

c = PChat(user=request.user, message=msg) 

request.user不是用戶對象。首先檢查request.user是否是實際用戶。

if request.user.is_authenticated(): 
    c = PChat(user=request.user, message=msg) 
     c.save() 
     return JsonResponse({ 'msg': msg, 'user': c.user.username }) 
else: 
    return JsonResponse({ 'msg': 'user is not logged in' }) 

編輯

def Post(request): 
    if request.method == "POST": 
     msg = request.POST.get('param1') 
     if request.user.is_authenticated(): 
      c = PChat(user=request.user,   message=msg) 
      c.save() 
      return JsonResponse({ 'msg': msg, 'user': c.request.user }) 
    return HttpResponse("Account None") 
+0

感謝大家的反饋,我已經試過您的解決方案通過我得到這個錯誤' ValueError異常:視圖Pchat.Pviews.Post沒有返回HttpResponse對象。它返回None而不是。' – Eman

+0

你可以在上述問題中更新你的代碼嗎? –

+0

我更新了Pview.py中的代碼 – Eman

1

OK,有您的代碼的幾個誤區:

1)在P_homeP_chat您使用的當地人(),這不是推薦的。你必須儘可能避免這種情況。您需要明確將數據傳遞給上下文字典。

2)在LogIIn查看您必須在用戶不是None時調用登錄功能。 [1]

3)最後的錯誤是在郵政視圖,必須先詢問wheter request.user被認證或不使用request.user.is_authenticated()函數。如果用戶通過身份驗證,則request.user是正常的用戶實例在其他情況下它將成爲AnonymousUser,它們都是不同的東西。現場用戶PChat模型期待一個用戶代替AnonymousUser實例。

[1] https://docs.djangoproject.com/en/1.11/topics/auth/default/#how-to-log-a-user-in

+0

我厭倦了使用request.user.is_authenticated()派系,但現在我得到了這個錯誤:ValueError:The view Pchat .Pviews.Post沒有返回HttpResponse對象。它返回None。「# – Eman

+0

您需要確保您的視圖正在返回一些內容。如果用戶未通過身份驗證,則按照NeErAj KuMaR的建議返回帶有相應錯誤的JsonResponse。 – lcastillov

+0

它看起來像用戶沒有進行身份驗證,因爲當我檢查數據庫Pchat模型/表是空的,測量該c.save沒有工作 – Eman