Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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)
like image 543
Soheil Avatar asked Apr 18 '14 15:04

Soheil


1 Answers

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

like image 112
Leonardo.Z Avatar answered Nov 20 '22 08:11

Leonardo.Z