Django by example Book

Building a Social Website with Django – Phần 3

Dịch từ: Django by example – Antonio Melé

SỬ DỤNG AUTHENTICATION VIEWS TRONG DJANGO

Django tích hợp nhiều forms và views trong framework authentication để cho bạn có thể tùy chọn sử dụng. View login bạn đã tạo là một ví dụ tốt để hiểu quy trình xác thực người dùng trong Django. Tuy nhiên, bạn có thể sử dụng xác thực mặc định trong Django trong hầu hết các trường hợp.

Django cung cấp các views theo sau trong việc xác thực:

  • login: Form xử lý người dùng đăng nhập
  • logout: Xử lý người dùng đăng xuất
  • logout_then_login: Đăng xuất và chuyển hướng đến page đăng nhập.

Django cung cấp các views theo sau để xử lý việc thay đổi password:

  • password_change: Form xử lý việc thay đổi password người dùng.
  • password_change_done: Hiển thị page success khi người dùng thay đổi mật khẩu thành công.

Django cũng bao gồm các views sau cho phép người dùng reset password của họ:

  • password_reset : Cho phép người dùng reset password. Nó sẽ sinh ra một liên kết sử dụng một lần với token và gửi nó đến tài khoản email người dùng.
  • password_reset_done: Hiển thị cho người dùng email reset password đã được gửi đến tài khoản.
  • password_reset_confirm: Cho phép người dùng thiết lập password mới.
  • password_reset_complete: Hiển thị page cho người dùng biết họ đã reset password thành công.

Danh sách các views ở đây có thể giúp bạn tiết kiệm nhiều thời gian khi tạo website với tài khoản người dùng. Các views sử dụng giá trị mặc định để bạn có thể tùy biến như vị trí của template để render hoặc form sử dụng bởi view.

Bạn có thể đọc thêm nhiều thông tin về xây dựng views xác thực tại địa chỉ: https://docs.djangoproject.com/en/1.8/topics/auth/default/#module-django.contrib.auth.views.

VIEWS LOG-IN VÀ LOG-OUT

Thay đổi file urls.py trong ứng dụng account của bạn giống như sau:

1

Chúng ta comment URL pattern user_login view mà chúng ta đã tạo trong phần trước để sử dụng view login của framework authentication trong Django.

Tạo một folder tên là registration bên trong folder template trong ứng dụng account của bạn. Đây là đường dẫn mặc định nơi views xác thực trong Django sẽ sử dụng template của bạn. Tạo một file mới bên trong thư mục này, đặt tên login.html , và thêm vào đoạn mã sau:

2

Template login này hơi giống với một template mà chúng ta đã tạo trước đây. Django sử dụng mặc định AuthenticationForm tại django.contrib.auth.forms. Form này sử dụng để xác thực người dùng và hiển thị lỗi nếu đăng nhập không thành công. Trong trường hợp này, chúng ta có thể sử dụng {% if form.errors %} trong template để kiểm tra nếu đăng nhập lỗi. Chú ý, ở đây chúng ta có thêm một thẻ hidden field HTML <input> để submit value của biến gọi là next. Biến này thiết lập đầu tiên bởi view login khi bạn pass một paramater trong request (ví dụ http://127.0.0.1:8000/account/login/?next=/account/)

Paramater next phải có trên URL. Nếu paramater này tồn tại, view login trong Django sẽ chuyển tiếp đến URL sau khi người dùng đăng nhập.

Bây giờ, tạo một template logged_out.html bên trong thư mục template registration và điền đoạn code sau:

3

Đây là template Django sẽ hiển thị sau khi người dùng đăng xuất.

Sau khi thêm vào URL pattern và template cho login và logout views, website của bạn sẵn sàng cho người dùng login sử dụng authentication views trong Django.

Lưu ý: view login_then_login mà chúng ta tích hợp trong urlconf không cần bất kỳ template nào để nó thực hiện chuyển hướng đến views login.

Bây giờ, chúng ta sẽ tạo một view mới hiển thị dashboard đến người dùng khi họ đăng nhập thành công. Mở field views.py của ứng dụng account và thêm vào đoạn code sau:

update_view

Chúng ta decorate view của chúng ta với decorator login_required của authentication framework. Decorator login_required kiểm tra nếu người dùng hiện tại được xác thực. Nếu người dùng được xác thực nó sẽ thực hiện decorated view, nếu người dùng chưa xác thực, nó sẽ chuyển hướng đến URL login với URL mà người dùng đang cố gắng truy cập với một paramater trên GET tên là next. Bằng cách này, view login chuyển hướng người dùng trở lại URL mà họ đang cố gắng truy cập sau khi đã đăng nhập thành công. Nhớ rằng chúng ta có thêm một hidden field input trong form của template log-in cho mục đích này.

Chúng ta cũng định nghĩa một biến section. Chúng ta sử dụng biến này để giám sát các phần của website mà người dùng đang xem. Nhiều views có thể giống nhau đến cùng section. This is a simple way to define which section each view corresponds to.

Bây giờ, bạn cần tạo một template cho dashboard view. Tạo một file bên trong thư mục template/account và đặt tên dashboard.html.

5

Sau đó, cần thêm URL pattern sau cho view này trong file urls.py của ứng dụng account:

6

Thay đổi nội dung file setting.py của project và thêm vào đoạn code sau:

7

Một số thiết lập như:

  • LOGIN_REDIRECT_URL: nói cho Django biết rằng URL chuyển tiếp sau khi login nếu view contrib.auth.views.login không có paramater next.
  • LOGIN_URL: là URL chuyển hướng người dùng to view log-in (sử dụng decorator login_request)
  • LOGOUT_URL : là URL chuyển hướng người dùng đến view log-out.

Chúng ta sử dụng reverse_lazy() để xây dựng URL tự động với tên của chúng. Hàm reverse_lazy() dịch ngược URL giống như phương thức reverse() làm, nhưng bạn có thể sử dụng nó khi bạn cần đảo ngược URL trước cấu hình URL project được load.

Tổng quan những gì bạn cần làm là:

  • Thêm views xác thực login và logout đến project.
  • Tạo template tùy biến cho cả 2 views và định nghĩa một view đơn giản để chuyển hướng người dùng sau khi họ login thành công.
  • Cuối cùng, cấu hình các cài đặt URL sử dụng các URLs mặc định.

Bây giờ, chúng ta sẽ thêm liên kết log-in và log-out đến base template để đặt mọi thứ lại với nhau.

Đến đây, chúng ta cần xác định xem người dùng hiện tại có đăng nhập hay không để hiển thị liên kết đúng trong từng trường hợp. Người dùng hiện tại thiết lập trong object HttpRequest bởi xác thực kết nối. Bạn có thể truy cập đến nó với request.user . Bạn sẽ tìm một objec t user trong request thậm chí nếu người dùng không xác thực. Một người dùng không xác thực (non-authenticated) được thiết lập trong request như một thể hiện của AnonymousUser. Cách tốt nhất để kiểm tra nếu người dùng hiện tại xác thực hay không bằng cách gọi request.user.is_authenticated().

Thay đổi base.html  và chỉnh sửa phần tử <div>với ID header, như sau:

8

Như bạn có thể nhìn thấy, chúng ta chỉ hiển thị menu site đến người dùng xác thực. Chúng ta cũng kiểm tra section hiện tại để thêm một thuộc tính class selected đến item <li> tương ứng để highlight section hiện tại trong menu sử dụng CSS. Chúng ta cũng hiển thị firstname người dùng và liên kết đến logout nếu người dùng đã xác thực, ngược lại liên kết log-in.

Bây giờ, mở http://127.0.0.1:8000/account/login/ trên trình duyệt. Bạn sẽ nhìn thấy page login. Điền username password hợp lệ và click button Log-in. Bạn sẽ thấy một vài thứ giống như thế này:

9

Bạn có thể nhìn thấy section My dashboard được highlight với CSS bởi vì nó có class selected. Từ khi người dùng được xác thực, firstname của người dùng được hiển thị bên góc phải của header. Click trên liên kết Log-Out  bạn sẽ nhìn thấy page sau:

10

Đọc tiếp:

4 thoughts on “Building a Social Website with Django – Phần 3

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s