how to fix the 'AnonymousUser' object has no attribute 'profile' error?

django, django-models, django-views, python, python-2.7

Solution

Because that user has not logged in yet. Django treat them as AnonymousUser and AnonymousUser does not have the `profile` property.

If the view is only for logged in user, you can add the `login_required` decorator to the view function to force the login process. Otherwise, you need to judge whether a user is anonymous with the `is_authenticated` function.

Reference: Using the Django authentication system

Problem

I'm writing a chat app for a hypothetical social network but when I try to open the chat page I give the following error 'AnonymousUser' object has no attribute 'profile' error . I think there may be problem in the models file but I can't really figure out how to fix it and I'm really confused now!? can anyone give any suggestions?? parts of the chat views.py ``` def index(request): if request.method == 'POST': print request.POST request.user.profile.is_chat_user=True logged_users = [] if request.user.username and request.user.profile.is_chat_user: context = {'logged_users':logged_users} cu = request.user.profile cu.is_chat_user = True cu.last_accessed = utcnow() cu.save() return render(request, 'djangoChat/index.html', context) try: eml = request.COOKIES[ 'email' ] pwd = request.COOKIES[ 'password' ] except KeyError: d = {'server_message':"You are not logged in."} query_str = urlencode(d) return HttpResponseRedirect('/login/?'+query_str) try: client = Vertex.objects.get(email = eml) context = {'logged_users':logged_users} cu = request.user.profile cu.is_chat_user = True cu.last_accessed = utcnow() cu.save() if client.password != pwd: raise LookupError() except Vertex.DoesNotExist: sleep(3) d = {'server_message':"Wrong username or password."} query_str = urlencode(d) return HttpResponseRedirect('/login/?'+query_str) return render_to_response('djangoChat/index.html', {"USER_EMAIL":eml,request.user.profile.is_chat_user:True}, context_instance=RequestContext(request)) @csrf_exempt def chat_api(request): if request.method == 'POST': d = json.loads(request.body) msg = d.get('msg') user = request.user.username gravatar = request.user.profile.gravatar_url m = Message(user=user,message=msg,gravatar=gravatar) m.save() res = {'id':m.id,'msg':m.message,'user':m.user,'time':m.time.strftime('%I:%M:%S %p').lstrip('0'),'gravatar':m.gravatar} data = json.dumps(res) return HttpResponse(data,content_type="application/json") # get request r = Message.objects.order_by('-time')[:70] res = [] for msgs in reversed(r) : res.append({'id':msgs.id,'user':msgs.user,'msg':msgs.message,'time':msgs.time.strftime('%I:%M:%S %p').lstrip('0'),'gravatar':msgs.gravatar}) data = json.dumps(res) return HttpResponse(data,content_type="application/json") def logged_chat_users(request): u = Vertex.objects.filter(is_chat_user=True) for j in u: elapsed = utcnow() - j.last_accessed if elapsed > datetime.timedelta(seconds=35): j.is_chat_user = False j.save() uu = Vertex.objects.filter(is_chat_user=True) d = [] for i in uu: d.append({'username': i.username,'gravatar':i.gravatar_url,'id':i.userID}) data = json.dumps(d) return HttpResponse(data,content_type="application/json") ``` and parts of my chat models: ``` class Message(models.Model): user = models.CharField(max_length=200) message = models.TextField(max_length=200) time = models.DateTimeField(auto_now_add=True) gravatar = models.CharField(max_length=300) def __unicode__(self): return self.user def save(self): if self.time == None: self.time = datetime.now() super(Message, self).save() def generate_avatar(email): a = "http://www.gravatar.com/avatar/" a+=hashlib.md5(email.lower()).hexdigest() a+='?d=identicon' return a def hash_username(username): a = binascii.crc32(username) return a # the problem seems to be here ??! User.profile = property(lambda u: Vertex.objects.get_or_create(user=u,defaults={'gravatar_url':generate_avatar(u.email),'username':u.username,'userID':hash_username(u.username)})[0]) ``` and finally parts of the another app(ChatUsers): ``` class Vertex(models.Model,object): user = models.OneToOneField(User) password = models.CharField(max_length=50) #user_id = models.CharField(max_length=100) username = models.CharField(max_length=300) userID =models.IntegerField() Message = models.CharField(max_length=500) firstname = models.CharField(max_length=50) lastname = models.CharField(max_length=50) email = models.EmailField(max_length=75) is_chat_user = models.BooleanField(default=False) gravatar_url = models.CharField(max_length=300,null=True, blank=True) last_accessed = models.DateTimeField(auto_now_add=True) ```

Original source