Django không lưu trữ mật khẩu dưới dạng văn bản thuần. Nó lần đầu tiên băm chúng và chúng lưu trữ băm. Vì vậy, khi người dùng đăng nhập, Django áp dụng cùng hàm băm cho đầu vào của người dùng và sau đó so sánh hai băm - từ đầu vào của người dùng và những gì được lưu trữ trong db.
Tuy nhiên để làm cho mọi thứ linh hoạt hơn, Django không lưu trữ mật khẩu băm, cũng như vậy nhưng ngoài ra, nó cũng lưu trữ thuật toán mà băm được tạo ra. Hãy tưởng tượng kịch bản này - bạn sử dụng hàm băm X
để tạo ra các băm mật khẩu, nhưng sau đó bạn nhận ra rằng hàm đó không còn an toàn vì bất kỳ lý do gì và bạn chuyển sang hàm băm Y
. Tuy nhiên, đó là một vấn đề bởi vì tại thời điểm, băm mật khẩu của ai được lưu trữ bằng cách sử dụng hàm X
, chúng sẽ không thể đăng nhập được nữa. Đó là lý do tại sao Django cũng lưu trữ các phương pháp mà theo đó đã được tạo ra, ngoài các giá trị băm chính nó. Thực tế là Django lưu trữ phương thức mà băm được tạo ra trong db, khi đọc giá trị, nó không thực sự nói cho Django biết cách thực thi hàm băm. Vì vậy, PASSWORD_HASHERS
giống như một người lập bản đồ giữa hàm băm Python (thực ra là một lớp nhưng dù sao ...) và giá trị được lưu trữ trong db.
Quay lại câu hỏi của bạn. Thông báo lỗi có nghĩa là Django không nhận thức được hàm băm password
được sử dụng để lưu trữ băm mật khẩu trong cơ sở dữ liệu của bạn hoặc ít nhất là không có trong số PASSWORD_HASHERS
.
Tôi có thể nghĩ đến một vài lý do khiến điều đó có thể xảy ra.
Hãy chắc chắn rằng sau đó bạn làm syncdb
, nó sử dụng cùng một tập tin settings.py
như khi bạn đang chạy các máy chủ để truy cập admin. Nó có thể là trường hợp các cài đặt khác nhau được sử dụng.
Tuy nhiên, nhà phát triển thường không sửa đổi PASSWORD_HASHERS
trong settings.py
và chỉ sử dụng giá trị mặc định. Trong trường hợp đó, hãy đảm bảo bạn đang sử dụng cùng một Python với cùng phiên bản đã cài đặt của Django khi bạn thực hiện syncdb
và khi bạn chạy máy chủ. Nếu bạn làm syncdb
trong một virtualenv, ví dụ, và chạy máy chủ trong env khác nhau, sau đó phiên bản Django có thể khác nhau, do đó họ có thể có cài đặt khác nhau cho PASSWORD_HASHERS
và do đó bạn chạy syncdb
, nó có thể sử dụng hàm băm không được định nghĩa khi bạn chạy máy chủ.
Bạn có thể đọc thêm về cách Django lưu trữ mật khẩu tại https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords hoặc đọc toàn bộ trang để nhận hiểu rõ hơn về cách hoạt động của công cụ Django auth, bao gồm xác thực người dùng. – miki725