7

Tôi đang sử dụng djangoappengine. Khi tôi thử tạo người dùng mới, xác thực người dùng đó và đăng nhập họ, tôi nhận được lỗi sau AttributeError: 'AnonymousUser' object has no attribute 'backend'.Django App Engine: AttributeError: đối tượng 'AnonymousUser' không có thuộc tính 'backend'

Mã của tôi là đơn giản và trông giống như:

user = User.objects.create_user(username, username, password) 
user.set_password(password) 
user.save() 

user = django.contrib.auth.authenticate(username=username, password=password) 
django.contrib.auth.login(request, user) 

tôi chỉ nhận được lỗi sau về sản xuất và chỉ thỉnh thoảng mới:

web req_create: 'AnonymousUser' object has no attribute 'backend' 
Traceback (most recent call last): 
    File "/base/data/home/apps/s~XXXXX/1.356802202883392818/XXXX/XXX.py", line 332, in req_create 
    login(request, user) 
    File "/base/data/home/apps/s~XXXXX/1.356802202883392818/django/contrib/auth/__init__.py", line 82, in login 
    request.session[BACKEND_SESSION_KEY] = user.backend 
AttributeError: 'AnonymousUser' object has no attribute 'backend' 

Tôi không chắc chắn, nhưng tôi có linh cảm xấu đó ngoại lệ này là do lưu trữ dữ liệu nhân rộng cao và tính nhất quán cuối cùng của nó. Tôi nghĩ rằng authenticate() lưu giá trị người dùng và rằng login() thực hiện truy vấn nhưng giá trị người dùng vẫn chưa được truyền vào HRDS. Bất cứ ai có thể xác nhận điều này là đúng? Nếu vậy, làm thế nào nó sẽ được cố định?

+0

Vui lòng vượt qua lỗi gốc với lần truy nguyên. – Nilesh

+0

Đã thêm dấu vết. – speedplane

Trả lời

3

Khi bạn lưu người dùng, nó sẽ không được kích hoạt tự động. Vui lòng kiểm tra liên kết cho AnonymousUser cho biết cách người dùng của bạn trở thành AnonymousUser.

Vì vậy, bạn phải đặt tất cả các mục có thể khiến người dùng của bạn là AnonymousUser. Trước khi xác thực, vui lòng kiểm tra user.is_anonymous().

+0

Tôi không nghĩ vậy. Như bạn có thể thấy trong đoạn mã trên, tôi tạo người dùng và xác thực nó trước khi cố gắng đăng nhập. Nó không phải là một người dùng nặc danh. – speedplane

+0

có nhưng hãy kiểm tra 'is_anonymous()'. Khi bạn tạo user, nó sẽ không tự động 'active', vì vậy hãy chắc chắn rằng' is_anonymous() 'sẽ trả về' False' và 'is_authenticated()' phải trả về 'True'. – Nilesh

0

Điều đó xảy ra khi người dùng không được xác thực. Hãy chắc chắn rằng bạn đang sử dụng cùng một lĩnh vực cho loging Backend ... ví dụ tôi loging với email (Backend sử dụng email và mật khẩu) để

django.contrib.auth.authenticate(username=username, password=password) 

nếu cho tôi

django.contrib.auth.authenticate(username=email, password=password) 

Backend là tại đây: http://www.micahcarrick.com/django-email-authentication.html

0

Nếu bạn đang sử dụng bản sao trong cơ sở dữ liệu của mình và đọc từ bản sao đã đọc trong khi ghi vào cơ sở dữ liệu chủ/mặc định của mình, thì nếu có trễ trễ sao chép cũng có thể gây ra điều này. Bạn sẽ viết thư cho chủ trong khi xác thực sẽ cố gắng đọc từ bản sao đã đọc dẫn đến việc không tìm thấy Người dùng.

Giải pháp là thiết lập bộ định tuyến của bạn để sử dụng db mặc định cho truy vấn Người dùng.