Python là một trong những ngôn ngữ lập trình dễ đọc và dễ viết nhất mọi thời đại. Trong những năm qua, mức độ phổ biến của Python chỉ ngày càng tăng và nó được sử dụng rộng rãi trong phát triển ứng dụng web, viết kịch bản, tạo trò chơi, tính toán khoa học, v.v.
Flask là một khung ứng dụng web Python đang trở nên phổ biến do dễ sử dụng cho người mới bắt đầu sử dụng Python. Trong hướng dẫn này, chúng ta sẽ xem xét EVE, một khung xây dựng API REST dựa trên Flask, MongoDB và Redis. Từ các tài liệu chính thức:
Được cung cấp bởi Flask, MongoDB, Redis và những mục đích tốt đẹp Eve cho phép dễ dàng xây dựng và triển khai Dịch vụ Web RESTful đầy đủ tính năng, có thể tùy chỉnh cao.
Những gì chúng tôi sẽ tạo ra
Trong hướng dẫn này, chúng ta sẽ xem cách xây dựng các API REST bằng cách sử dụng khung EVE. Tiếp theo, sử dụng AngularJS, chúng tôi sẽ thiết kế giao diện người dùng cho một ứng dụng đơn giản và làm cho nó hoạt động bằng cách sử dụng các API REST được xây dựng bằng EVE. Trong hướng dẫn này, chúng tôi sẽ triển khai chức năng sau:
- Tạo API người dùng
- Xác thực API người dùng
- Thêm API các mục
- API Xóa các mục
- Cập nhật API mặt hàng
Bắt đầu
Cài đặt
Chúng tôi sẽ sử dụng pip để cài đặt EVE.
pip install eve
Chúng tôi sẽ sử dụng MongoDB
dưới dạng cơ sở dữ liệu. Hãy xem các tài liệu chính thức để cài đặt theo hệ thống của bạn.
Tạo API cơ bản
Tạo một thư mục dự án có tên là PythonAPI
. Điều hướng đến PythonAPI
và tạo một tệp có tên api.py
. Bên trong api.py
nhập EVE
và tạo một đối tượng EVE.
from eve import Eve app = Eve()
Tiếp theo, chạy ứng dụng app
khi chương trình được thực thi như một chương trình chính.
from eve import Eve app = Eve() if __name__ == '__main__': app.run()
Chạy MongoDB
của bạn sử dụng lệnh sau:
mongod --dbpath= <PATH-TO> /data/db/
Như bạn có thể thấy, chúng ta cần chỉ định một đường dẫn cho các tệp db. Chỉ cần tạo data/db
trong hệ thống tệp của bạn và chạy lệnh trên.
Cùng với một bản sao của MongoDB
đang chạy, EVE yêu cầu tệp cấu hình có thông tin về tài nguyên API. Vì vậy, trong PythonAPI
thư mục tạo một tệp khác có tên là settings.py
và thêm mã sau:
DOMAIN = {'user': {}}
Đoạn mã trên thông báo cho EVE rằng một tài nguyên cho người dùng app
có sẵn.
Lưu tất cả các tệp và chạy api.py
:
python api.py
API phải trực tuyến như được hiển thị:
Chúng tôi sẽ sử dụng Ứng dụng khách Postman REST để gửi yêu cầu đến các API. Nó miễn phí và có thể được cài đặt bằng một cú nhấp chuột đơn giản. Sau khi cài đặt xong, hãy khởi chạy ứng dụng và nhập URL API (http://127.0.0.1:5000/) và nhấp vào gửi. Bạn sẽ có phản hồi như được hiển thị:
Vì chúng tôi chưa gọi bất kỳ tài nguyên API cụ thể nào nên nó sẽ hiển thị tất cả các tài nguyên có sẵn. Bây giờ, hãy thử gọi cho người dùng app
tài nguyên và bạn phải có phản hồi cụ thể cho người dùng app
.
Tạo và xác thực API người dùng
Tạo API người dùng
Chúng tôi sẽ bắt đầu bằng cách xây dựng một API để tạo hoặc đăng ký người dùng cho ứng dụng của chúng tôi. Người dùng sẽ có một số trường nhất định như First Name
, Last Name
, Username
, Password
và Phone Number
.
Vì vậy, trước tiên chúng ta cần xác định một lược đồ cho một người dùng. Lược đồ xác định các trường và kiểu dữ liệu của các trường khóa. Mở settings.py
và sửa đổi DOMAIN
bằng cách xác định một lược đồ như được hiển thị:
DOMAIN = { 'user': { 'schema': { 'firstname': { 'type': 'string' }, 'lastname': { 'type': 'string' }, 'username': { 'type': 'string', 'unique': True }, 'password': { 'type': 'string' }, 'phone': { 'type': 'string' } } } }
Như bạn có thể thấy trong đoạn mã trên, chúng tôi đã xác định các trường chính cần thiết để tạo người dùng và kiểu dữ liệu của nó được xác định trong lược đồ. Lưu các thay đổi và thực thi api.py
. Từ Khách hàng Postman, hãy thử thực hiện một yêu cầu ĐĂNG cùng với các thông số bắt buộc tới http://127.0.0.1/user như hình:
Theo yêu cầu POST cho người dùng, nó đã đưa ra một 405 Method Not Allowed
lỗi. Theo mặc định, EVE chỉ chấp nhận các yêu cầu GET. Nếu chúng ta muốn sử dụng bất kỳ phương thức nào khác, chúng ta cần xác định nó một cách rõ ràng. Mở settings.py
và xác định các phương thức tài nguyên như được hiển thị:
RESOURCE_METHODS = ['GET', 'POST']
Lưu các thay đổi và thực thi api.py
. Bây giờ, hãy thử lại để POST
cho người dùng và bạn sẽ có phản hồi dưới đây:
Như bạn có thể thấy, yêu cầu POST ở trên đã thành công. Chúng tôi chưa xác định cấu hình cơ sở dữ liệu trong settings.py
của chúng tôi , vì vậy EVE đã hoàn thành yêu cầu bằng cách sử dụng phiên bản đang chạy của MongoDB
. Hãy đăng nhập vào MongoDB
shell và xem bản ghi mới được tạo. Với phiên bản MongoDB đang chạy, hãy kích hoạt trình bao mongo:
mongo
Khi vào bên trong mongo
shell, liệt kê tất cả các cơ sở dữ liệu có sẵn.
show databases;
Phải có eve
cơ sở dữ liệu. Chuyển sang eve
cơ sở dữ liệu.
use eve;
Thực thi show
lệnh liệt kê các bảng bên trong eve
cơ sở dữ liệu.
show tables;
Các bảng được liệt kê phải có một bảng được gọi là user
. Liệt kê các bản ghi từ user
bảng bằng cách sử dụng lệnh sau:
db.user.find()
Dưới đây là các bản ghi đã chọn từ các bảng người dùng:
Xác thực API người dùng
Tiếp theo, chúng tôi sẽ tạo một API để xác thực người dùng hiện có. Thông thường, nếu chúng ta thực hiện get
yêu cầu điểm cuối người dùng (http://127.0.0.1:5000/user), nó sẽ cung cấp thông tin chi tiết về tất cả người dùng đã đăng ký từ cơ sở dữ liệu. Chúng ta cần thực hiện hai điều ở đây. Đầu tiên, chúng ta cần xác thực người dùng bằng tên và mật khẩu, thứ hai, chúng ta cần trả lại chi tiết người dùng từ cơ sở dữ liệu khi xác thực thành công.
Để có được chi tiết dựa trên tên, chúng tôi cần thêm trường tra cứu bổ sung trong DOMAIN
trong settings.py
.
'additional_lookup': { 'url': 'regex("[\w]+")', 'field': 'username', }
Như đã thấy trong đoạn mã trên, chúng tôi đã thêm trường tra cứu cho username
. Bây giờ khi một yêu cầu GET được gửi đến http://127.0.0.1:5000/user/
<username>
nó sẽ trả về thông tin chi tiết của người dùng với username
cụ thể . Khi đưa ra yêu cầu cho một người dùng cụ thể, chúng tôi cũng sẽ gửi username
và password
để xác thực.
Chúng tôi sẽ thực hiện xác thực cơ bản để xác minh một người dùng cụ thể dựa trên tên người dùng và mật khẩu. Đầu tiên, chúng ta cần nhập Basic Auth
lớp từ EVE. Tạo một lớp có tên là Authenticate
để triển khai xác thực như được hiển thị:
from eve.auth import BasicAuth class Authenticate(BasicAuth): def check_auth(self, username, password, allowed_roles, resource, method):
Bây giờ, khi tài nguyên là user
và phương thức yêu cầu là GET
, chúng tôi sẽ xác thực người dùng. Khi xác thực thành công, thông tin chi tiết về người dùng của người dùng có tên trong điểm cuối API sẽ được trả về. Chúng tôi cũng sẽ hạn chế việc tạo người dùng bằng cách cung cấp tên người dùng và mật khẩu. Vì vậy, nếu phương thức là POST và điểm cuối API là người dùng, chúng tôi sẽ kiểm tra và xác thực tên người dùng và mật khẩu. Vì vậy, đây là Authenticate
hoàn chỉnh lớp:
class Authenticate(BasicAuth): def check_auth(self, username, password, allowed_roles, resource, method): if resource == 'user' and method == 'GET': user = app.data.driver.db['user'] user = user.find_one({'username': username,'password':password}) if user: return True else: return False elif resource == 'user' and method == 'POST': return username == 'admin' and password == 'admin' else: return True
Chúng tôi cần chuyển Authenticate
tên lớp trong khi khởi tạo API. Vì vậy, hãy sửa đổi mã khởi tạo API như được hiển thị:
if __name__ == '__main__': app = Eve(auth=Authenticate) app.run()
Lưu tất cả các thay đổi và thực thi api.py
. Cố gắng gửi một yêu cầu xác thực cơ bản với tên người dùng và mật khẩu từ Postman đến http://127.0.0.1/user/username (thay thế tên người dùng bằng bất kỳ tên người dùng hiện có nào khác). Khi xác thực thành công, bạn sẽ nhận được thông tin chi tiết về người dùng trong phản hồi như được hiển thị:
Thêm, xóa và cập nhật các mục
Thêm API mặt hàng
Để tạo API Thêm mặt hàng, tất cả những gì chúng ta cần làm là tạo một lược đồ mới cho mặt hàng trong settings.py
.
'item': { 'schema': { 'name':{ 'type': 'string' }, 'username': { 'type': 'string' } } }
API Thêm mặt hàng sẽ giúp mỗi người dùng đã đăng nhập thêm một mặt hàng. Chúng tôi sẽ lưu mục cùng với tên người dùng của người dùng đã nhập mục. Lưu các thay đổi và cố gắng thực hiện yêu cầu ĐĂNG lên http://127.0.0.1/item như được hiển thị:
Xóa API mặt hàng
Để xóa một mục do người dùng tạo, tất cả những gì chúng ta cần làm là gọi điểm cuối của mục /item_id
. Nhưng chỉ cần gọi một yêu cầu XÓA sẽ không xóa mục. Để xóa một mục, chúng tôi cũng cần cung cấp _etag
liên quan đến một mặt hàng cụ thể. Một lần item id
và _etag
khớp, mục sẽ bị xóa khỏi cơ sở dữ liệu. Đây là cách phương thức DELETE được gọi trong điểm cuối của mục.
Cập nhật API mặt hàng
API cập nhật tương tự như API xóa. Tất cả những gì chúng ta phải làm là gửi một yêu cầu PATCH với item id
và _etag
và các trường biểu mẫu cần được cập nhật. Đây là cách cập nhật chi tiết mặt hàng: