Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Introduction

Allowing users to log in to your app is one of the most common features you will add to your web applications. You can add authentication to your Flask app with the Flask-Login package.

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

In this tutorial, you will:

  • Use the Flask-Login library for session management
  • Use the built-in Flask utility for hashing passwords
  • Add protected pages to the app for logged in users only
  • Use Flask-SQLAlchemy to create a User model
  • Create sign-up and login forms for the users to create accounts and log in
  • Flash error messages back to users when something goes wrong
  • Use information from the users account to display on the profile page

Bạn sẽ xây dựng một đăng ký và một trang đăng nhập cho phép người dùng đăng nhập và truy cập các trang được bảo vệ. Bạn sẽ sử dụng thông tin từ User model and display it on the protected pages when the user logs in to simulate what a profile would look like.

Lưu ý: Hướng dẫn này bị giới hạn trong phạm vi và không bao gồm các phiên họp tiên tiến của các phiên. Hơn nữa, sửa đổi loại dữ liệu cho khóa chính hoặc các cân nhắc để di chuyển sang các hệ thống cơ sở dữ liệu khác nhau cũng nằm ngoài phạm vi của hướng dẫn giới thiệu này.

Mã nguồn cho dự án này có sẵn trên GitHub.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần như sau:

  • Một số quen thuộc với Python.
  • Python được cài đặt trên một môi trường địa phương.
  • Kiến thức về điều hướng Linux cơ bản và quản lý tập tin.

Dưới đây là sơ đồ để cung cấp cảm giác về cấu trúc tệp của dự án sẽ trông như thế nào khi bạn đã hoàn thành hướng dẫn:

. flask_auth_app Dự án __init__.py # Thiết lập ứng dụng auth.py # các tuyến auth cho ứng dụng db.sqlite # Cơ sở dữ liệu Main.py # các tuyến không xác thực cho ứng dụng mô hình.py # mô hình người dùng Mẫu Base.html # chứa bố cục và liên kết chung INDEX.HTML # Hiển thị trang chủ Đăng nhập.html # Hiển thị biểu mẫu đăng nhập hồ sơ.html # Hiển thị trang hồ sơ Đăng ký.html # Hiển thị mẫu đăng ký

Khi bạn tiến bộ thông qua hướng dẫn, bạn sẽ tạo các thư mục và tệp này.

Hướng dẫn này đã được xác minh bằng SQLite3 V3.36.0, Python V3.9.8, Flask V2.0.2, Đăng nhập Flask v0.5.0, và Flask-Sqlachemy V2.5.1. sqlite3 v3.36.0, python v3.9.8, flask v2.0.2, flask-login v0.5.0, and flask-sqlachemy v2.5.1.

Bước 1 - Cài đặt gói

Có ba gói chính bạn cần cho dự án của mình:

  • Bình giữ nhiệt
  • Đăng nhập Flask: Để xử lý các phiên người dùng sau khi xác thực
  • Flask-Sqlalchemy: Để đại diện cho mô hình và giao diện người dùng với cơ sở dữ liệu

Bạn sẽ sử dụng SQLite để tránh phải cài đặt bất kỳ phụ thuộc thêm nào cho cơ sở dữ liệu.

Đầu tiên, bắt đầu với việc tạo thư mục dự án:

  • mkdir flask_auth_app

Tiếp theo, điều hướng đến thư mục dự án:

  • CD flask_auth_app

Bạn sẽ muốn tạo môi trường Python nếu bạn không có.

LƯU Ý: Bạn có thể tham khảo hướng dẫn có liên quan đến môi trường cục bộ của mình để thiết lập Venv . < / a >. You can consult the tutorial relevant to your local environment for setting up venv.

Tùy thuộc vào cách Python đã được cài đặt trên máy của bạn, lệnh của bạn sẽ trông tương tự như:

  • python3 -m venv auth

the -m cờ dành cho Tên mô-đun . Lệnh này sẽ thực thi mô-đun venv để tạo môi trường ảo mới có tên auth . Điều này sẽ tạo một thư mục mới chứa bin , Bao gồm và lib thư mục con. Và pyvenv.cfg tệp. -m flag is for module-name. This command will execute the module venv to create a new virtual environment named auth. This will create a new directory containing bin, include, and lib subdirectories. And a pyvenv.cfg file.

Tiếp theo, chạy lệnh sau:

  • nguồn auth / bin / kích hoạt

Lệnh này sẽ kích hoạt môi trường ảo.

Chạy lệnh sau từ môi trường ảo của bạn để cài đặt các gói cần thiết:

  • Pip in flask flask-sqlalchemy-Đăng nhập

Bây giờ bạn đã cài đặt các gói, bạn đã sẵn sàng để tạo tệp ứng dụng chính.

Bước 2 - Tạo tệp ứng dụng chính

Hãy bắt đầu bằng cách tạo một dự án Danh mục:

  • Dự án MKDIR.

Tệp đầu tiên sẽ là __init__.py file cho dự án:

  • Dự án Nano / __ init__.py

Ứng dụng này sẽ sử dụng mô hình nhà máy ứng dụng Flask với các bản thiết kế. Một kế hoạch chi tiết xử lý các tuyến đường thông thường, bao gồm chỉ mục và trang hồ sơ được bảo vệ. Một kế hoạch chi tiết khác xử lý mọi thứ liên quan đến auth. Trong một ứng dụng thực, bạn có thể phá vỡ chức năng theo bất kỳ cách nào bạn thích, nhưng giải pháp được bảo hiểm ở đây sẽ hoạt động tốt cho hướng dẫn này.

Tệp này sẽ có chức năng tạo ứng dụng, sẽ khởi tạo cơ sở dữ liệu và đăng ký các bản thiết kế. Hiện tại, điều này sẽ không làm gì nhiều, nhưng nó sẽ cần thiết cho phần còn lại của ứng dụng.

Bạn sẽ cần khởi tạo SQLALCHEMY, đặt một số giá trị cấu hình và đăng ký các bản thiết kế ở đây:

project/__init__.py

Từ bình nhập khẩu bình từ flask_sqlalchemy nhập khẩu sqlalchemy # init sqlalchemy để chúng ta có thể sử dụng nó sau trong các mô hình của chúng tôi db = sqlalchemy () def created_app (): Ứng dụng = bình (__ tên__) app.config ['secret_key'] = ' Secret-Key-Goard-Dưới đây ' app.config ['sqlalchemy_database_uri'] = 'sqlite: ///db.sqlite' db.init_app (ứng dụng) # ballprint cho các tuyến auth trong ứng dụng của chúng tôi từ .Auth nhập auth như auth_blueprint app.register_blueprint (auth_blueprint) # kế hoạch chi tiết cho các phần không xác thực của ứng dụng từ .main nhập chính dưới dạng main_blueprint app.register_blueprint (main_blueprint) Trả lại ứng dụng.

Bây giờ bạn có tệp ứng dụng chính, hãy bắt đầu thêm vào các tuyến đường.

Bước 3 - Thêm tuyến đường

Đối với các tuyến đường, bạn sẽ sử dụng hai bản thiết kế.

cho main_blueprint , bạn sẽ có một trang chủ ( / ) và một trang hồ sơ ( / hồ sơ ). main_blueprint, you will have a home page (/) and a profile page (/profile).

Trước tiên, hãy tạo main.py :

  • Dự án Nano / Main.py

Sau đó thêm main_blueprint :

project/main.py

Từ bình in áp kế từ . Nhập db. Main = Blueprint ('Main', __name__) @ main.route ('/') def Index (): Trả về 'chỉ số' @ main.route ('/ hồ sơ') Def Cấu hình (): Trả về 'Hồ sơ'

cho auth_blueprint , bạn sẽ có các tuyến để truy xuất cả trang đăng nhập ( / đăng nhập < / a> ) và trang đăng ký ( / Đăng ký ). Cuối cùng, bạn sẽ có một lộ trình đăng xuất ( / đăng xuất ) để đăng xuất người dùng đang hoạt động. auth_blueprint, you will have routes to retrieve both the login page (/login) and the sign-up page (/signup). Finally, you will have a logout route (/logout) to log out an active user.

Tiếp theo, tạo auth.py :

  • Dự án Nano / auth.py

Sau đó thêm auth_blueprint :

project/auth.py

Từ bình in áp kế từ . Nhập db. auth = ballprint ('auth', __name__) @ auth.route ('/ đăng nhập') def login (): Trả về 'Đăng nhập' @ auth.route ('/ Đăng ký') def đăng ký (): Trả lại 'Đăng ký' @ auth.route ('/ logout') def logout (): Trả về 'Đăng xuất'

Trong thời gian hiện tại, xác định Đăng nhập , Đăng ký , và Đăng xuất với trả về văn bản. Bạn cũng sẽ có các tuyến để xử lý các yêu cầu POST từ Đăng nhập và Đăng ký . Bạn sẽ xem lại mã này sau này và cập nhật nó với chức năng mong muốn. .login, signup, and logout with text returns. You will also have routes for handling the POST requests from login and signup. You will revisit this code later and update it with the desired functionality.

Trong một thiết bị đầu cuối, bạn có thể đặt flask_app và flask_debug Giá trị: FLASK_APP and FLASK_DEBUG values:

  • Xuất Flask_app = Dự án
  • Xuất flask_debug = 1

flask_app Biến môi trường hướng dẫn bình về cách tải ứng dụng. Bạn sẽ muốn điều này chỉ vào nơi create_app được đặt. Đối với hướng dẫn này, bạn sẽ chỉ vào dự án .

the flask_debug Biến môi trường được bật bằng cách đặt nó thành 1 . Điều này sẽ cho phép trình gỡ lỗi sẽ hiển thị lỗi ứng dụng trong trình duyệt. FLASK_DEBUG environment variable is enabled by setting it to 1. This will enable a debugger that will display application errors in the browser.

Đảm bảo rằng bạn đang ở trong flask_auth_app và sau đó chạy dự án:

  • bình chạy

Bây giờ, trong trình duyệt web, bạn có thể điều hướng đến năm URL có thể và xem văn bản được trả về đã được xác định trong auth.py và main.py . auth.py and main.py.

Ví dụ: truy cập localhost: 5000 / Ép Hiển thị: Hồ sơ : localhost:5000/profile displays: Profile:

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Khi bạn đã xác minh rằng các tuyến đường đang thực hiện như mong đợi, bạn có thể tạo các mẫu.

Bước 4 - Tạo mẫu

Tiếp theo, tạo các mẫu được sử dụng trong ứng dụng. Đây là bước đầu tiên trước khi bạn có thể thực hiện chức năng đăng nhập thực tế.

Ứng dụng sẽ sử dụng bốn mẫu:

  • index.html
  • profile.html
  • login.html
  • signup.html

Bạn cũng sẽ có một mẫu cơ sở sẽ có mã chung cho mỗi trang. Trong trường hợp này, mẫu cơ sở sẽ có các liên kết điều hướng và bố cục chung của trang.

Đầu tiên, tạo một Mẫu Thư mục bên dưới Dự án Thư mục: .templates directory under the project directory:

  • MKDIR -P DỰ ÁN / MẪU

Sau đó tạo base.html :

  • Dự án / Mẫu / Base.html

Tiếp theo, thêm mã sau vào base.html Tệp:

project/templates/base.html

Flask Auth Example

{% block content %} {% endblock %}

Mã này sẽ tạo một loạt các liên kết menu đến mỗi trang của ứng dụng. Nó cũng thiết lập một khối cho nội dung có thể được ghi đè bởi các mẫu trẻ em.

Lưu ý: Hướng dẫn này sử dụng Bulma để xử lý kiểu dáng và bố cục. Để lặn sâu hơn thành Bulma, hãy xem xét đọc tài liệu Bulma chính thức.

Tiếp theo, tạo Mẫu / index.html :

  • Dự án / Mẫu / INDEX.HTML

Thêm mã sau vào tệp mới được tạo để thêm nội dung vào trang:

project/templates/index.html

{% extends "base.html" %} {% block content %}

Flask Login Example

Easy authentication and authorization in Flask.

{% endblock %}

Mã này sẽ tạo một trang chỉ mục cơ bản với một tiêu đề và phụ đề.

Tiếp theo, tạo Mẫu / login.html :

  • DỰ ÁN / MẪU NANO / ĐĂNG NHẬP.HTML

Mã này tạo ra một trang đăng nhập với các trường cho Email và Mật khẩu . Ngoài ra còn có một hộp kiểm để "nhớ" một phiên đăng nhập. Email and Password. There is also a checkbox to remember a logged in session.

project/templates/login.html

{% extends "base.html" %} {% block content %}

Login

Remember me
Login
{% endblock %}

Tiếp theo, tạo Mẫu / Đăng ký.html :

  • Dự án / Mẫu Nano / Đăng ký.html

Thêm mã sau để tạo trang đăng ký với các trường cho Email , Tên < / a> , và Mật khẩu : email, name, and password:

project/templates/signup.html

{% extends "base.html" %} {% block content %}

Sign Up

Sign Up
{% endblock %}

Tiếp theo, tạo Mẫu / Profile.html :

  • Dự án / Mẫu Nano / Hồ sơ.html

Thêm mã này để tạo một trang với một tiêu đề được mã hóa cứng để chào đón Anthony :

project/templates/profile.html

{% extends "base.html" %} {% block content %}

Welcome, Anthony!

{% endblock %}

Bạn sẽ xem lại mã này sau này để tự động chào hỏi bất kỳ người dùng nào.

Khi bạn đã thêm các mẫu, bạn có thể cập nhật các câu lệnh trả về trong mỗi tuyến để trả về các mẫu thay vì văn bản.

Tiếp theo, CẬP NHẬT main.py bằng cách sửa đổi dòng nhập và các tuyến đường cho Index và Hồ sơ : main.py by modifying the import line and the routes for index and profile:

project/main.py

Từ Flask nhập Blueprint , render_template ... @ main.route ('/') def Index (): trả về render_template ('index.html') @ main.route ('/ hồ sơ') Def Cấu hình (): trả lại render_template ('profile.html')

Bây giờ bạn sẽ cập nhật auth.py bằng cách sửa đổi dòng nhập và các tuyến đường nhập cho Đăng nhập và Đăng ký : auth.py by modifying the import line and routes for login and signup:

project/auth.py

Từ Flask nhập Blueprint , render_template ... @ auth.route ('/ đăng nhập') def login (): Trả về Render_Template ('login.html') @ auth.route ('/ Đăng ký') def đăng ký (): trả về render_template ('Đăng ký.html')

Khi bạn đã thực hiện các thay đổi này, đây là trang đăng ký trông như thế nào nếu bạn điều hướng đến / Đăng ký : ./signup:

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Bạn có thể điều hướng đến các trang cho / , / Đăng nhập , và / Profile là tốt. /, /login, and /profile as well.

rời khỏi / Đăng xuất một mình bây giờ vì nó sẽ không hiển thị một mẫu sau.

Bước 5 - Tạo mô hình người dùng

Mô hình người dùng thể hiện ý nghĩa của ứng dụng để có người dùng. Hướng dẫn này sẽ yêu cầu các trường cho một email address, password, and name. In future applications, you may decide you want much more information to be stored per user. You can add things like birthdays, profile pictures, locations, or any user preferences.

Các mô hình được tạo trong Flask-Sqlalchemy được đại diện bởi các lớp sau đó dịch sang các bảng trong cơ sở dữ liệu. Các thuộc tính của các lớp đó sau đó biến thành các cột cho các bảng đó.

Tạo Người dùng Model:

  • Dự án Nano / mô hình.py

Xác định người dùng Model:

project/models.py

từ . Nhập db. Người dùng lớp (db.model): id = db.column (db.integer, chính_key = true) # Phím chính được yêu cầu bởi Sqlalchemy Email = db.column (db.String (100), Unique = true) Mật khẩu = db.column (db.String (100)) Tên = DB.Column (DB.String (1000))

Mã này xác định Người dùng Với các cột cho ID , Email , Mật khẩu , và Tên . User with columns for an id, email, password, and name.

Bây giờ bạn đã tạo một mô hình người dùng model, you can move on to configuring your database.

Bước 6 - Cấu hình cơ sở dữ liệu

Bạn sẽ đang sử dụng cơ sở dữ liệu SQLite. Một mình có thể tự tạo một cơ sở dữ liệu SQLite, nhưng hãy có Flask-Sqlalchemy làm điều đó cho bạn. Bạn đã có đường dẫn của cơ sở dữ liệu được chỉ định trong __init__.py file, so you will need to tell Flask-SQLAlchemy to create the database in the Python REPL.

Đảm bảo rằng bạn vẫn còn trong môi trường ảo và trong flask_auth_app .

Nếu bạn dừng ứng dụng của mình và mở ra một confon, bạn có thể tạo cơ sở dữ liệu bằng Create_all trên db đối tượng: create_all method on the db object:

  • >> "> Từ dự án nhập db, create_app, mô hình
  • >> "> db.create_all (app = create_app ()) # vượt qua kết quả create_app để flask-sqlalchemy có cấu hình.

Lưu ý: Nếu sử dụng trình thông dịch Python là mới đối với bạn, bạn có thể tham khảo tài liệu chính thức.

Bây giờ bạn sẽ thấy db.sqlite trong thư mục dự án của bạn. Cơ sở dữ liệu này sẽ có bảng người dùng trong đó.

Bước 7 - Thiết lập chức năng ủy quyền

Đối với chức năng đăng ký, bạn sẽ lấy dữ liệu mà người dùng gửi đến biểu mẫu và thêm nó vào cơ sở dữ liệu. Bạn sẽ cần đảm bảo người dùng có cùng địa chỉ email chưa tồn tại trong cơ sở dữ liệu. Nếu nó không tồn tại, thì bạn cần đảm bảo rằng bạn băm mật khẩu trước khi đặt nó vào cơ sở dữ liệu.

Lưu ý: Lưu mật khẩu trong bản rõ được coi là một thực hành bảo mật kém. Bạn thường sẽ muốn một thuật toán băm phức tạp và muối để giữ mật khẩu an toàn.

Hãy bắt đầu bằng cách thêm một hàm thứ hai để xử lý dữ liệu biểu mẫu POST. Thu thập dữ liệu được truyền từ người dùng.

cập nhật auth.py bằng cách sửa đổi dòng nhập và triển khai Đăng ký_post : auth.py by modifying the import line and implementing signup_post:

project/auth.py

Từ Flask nhập Blueprint, render_template , chuyển hướng, url_for ... @ auth.route ('/ Đăng ký') def đăng ký (): return render_template ('đăng ký.html') @ auth.route ('/ đăng ký', phương thức = ['post']) def Đăng nhập_post (): # mã để xác thực và thêm người dùng vào cơ sở dữ liệu đi đây Chuyển hướng lại (url_for ('auth.login')))))))))))))

Tạo chức năng và thêm một chuyển hướng. Điều này sẽ cung cấp trải nghiệm người dùng về đăng ký thành công và được chuyển đến trang đăng nhập.

Bây giờ, hãy thêm phần còn lại của mã cần thiết để đăng ký người dùng. Sử dụng đối tượng yêu cầu để có được dữ liệu biểu mẫu.

Tiếp tục cập nhật auth.py Bằng cách thêm nhập và triển khai Đăng ký_post : auth.py by adding imports and implementing signup_post:

auth.py

Từ Phốt Nhập Bluet, Render_Template, Redirect, URL_FOR , Yêu cầu Từ Werkzeug.Security Nhập Generate_Password_hash Từ .models Nhập người dùng từ . Nhập db. ... @ auth.route ('/ đăng ký', các phương thức = ['bài']) def đăng nhập_post (): # mã để xác thực và thêm người dùng vào cơ sở dữ liệu đi đây email = request.form.get ('email') name = request.form.get ('tên') Password = request.form.get ('password') user = user.query.filter_by (email = email) .first () # Nếu điều này Trả về người dùng, sau đó email đã tồn tại trong cơ sở dữ liệu Nếu người dùng: # Nếu người dùng tìm thấy, chúng tôi muốn chuyển hướng trở lại trang đăng ký để người dùng có thể thử lại Chuyển hướng lại (URL_FOR ('auth.signup')))) # Tạo một người dùng mới với dữ liệu biểu mẫu. Băm mật khẩu để phiên bản văn bản hiện không được lưu. new_user = user (email = email, tên = tên, mật khẩu = tạo_password_hash (mật khẩu, phương thức = 'sha256')))))))))) # Thêm người dùng mới vào cơ sở dữ liệu db.session.add (new_user) db.session.commit () trả lại chuyển hướng (url_for ('auth.login')) ., request from werkzeug.security import generate_password_hash, check_password_hash from .models import User from . import db ... @auth.route('/signup', methods=['POST']) def signup_post(): # code to validate and add user to database goes here email = request.form.get('email') name = request.form.get('name') password = request.form.get('password') user = User.query.filter_by(email=email).first() # if this returns a user, then the email already exists in database if user: # if a user is found, we want to redirect back to signup page so user can try again return redirect(url_for('auth.signup')) # create a new user with the form data. Hash the password so the plaintext version isn't saved. new_user = User(email=email, name=name, password=generate_password_hash(password, method='sha256')) # add the new user to the database db.session.add(new_user) db.session.commit() return redirect(url_for('auth.login'))

Mã này sẽ kiểm tra xem liệu người dùng có cùng địa chỉ email tồn tại trong cơ sở dữ liệu hay không.

Bước 8 - Kiểm tra phương thức đăng ký

Bây giờ bạn đã hoàn tất phương thức đăng ký, bạn sẽ có thể tạo một người dùng mới. Hãy kiểm tra biểu mẫu để tạo người dùng.

Có hai cách bạn có thể xác minh nếu đăng ký thành công:

  • Bạn có thể sử dụng trình xem cơ sở dữ liệu để xem hàng đã được thêm vào bảng của bạn.
  • Hoặc bạn có thể thử đăng ký cùng một địa chỉ email một lần nữa và nếu bạn gặp lỗi, bạn biết email đầu tiên đã được lưu đúng cách.

Hãy thêm mã để cho người dùng biết email đã tồn tại và hướng dẫn chúng đến trang đăng nhập. Bằng cách gọi flash , bạn có thể gửi tin nhắn đến yêu cầu tiếp theo, trong trường hợp này, là chuyển hướng. Trang Người dùng được chuyển hướng đến sau đó sẽ có quyền truy cập vào thông báo đó trong mẫu.

Trước tiên, hãy thêm flash Trước khi bạn chuyển hướng đến trang đăng ký.

project/auth.py

Từ di động nhập kế hoạch chi tiết, render_template, chuyển hướng, url_for, yêu cầu , flash ... @ auth.route ('/ đăng ký', các phương thức = ['bài']) def đăng nhập_post (): ... Nếu người dùng: # Nếu người dùng tìm thấy, chúng tôi muốn chuyển hướng trở lại trang đăng ký để người dùng có thể thử lại Flash ('Địa chỉ email đã tồn tại') trả lại chuyển hướng (url_for ('auth.signup'))

Để có được tin nhắn nhấp nháy trong mẫu, bạn có thể thêm mã này trước biểu mẫu.

project/templates/signup.html

... {% with messages = get_flashed_messages() %} {% if messages %}

{{ messages[0] }}. Go to login page.
{% endif %} {% endwith %}

Mã này sẽ hiển thị thông báo "Địa chỉ email đã tồn tại. Chuyển đến trang đăng nhập." Nếu địa chỉ email đã có trong cơ sở dữ liệu . ."Email address already exists. Go to login page." if the email address is already in the database.

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Tại thời điểm này, bạn có thể chạy ứng dụng và cố gắng đăng ký với một địa chỉ email đã tồn tại.

Bước 9 - Thêm phương thức đăng nhập

Phương thức đăng nhập tương tự như chức năng đăng ký. Trong trường hợp này, bạn sẽ so sánh Email đã nhập để xem liệu nó có trong cơ sở dữ liệu hay không. Nếu vậy, bạn sẽ kiểm tra password the user provided by hashing the password the user passes in and comparing it to the hashed password in the database. You will know the user has entered the correct password when both hashed passwords match.

Khi người dùng đã vượt qua kiểm tra mật khẩu, bạn sẽ biết rằng họ có thông tin đăng nhập chính xác và bạn có thể đăng nhập vào việc sử dụng thông tin đăng nhập Flask. Bằng cách gọi login_user, Flask-Login will create a session for that user that will persist as the user stays logged in, which will allow the user to view protected pages.

Bạn có thể bắt đầu với một lộ trình mới để xử lý dữ liệu được gửi bằng bài đăng. Và chuyển hướng đến trang hồ sơ khi người dùng đăng nhập thành công:

project/auth.py

... @ auth.route ('/ đăng nhập') def login (): trả về render_template ('login.html') @ auth.route ('/ đăng nhập', phương thức = ['post']) def login_post (): # Mã đăng nhập sẽ đến đây Chuyển hướng lại (URL_FOR ('main.profile')))))

Bây giờ, bạn cần xác minh nếu người dùng có thông tin đăng nhập chính xác:

project/auth.py

... @ auth.route ('/ đăng nhập', các phương thức = ['post']) def login_post (): # Mã đăng nhập sẽ đến đây email = request.form.get('email') password = request.form.get('password') remember = True if request.form.get('remember') else False user = User.query.filter_by(email=email).first() # check if the user actually exists # take the user-supplied password, hash it, and compare it to the hashed password in the database if not user or not check_password_hash(user.password, password): flash('Please check your login details and try again.') return redirect(url_for('auth.login')) # if the user doesn't exist or password is wrong, reload the page # if the above check passes, then we know the user has the right credentials return redirect(url_for('main.profile'))

Hãy thêm vào khối trong mẫu để người dùng có thể thấy thông báo nhấp nháy:

project/templates/login.html

... {% with messages = get_flashed_messages() %} {% if messages %}

{{ messages[0] }}
{% endif %} {% endwith %}

Bây giờ bạn có khả năng nói rằng người dùng đã đăng nhập thành công, nhưng không có gì để đăng nhập người dùng vào.

Đăng nhập Flask có thể quản lý các phiên người dùng. Bắt đầu bằng cách thêm usermixixin vào mô hình người dùng của bạn. usermixixin sẽ thêm các thuộc tính đăng nhập flask vào mô hình để đăng nhập flask sẽ có thể làm việc với nó.

models.py

Từ flask_login nhập usermixixin từ . Nhập db. Người dùng lớp ( usermixixin, db.model): id = db.column (db.integer, chính_key = true) # Phím chính được yêu cầu bởi Sqlalchemy Email = db.column (db.String (100), Unique = true) Mật khẩu = db.column (db.String (100)) Tên = DB.Column (DB.String (1000))

Sau đó, bạn cần chỉ định Trình tải người dùng . Trình tải người dùng nói với Flask-Đăng nhập How để tìm một người dùng cụ thể từ ID được lưu trữ trong cookie phiên của họ. Thêm phần này vào create_app function along with init code for Flask-Login:

project/__init__.py

Từ bình nhập khẩu bình từ flask_sqlalchemy nhập khẩu sqlalchemy Từ flask_login nhập logmanager ... def created_app (): ... db.init_app (ứng dụng) login_manager = LoginManager() login_manager.login_view = 'auth.login' login_manager.init_app(app) from .models import User @login_manager.user_loader def load_user(user_id): # since the user_id is just the primary key of our user table, use it in the query for the user return User.query.get(int(user_id))

Cuối cùng, thêm login_user Chức năng trước khi chuyển hướng đến trang hồ sơ để tạo phiên:

project/auth.py

Từ flask_login nhập login_user từ .models nhập người dùng từ . Nhập db. ... @ auth.route ('/ đăng nhập', các phương thức = ['post']) def login_post (): ... # Nếu séc trên đi qua, thì chúng ta biết người dùng có thông tin đăng nhập đúng login_user (người dùng, hãy nhớ = nhớ) chuyển hướng trả lại (url_for ('main.profile'))

Với thiết lập đăng nhập Flask, hãy sử dụng / Đăng nhập Tuyến đường. Khi mọi thứ diễn ra, bạn sẽ thấy trang hồ sơ.

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Tại thời điểm này, bạn có thể chạy ứng dụng và cố gắng đăng nhập.

Bước 10 - Bảo vệ trang

Nếu tên của bạn không Anthony , sau đó bạn sẽ thấy tên của bạn là sai trên trang hồ sơ. Mục tiêu là cho hồ sơ để hiển thị tên trong cơ sở dữ liệu. Bạn sẽ cần phải bảo vệ trang và sau đó truy cập dữ liệu của người dùng để lấy tên .

Để bảo vệ một trang khi sử dụng đăng nhập flask, hãy thêm @login_requried trang trí giữa tuyến đường và chức năng. Điều này sẽ ngăn người dùng không đăng nhập khỏi xem tuyến đường. Nếu người dùng không đăng nhập, người dùng sẽ được chuyển hướng đến trang đăng nhập, theo cấu hình đăng nhập flask.

với các tuyến được trang trí với @login_required Trang trí, bạn có thể sử dụng current_user đối tượng bên trong hàm. current_user đại diện cho người dùng từ cơ sở dữ liệu và cung cấp quyền truy cập tất cả các thuộc tính của người dùng đó với Dot ký hiệu . Ví dụ: current_user.email , current_user.password và current_user.name , và current_user.id sẽ trả về các giá trị thực được lưu trữ trong Cơ sở dữ liệu cho người dùng đã đăng nhập. @login_required decorator, you can use the current_user object inside of the function. This current_user represents the user from the database and provides access all of the attributes of that user with dot notation. For example, current_user.email, current_user.password, and current_user.name, and current_user.id will return the actual values stored in the database for the logged-in user.

Hãy sử dụng tên của current_user và gửi nó vào mẫu: name of the current_user and send it to the template:

project/main.py

Từ Flask Nhập Blueprint, Render_Template Từ flask_login nhập login_required, current_user từ . Nhập db. ... @ main.route ('/ hồ sơ') @login_required Def Cấu hình (): return render_template ('profile.html' , name = current_user.name )

sau đó trong Profile.html Tệp, cập nhật trang để hiển thị Tên Giá trị: profile.html file, update the page to display the name value:

project/templates/profile.html

... {{name}} !

Khi người dùng truy cập trang hồ sơ, họ sẽ được chào đón bởi tên của họ .

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Bây giờ để cập nhật chế độ xem đăng xuất, hãy gọi logout_user Chức năng trong một tuyến để đăng xuất:

project/auth.py

Từ flask_login nhập login_user , login_required, logout_user ... @ auth.route ('/ logout') @login_required def logout (): logout_user () Trả lại Redirect (url_for ('main.index')))))))))))

Sử dụng @login_required Trang trí vì không có ý nghĩa để đăng xuất người dùng không đăng nhập để bắt đầu. .@login_required decorator because it does not make sense to log out a user that is not logged in to begin with.

Sau khi người dùng đăng xuất và cố gắng xem lại trang hồ sơ, chúng sẽ được trình bày với thông báo lỗi:

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Điều này là do Flask-Đăng nhập nhấp nháy một thông báo khi người dùng không được phép truy cập trang.

Một điều cuối cùng cần làm là đặt nếu trong các câu lệnh trong các mẫu để chỉ hiển thị các liên kết có liên quan đến người dùng:

templates/base.html

... {% nếu current_user.is_Authenticated%} {% endif%} {% nếu không current_user.is_Authenticated%} {% endif%} {% nếu current_user.is_Authenticated%} {% endif%}

Trước khi người dùng đăng nhập, họ sẽ có tùy chọn đăng nhập hoặc đăng ký. Sau khi họ đăng nhập, họ có thể đi đến hồ sơ của họ hoặc đăng xuất.

Cách thêm xác thực vào ứng dụng của bạn với đăng nhập Flask

Với điều đó, bạn đã xây dựng thành công ứng dụng của mình với xác thực.

Phần kết luận

Trong hướng dẫn này, bạn đã sử dụng Flask-Đăng nhập và Flask-Sqlalchemy để xây dựng một hệ thống đăng nhập cho một ứng dụng.Bạn đã bao gồm cách xác thực người dùng bằng cách đầu tiên tạo mô hình người dùng và lưu trữ thông tin người dùng.Sau đó, bạn phải xác minh mật khẩu của người dùng là chính xác bằng cách băm mật khẩu từ biểu mẫu và so sánh nó với tệp được lưu trữ trong cơ sở dữ liệu.Cuối cùng, bạn đã thêm Ủy quyền cho ứng dụng bằng cách sử dụng @login_required decorator on a profile page so only logged-in users can see that page.

Những gì bạn đã tạo trong hướng dẫn này sẽ đủ cho các ứng dụng nhỏ hơn, nhưng nếu bạn muốn có nhiều chức năng hơn từ đầu, bạn có thể muốn xem xét sử dụng các thư viện-Người dùng hoặc Thư viện bảo mật Flask, cả hai đều được xây dựng trên đầu trang củaThư viện đăng nhập Flask.