Hướng dẫn python api connector - trình kết nối api python

Từ khi biết tới OpenAPI (Swagger) là mình đã mê cách viết tài liệu API có khả năng tương tác. Cực kỳ rõ ràng, xúc tích, dễ hiểu, chỉ cần gởi đường link về tài liệu API là đối tác hay lập trình viên đều có thể tương tác với API, theo cách không thể tuyệt vời hơn. Và càng thích thú hơn nữa khi mình biết tới FastAPI, tạo API chuẩn, đầy đủ tính năng ngon và cực nhanh lại còn tạo ra tài liệu chuẩn OpenAPI. Bài viết này sẽ giới thiệu về FastAPI, framework tạo API trên Python thuộc nhóm nhanh nhất hiện nay.

Nội dung chính

  • Giới thiệu FastAPI
    • Các tính năng chính
  • Thực hành viết API
    • Môi trường và thư viện đi kèm
    • Viết code
  • Fullstack Station Tips
    • Comments

Giới thiệu FastAPI

Hướng dẫn python api connector - trình kết nối api python

Các tính năng chính

Thực hành viết API

Môi trường và thư viện đi kèm

Viết code

Các tính năng chính

  • Thực hành viết API
  • Môi trường và thư viện đi kèm
  • Viết code
  • Fullstack Station Tips
  • Comments
  • FastAPI là nền tảng thiết kế, lập trình xây dựng API cực kỳ nhanh trên cả 2 phương diện phát triển và thực thi trên Python 3.6+.
  • Trang chủ: FastAPI
  • Từ Python 3.6+ thì bạn đã có thể sử dụng cú pháp await/async để chạy code bất đồng bộ, vì lý do này các framework trên Python sẽ đạt được hiệu năng cao, FastAPI là một trong số Python framework nhanh nhất hiện nay.

Với một thời gian tìm hiểu kha khá, mình xác định dự án tới về API sẽ sử dụng FastAPI.

Nhanh: hiệu suất thực thi rất cao, có thể cạnh tranh được với Nodejs và Go

Thực hành viết API

Môi trường và thư viện đi kèm

Môi trường và thư viện đi kèm

Viết code.6-mvenv venv

Fullstack Station Tipsvenv/bin/activate

Commentsinstall sqlalchemy uvicorn fastapi

Viết code

Fullstack Station Tips

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Comments

FastAPI là nền tảng thiết kế, lập trình xây dựng API cực kỳ nhanh trên cả 2 phương diện phát triển và thực thi trên Python 3.6+.sqlalchemy import Boolean,Column,Integer,String,create_engine

Trang chủ: FastAPIsqlalchemy.ext.declarative import declarative_base

SQLALCHEMY_DATABASE_URI="sqlite:///./test.db" ="sqlite:///./test.db"

Từ Python 3.6+ thì bạn đã có thể sử dụng cú pháp await/async để chạy code bất đồng bộ, vì lý do này các framework trên Python sẽ đạt được hiệu năng cao, FastAPI là một trong số Python framework nhanh nhất hiện nay.

engine=create_engine(=create_engine(

    SQLALCHEMY_DATABASE_URI,connect_args={"check_same_thread":False},echo=TrueSQLALCHEMY_DATABASE_URI,connect_args={"check_same_thread":False}, echo=True

Với một thời gian tìm hiểu kha khá, mình xác định dự án tới về API sẽ sử dụng FastAPI.

Base=declarative_base()=declarative_base()

Nhanh: hiệu suất thực thi rất cao, có thể cạnh tranh được với Nodejs và Go

classTodo(Base):Todo(Base):

    __tablename__='todos'__tablename__='todos'

    id=Column('id',Integer,primary_key=True)id =Column('id',Integer,primary_key=True)

    title=Column('title',String(200))title=Column('title',String(200))

    done=Column('done',Boolean,default=False)done =Column('done',Boolean,default=False)

Phát triển nhanh: nâng cao tốc độ lập trình từ 200% đến 300%

Base.metadata.create_all(bind=engine).metadata.create_all(bind=engine)

Ít lỗi: giảm 40% lỗi do tích hợp ràng buộc dữ liệu khá tốt

Trực quan: hỗ trợ bộ soạn thảo tốt với Completion bao phủ.

Hướng dẫn python api connector - trình kết nối api python

Dễ dàng: được thiết kế để dễ dàng học và sử dụng

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

Ngắn gọn: tối giản hoá sự trùng lặp code.

Vững chãi: code đạt mức production, với khả năng tương tác API trên tài liệufastapi import Depends,FastAPI

Quy chuẩn: thiết kế hoàn toàn dựa trên OpenAPI và JSON schemafastapi import FastAPI,Path,Body,Depends

Trên đây là các yếu tố được quảng cáo bởi chính FastAPI, tuy nhiên mình cũng xác nhận rằng 60~70% là có thể tin được. Còn tốc độ lập trình và ít lỗi thì còn phụ thuộc vào khả năng code nữa.sqlalchemy.orm import Session,sessionmaker

Điểm hay nữa của FastAPI chính là tài liệu đầy đủ và ví dụ rõ ràng, dễ hiểu phủ toàn bộ về cách xử lý các thành phần trong request, cho đến xử lý form, tập tin, và bảo mật.starlette.requests import Request

Chúng ta sẽ thử viết api đơn giản thao tác với db sqlite.db import Todo,engine

python3.6-mvenv venv

SessionLocal=sessionmaker(autocommit=False,autoflush=False,bind=engine)= sessionmaker(autocommit=False,autoflush=False,bind=engine)

source venv/bin/activate

classTodoIn(BaseModel):TodoIn(BaseModel):

    title:strtitle: str

    done:booldone:bool

pip install sqlalchemy uvicorn fastapi

File db.py: mục đích là để tạo ra db SQLiteget_todo(db_session:Session,todo_id:int):

    returndb_session.query(Todo).filter(Todo.id==todo_id).first()return db_session.query(Todo).filter(Todo.id==todo_id).first()

# db.py

from sqlalchemy import Boolean,Column,Integer,String,create_engineget_db(request:Request):

    returnrequest.state.dbreturnrequest.state.db

from sqlalchemy.ext.declarative import declarative_base

@app.get("/todos/")app.get("/todos/")

# SQLALCHEMY_DATABASE_URI = "postgresql://user:password@postgresserver/db"read_todos(db:Session=Depends(get_db)):

    todos=db.query(Todo).all()todos=db.query(Todo).all()

    returntodosreturn todos

)

@app.get("/todos/{todo_id}")app.get("/todos/{todo_id}")

# Định nghĩa table Todoread_todo(todo_id:int,db:Session= Depends(get_db)):

    todo=get_todo(db,todo_id)todo=get_todo(db,todo_id)

    returntodoreturntodo

# Tạo table Todo

@app.post("/todos/")app.post("/todos/")

Chạy python db.py, nếu không có lỗi gì hết thì file “test.db” sẽ được tạo ra.def create_todo(todo_in:TodoIn,db:Session=Depends(get_db)):

    todo=Todo(title=todo_in.title,done=False)todo= Todo(title=todo_in.title,done=False)

    db.add(todo)db.add(todo)

    db.commit()db.commit()

    todo=get_todo(db,todo.id)todo =get_todo(db,todo.id)

    returntodoreturntodo

# Update a Todo

@app.put("/todos/{todo_id}")app.put("/todos/{todo_id}")

async def update_todo(todo_id:int,todo_in:TodoIn,db:Session=Depends(get_db)):def update_todo(todo_id:int,todo_in:TodoIn,db:Session=Depends(get_db)):

    todo=get_todo(db,todo_id)todo= get_todo(db,todo_id)

    todo.title=todo_in.titletodo.title=todo_in.title

    todo.done=todo_in.donetodo.done=todo_in.done

    db.commit()db.commit()

    todo=get_todo(db,todo_id)todo=get_todo(db,todo_id)

    returntodoreturntodo

# Delete a Todo

@app.delete("/todos/{todo_id}")app.delete("/todos/{todo_id}")

async def delete_todo(todo_id:int,db:Session=Depends(get_db)):def delete_todo(todo_id:int,db:Session=Depends(get_db)):

    todo=get_todo(db,todo_id)todo=get_todo(db, todo_id)

    db.delete(todo)db.delete(todo)

    db.commit()db.commit()

# Create a session instance for middleware DB connection which will be called for each request

@app.middleware("http")app.middleware("http")

async def db_session_middleware(request:Request,call_next):def db_session_middleware(request:Request,call_next):

    request.state.db=SessionLocal()request.state.db=SessionLocal()

    response=await call_next(request)response =await call_next(request)

    request.state.db.close()request.state.db.close()

    returnresponsereturnresponse

Chạy ứng dụng với lệnh uvicorn main:app --reload, sau đó bạn có thể sử dụng API ở http://127.0.0.1:8000/todos.

Điểm đặc biệt như đã nói ở trên, là bạn có thể xem và thao tác với API thông qua trang tài liệu của chính ứng dụng ở http://127.0.0.1:8000/docs, hoặc http://127.0.0.1:8000/redoc.

Hướng dẫn python api connector - trình kết nối api python

Fullstack Station Tips

Vài điểm cần lưu ý:

  • Về Graphql: Graphql được dựa chính trên Starlette và Graphene, vì vậy nếu dự án thiên về Graphql thì FastAPI không mang lại nhiều ý nghĩa. Nếu dùng graphql trên python, bạn có thể sử dụng Graphene và kết hợp với bất kỳ nền tảng nào cũng được như Flask, Django.
  • Như đã từng giới thiệu về Graphql (xem Graphql là gì), thì API Restful thực sự có nhiều điểm bất lợi hơn, bạn hãy cân nhắc kỹ ứng dụng của mình nên sử dụng Restful hay Graphql
  • Để kích hoạt hiệu suất cao nhất, bạn cần sử dụng driver async tương ứng với DB sử dụng. Ví dụ với MongoDB thì nên dùng https://github.com/mongodb/motor.

Tham khảo:

https://www.toptal.com/python/build-high-performing-apps-with-the-python-fastapi-framework

Comments

Nguyễn Nhân

Xin chào, mình là kỹ sư công nghệ thông tin đang làm việc tại Tokyo, Nhật Bản. Đam mê lập trình web và mobile, mình mong muốn hoàn thiện bản thân để trở thành lập trình viên fullstack thực thụ. Mình yêu thích tối ưu tốc độ ứng dụng cũng như cải thiện quy trình làm việc để phát triển sản phẩm chất lượng và nhanh chóng. Sự động viên của bạn bằng các hình thức "like", "share", "comment" sẽ giúp cho mình có động lực để viết nhiều bài tốt hơn!