Giới thiệu
Cho phép người dùng đăng nhập vào ứng dụng của bạn là một trong những tính năng phổ biến nhất mà bạn sẽ thêm vào các ứng dụng web của mình. Bạn có thể thêm xác thực vào ứng dụng bình của mình với gói Flask-Login.
Trong hướng dẫn này, bạn sẽ:
- Sử dụng thư viện Flask-Login để quản lý phiên
- Sử dụng tiện ích bình tích hợp cho mật khẩu băm
- Thêm các trang được bảo vệ vào ứng dụng chỉ đăng nhập vào người dùng
- Sử dụng Flask-Sqlalchemy để tạo mô hình
- source auth/bin/activate
- Tạo các biểu mẫu đăng ký và đăng nhập cho người dùng để tạo tài khoản và đăng nhập
- Flash thông báo lỗi lại cho người dùng khi có sự cố xảy ra
- Sử dụng thông tin từ tài khoản người dùng để hiển thị trên trang hồ sơ
Bạn sẽ xây dựng một trang đă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ừ mô hình
- source auth/bin/activate
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 nâng cao của các phiên. Hơn nữa, việc 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. This tutorial is limited in scope and does not cover advanced persisting of sessions. Furthermore, modifying the data type for the primary key or considerations for migrating to different database systems are also outside of the scope of this introductory tutorial.
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ững điều sau đây:
- 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.
Dưới đây là một 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 └── project ├── __init__.py # setup the app ├── auth.py # the auth routes for the app ├── db.sqlite # the database ├── main.py # the non-auth routes for the app ├── models.py # the user model └── templates ├── base.html # contains common layout and links ├── index.html # show the home page ├── login.html # show the login form ├── profile.html # show the profile page └── signup.html # show the signup formKhi 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
- source auth/bin/activate
- source auth/bin/activate
- source auth/bin/activate
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
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
- Flask-Login: Để xử lý các phiên người dùng sau khi xác thực
- Flask-Sqlalchemy: Để biểu diễn 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 bổ sung 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 ra một môi trường Python nếu bạn không có.
Tùy thuộc vào cách mà 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
Cờ
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
- pip install flask flask-sqlalchemy flask-login
Tiếp theo, chạy lệnh sau:
- source auth/bin/activate
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 install flask flask-sqlalchemy flask-login
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 thư mục
- mkdir project
- mkdir project
Tệp đầu tiên sẽ là tệp
- mkdir project
- nano project/__init__.py
Ứng dụng này sẽ sử dụng mẫu nhà máy ứng dụng Flask với 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 sự, bạn có thể phá vỡ chức năng theo bất kỳ cách nào bạn muốn, nhưng giải pháp được đề cập ở đâ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ý bản thiết kế. Hiện tại, điều này sẽ không làm được 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ý bản thiết kế ở đây:
project/__init__.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy # init SQLAlchemy so we can use it later in our models db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key-goes-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' db.init_app(app) # blueprint for auth routes in our app from .auth import auth as auth_blueprint app.register_blueprint(auth_blueprint) # blueprint for non-auth parts of app from .main import main as main_blueprint app.register_blueprint(main_blueprint) return appBây giờ bạn có tệp ứng dụng chính, 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ế.
Đối với
- mkdir project
- mkdir project
- mkdir project
Đầu tiên, tạo
- mkdir project
- nano project/main.py
Sau đó, thêm
- mkdir project
project/main.py
- mkdir flask_auth_app
Đối với
- mkdir project
- mkdir project
- mkdir project
- nano project/__init__.py
Tiếp theo, tạo
- nano project/__init__.py
- mkdir flask_auth_app
Sau đó, thêm
- mkdir project
project/auth.py
- mkdir flask_auth_app
Trong thời gian này, xác định
- nano project/__init__.py
- nano project/__init__.py
- nano project/__init__.py
- nano project/__init__.py
- nano project/__init__.py
Trong một thiết bị đầu cuối, bạn có thể đặt các giá trị
- nano project/__init__.py
- nano project/__init__.py
- mkdir flask_auth_app
Biến môi trường
- nano project/__init__.py
- mkdir project
Biến môi trường
- nano project/__init__.py
Đảm bảo rằng bạn đang ở trong thư mục from flask import Flask from flask_sqlalchemy import SQLAlchemy # init SQLAlchemy so we can use it later in our models db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key-goes-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' db.init_app(app) # blueprint for auth routes in our app from .auth import auth as auth_blueprint app.register_blueprint(auth_blueprint) # blueprint for non-auth parts of app from .main import main as main_blueprint app.register_blueprint(main_blueprint) return app 5 và sau đó chạy dự án:
- mkdir flask_auth_app
Bây giờ, trong một 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
- nano project/__init__.py
- mkdir project
Ví dụ: truy cập hiển thị from flask import Flask from flask_sqlalchemy import SQLAlchemy # init SQLAlchemy so we can use it later in our models db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key-goes-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' db.init_app(app) # blueprint for auth routes in our app from .auth import auth as auth_blueprint app.register_blueprint(auth_blueprint) # blueprint for non-auth parts of app from .main import main as main_blueprint app.register_blueprint(main_blueprint) return app 8: from flask import Flask from flask_sqlalchemy import SQLAlchemy # init SQLAlchemy so we can use it later in our models db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key-goes-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' db.init_app(app) # blueprint for auth routes in our app from .auth import auth as auth_blueprint app.register_blueprint(auth_blueprint) # blueprint for non-auth parts of app from .main import main as main_blueprint app.register_blueprint(main_blueprint) return app 9:
Khi bạn đã xác minh rằng các tuyến đường đang hoạt động 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 từng 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, hãy tạo thư mục
- nano project/main.py
- mkdir project
- mkdir flask_auth_app
Sau đó, tạo
- nano project/main.py
- mkdir flask_auth_app
Tiếp theo, thêm mã sau vào tệp
- nano project/main.py
project/templates/base.html
- mkdir flask_auth_app
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
- nano project/main.py
Tiếp theo, tạo
- nano project/main.py
- mkdir flask_auth_app
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
- mkdir flask_auth_app
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
- nano project/main.py
- cd flask_auth_app
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 để ghi 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
- cd flask_auth_app
Tiếp theo, tạo
- nano project/main.py
- cd flask_auth_app
Thêm mã sau để tạo trang đăng ký với các trường cho
- nano project/main.py
- nano project/main.py
- mkdir flask_auth_app
project/templates/signup.html
- cd flask_auth_app
Tiếp theo, tạo
- mkdir flask_auth_app
- cd flask_auth_app
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:Anthony:
project/templates/profile.html
- cd flask_auth_app
Bạn sẽ xem lại mã này sau này để tự động chào 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 đường để trả về các mẫu thay vì văn bản.
Tiếp theo, cập nhật
- mkdir project
- mkdir flask_auth_app
- mkdir flask_auth_app
project/main.py
- cd flask_auth_app
Bây giờ bạn sẽ cập nhật
- nano project/__init__.py
- nano project/__init__.py
- nano project/__init__.py
project/auth.py
- cd flask_auth_app
Khi bạn đã thực hiện những thay đổi này, đây là trang đăng ký trông như thế nào nếu bạn điều hướng đến
- mkdir project
Bạn có thể điều hướng đến các trang cho
- mkdir project
- mkdir project
- mkdir project
Để
- nano project/__init__.py
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 địa chỉ
- nano project/main.py
- mkdir flask_auth_app
- nano project/main.py
Các mô hình được tạo trong Flask-Sqlalchemy được thể hiện bằng 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 mô hình
- source auth/bin/activate
- cd flask_auth_app
Xác định mô hình
- source auth/bin/activate
project/models.py
- cd flask_auth_app
Mã này xác định
- source auth/bin/activate
- mkdir flask_auth_app
- nano project/main.py
- mkdir flask_auth_app
- nano project/main.py
Bây giờ bạn đã tạo ra một mô hình
- source auth/bin/activate
Bước 6 - Định cấu hình cơ sở dữ liệu
Bạn sẽ sử dụng cơ sở dữ liệu SQLite. Bạn có thể tự mình tạo cơ sở dữ liệu SQLite, nhưng hãy để Lôi 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 tệp
- mkdir project
Đảm bảo rằng bạn vẫn còn trong môi trường ảo và trong thư mục from flask import Flask from flask_sqlalchemy import SQLAlchemy # init SQLAlchemy so we can use it later in our models db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key-goes-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' db.init_app(app) # blueprint for auth routes in our app from .auth import auth as auth_blueprint app.register_blueprint(auth_blueprint) # blueprint for non-auth parts of app from .main import main as main_blueprint app.register_blueprint(main_blueprint) return app 5.
Nếu bạn dừng ứng dụng của mình và mở một Python, bạn có thể tạo cơ sở dữ liệu bằng phương thức
- mkdir flask_auth_app
- mkdir flask_auth_app
- python3 -m venv auth
Lưu ý: Nếu sử dụng thông dịch viên Python là mới đối với bạn, bạn có thể tham khảo tài liệu chính thức. If using the Python interpreter is new to you, you can consult the official documentation.
Bây giờ bạn sẽ thấy một tệp
- mkdir flask_auth_app
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 trữ mật khẩu trong Plaintext được coi là một thực hành bảo mật kém. Nói chung, bạn 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. Storing passwords in plaintext is considered a poor security practice. You will generally want a complex hashing algorithm and salt to keep passwords secure.
Hãy bắt đầu bằng cách thêm chức năng thứ hai để xử lý dữ liệu mẫu bài. Thu thập dữ liệu được truyền từ người dùng.
Cập nhật
- nano project/__init__.py
- mkdir flask_auth_app
project/auth.py
- python3 -m venv auth
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 để lấy dữ liệu biểu mẫu.
Tiếp tục cập nhật
- nano project/__init__.py
- mkdir flask_auth_app
auth.py
- python3 -m venv auth
Mã này sẽ kiểm tra xem người dùng có cùng địa chỉ email có tồn tại trong cơ sở dữ liệu không.
Bước 8 - Kiểm tra phương pháp đăng ký
Bây giờ bạn đã hoàn thành phương thức đăng ký, bạn sẽ có thể tạo một người dùng mới. Hãy để thử nghiệm 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ý với cùng một địa chỉ email một lần nữa và nếu bạn gặp lỗi, bạn sẽ biết email đầu tiên được lưu đúng.
Hãy để thêm mã để cho người dùng biết email đã tồn tại và hướng chúng vào trang đăng nhập. Bằng cách gọi hàm
- mkdir flask_auth_app
Đầu tiên, thêm
- mkdir flask_auth_app
project/auth.py
- python3 -m venv auth
Để có được thông báo flash trong mẫu, bạn có thể thêm mã này trước biểu mẫu.
project/templates/signup.html
- python3 -m venv auth
Mã này sẽ hiển thị thông báo
- mkdir flask_auth_app
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ư hàm đăng ký. Trong trường hợp này, bạn sẽ so sánh địa chỉ
- nano project/main.py
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
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 chúng bằng cách sử dụng Flask-Login. Bằng cách gọi
- mkdir flask_auth_app
Bạn có thể bắt đầu với một tuyến đường mới để xử lý dữ liệu được gửi với POST. Và chuyển hướng đến trang hồ sơ khi người dùng đăng nhập thành công:
project/auth.py
- python3 -m venv auth
Bây giờ, bạn cần xác minh xem người dùng có thông tin đăng nhập chính xác không:
project/auth.py
- python3 -m venv auth
Hãy để thêm vào khối trong mẫu để người dùng có thể thấy thông báo flash:
project/templates/login.html
- python3 -m venv auth
Bây giờ bạn có khả năng nói người dùng đã đăng nhập thành công, nhưng không có gì để đăng nhập người dùng.
Flask-Login có thể quản lý các phiên người dùng. Bắt đầu bằng cách thêm
- mkdir flask_auth_app
- mkdir flask_auth_app
models.py
- python3 -m venv auth
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-Login cách 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 điều này trong hàm from flask import Flask from flask_sqlalchemy import SQLAlchemy # init SQLAlchemy so we can use it later in our models db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SECRET_KEY'] = 'secret-key-goes-here' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite' db.init_app(app) # blueprint for auth routes in our app from .auth import auth as auth_blueprint app.register_blueprint(auth_blueprint) # blueprint for non-auth parts of app from .main import main as main_blueprint app.register_blueprint(main_blueprint) return app 1 cùng với mã
- mkdir flask_auth_app
project/__init__.py
- python3 -m venv auth
Cuối cùng, thêm chức năng
- mkdir flask_auth_app
project/auth.py
- source auth/bin/activate
Với thiết lập Flask-Login, hãy sử dụng tuyến
- mkdir project
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ệ các trang
Nếu tên của bạn không phải là Anthony, thì bạn sẽ thấy tên của bạn là sai trên trang hồ sơ. Mục tiêu là để hồ sơ hiển thị tên trong cơ sở dữ liệu. Bạn sẽ cần bảo vệ trang và sau đó truy cập dữ liệu của người dùng để nhận
- nano project/main.py
- nano project/main.py
Để bảo vệ một trang khi sử dụng Flask-Login, hãy thêm trình trang trí
- mkdir flask_auth_app
Với các tuyến đường được trang trí với bộ trang trí
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
- mkdir flask_auth_app
Hãy để sử dụng
- nano project/main.py
- mkdir flask_auth_app
project/main.py
- source auth/bin/activate
Sau đó, trong tệp
- mkdir flask_auth_app
- nano project/main.py
project/templates/profile.html
- source auth/bin/activate
Khi người dùng truy cập trang hồ sơ, họ sẽ được chào đón bởi
- nano project/main.py
Bây giờ để cập nhật chế độ xem đăng nhập, hãy gọi chức năng
- mkdir flask_auth_app
project/auth.py
- source auth/bin/activate
Sử dụng trình trang trí
- mkdir flask_auth_app
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:
Điều này là do Flask-Login flash một thông báo khi người dùng không được phép truy cập một trang.
Một điều cuối cùng cần làm là đặt các câu lệnh
- mkdir flask_auth_app
templates/base.html
- source auth/bin/activate
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ể vào hồ sơ của họ hoặc đăng xuất.
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.
Sự kết luận
Trong hướng dẫn này, bạn đã sử dụng Flask-Login và Flask-Sqlalchemy để xây dựng một hệ thống đăng nhập cho một ứng dụng. Bạn đã đề cập đến 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 mã được lưu 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 trình trang trí
- mkdir flask_auth_app
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 ngay từ đầu, bạn có thể muốn xem xét sử dụng thư viện người dùng Flask-user hoặc flask, cả hai đều được xây dựng trên đầu Thư viện Flask-Login.