Python使用FastApi开发接口

python开发web框架简介

python在开发Web项目常用框架

  • Django:Django是最著名的Python web开发框架之一。它提供了丰富的功能,例如ORM、模板、表单等,并且有活跃的社区支持。
  • Flask:Flask是一个轻量级的框架,它的设计哲学是简单和可扩展。Flask依赖于扩展来提供数据库的支持,身份验证等功能。
  • Pyramid:Pyramid是一个Python语言的web应用程序开发框架,它的设计哲学是简单和可扩展。
  • Tornado:Tornado是一个Python web框架和异步网络库,特别适合I/O密集型的应用。
  • FastAPI:FastAPI是一个现代、高性能的Python web框架,使用ASGI和Pydantic。
  • Bottle:Bottle是一个简单高效的Python web框架,它的设计哲学是快速和简单。
  • web2py:web2py是一个全功能的开源Python框架,可以在Windows、Unix、Mac OS和Google App Engine等系统上运行。

FastApi安装

安装依赖包

pip install fastapi
pip install uvicorn
pip install sqlalchemy
pip install pymysql

代码编写

创建数据库连接模块 database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

#设置数据库的url
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:wangcheng@192.168.1.229:3306/test"

#创建数据库引擎
engine = create_engine(
      SQLALCHEMY_DATABASE_URL,
      echo=True, #打印sql语句
      # connect_args={"check_same_thread":False} #解决多线程问题 sqlite使用
      )

#创建回话
sessionLocal = sessionmaker(autocommit=False,autoflush=False,bind=engine,expire_on_commit=True)

#映射
Base = declarative_base()

创建数据库实体模块 model.py

from sqlalchemy import Column,Integer,String
from database import Base

#定义User类,继承自Base
class User(Base):
      #定义表名
      __tablename__ = "user"
      #定义id字段,主键,自增,索引,可以为空
      id = Column(Integer,primary_key=True,index=True,nullable=True,autoincrement=True)
      #定义name字段,不能为空,长度100
      name = Column(String(100),nullable=False,comment="姓名")
      #定义gender字段,长度为10
      gender = Column(String(10),comment="性别")

创建实体类模型模块 schemas.py

from pydantic import BaseModel
from typing import Union,Optional

#定义userbase类,继承自basemodal
class UserBase(BaseModel):
      #定义id属性,类型为int,默认值为1
      id : int = 1

      #定义Config属性,用于配置
      class Config:
            #设置orm_mode属性,值为True
            orm_mode = True

#创建用户类
class create_user(UserBase):
      #用户名
      name: str
      #性别
      gender: Optional[str] = None

      #定义一个config类
      class Config:
            #定义一个orm_mode属性为true
            orm_mode = True

class read_user(UserBase):
      #用户名
      name: str
      gender: Optional[str] = None

      class Config:
            orm_mode = True

创建操作数据库模块 curd.py

from sqlalchemy.orm import Session
import model,schemas

#查看用户信息
def get_user(db:Session,skip:int=0,limit:int=10):
      #返回skip和limit之间的用户信息
      return db.query(model.User).offset(skip).limit(limit).all()

#创建新用户
def create_user(db: Session,user:schemas.create_user):
      #创建一个User模型,并将加密后的密码赋值给password
      db_user = model.User(id = user.id,
                              name = user.name,
                              gender = user.gender)
      #将User模型添加到数据库
      db.add(db_user)
      #提交数据库操作
      db.commit()
      #刷新数据库
      db.refresh(db_user)
      #返回创建的用户
      return db_user

def get_user_by_account(db: Session,name):
      return db.query(model.User).filter(model.User.name == name).all()

创建接收请求模块 main.py

from fastapi import Depends,APIRouter,HTTPException
from sqlalchemy.orm import Session
import crud,model,schemas
from database import sessionLocal,engine

#创建数据库表
model.Base.metadata.create_all(bind=engine)
#创建所有模型
app_ms = APIRouter()

#定义一个函数get_db,用于获取数据库连接
def get_db():
      db = sessionLocal()
      try:
            yield db
      finally:
            db.close()

#获取user数据
@app_ms.get("/read/",response_model=list[schemas.read_user])
def read_data(skip: int = 0,limit: int = 10,db: Session = Depends(get_db)):
      #从数据库中获取用户数据
      users = crud.get_user(db, skip=skip,limit=limit)
      #返回用户数据
      return users

#录入user
@app_ms.post("/create/",response_model = schemas.read_user)
def create_data(user: schemas.create_user,db: Session = Depends(get_db)):
      #检查数据库中是否存在该用户账号
      db_user = crud.get_user_by_account(db,name = user.name)
      #如果存在,则抛出异常
      if db_user:
            raise HTTPException(status_code=400,detail="user already registered")
      #检查数据库中是否存在该用户手机号
      # db_user = crud.get_user_by_phone_number(db,phone_number = user.phone_number)
      #如果存在,则抛出异常
      # if db_user:
            # raise HTTPException(status_code=400,detail="phone number already used")
      #返回创建的用户
      return crud.create_user(db=db,user=user)

创建运行模块 run.py

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
from main import app_ms

#创建Fastapi应用
app = FastAPI()

#允许所有来源的跨域请求
app.add_middleware(
      CORSMiddleware,
      allow_origins = ["*"],
      allow_credentials = True,
      allow_methods = ["*"],
      allow_headers = ["*"]

)

#包含app_ms路由,前缀为/app_ms,标签为api_ms
app.include_router(app_ms,prefix="/api",tags=["api_ms"])

if __name__ == "__main__":
      #启动uvicorn服务,参数为run:app,主机地址为127.0.0.1,端口号为8000,自动重新加载,工作进程数为1
      uvicorn.run(app='run:app',host="127.0.0.1",port=8000,reload=True,workers=1)

项目运行

编写完以上代码,通过以下命令进行项目启动

python run.py
或
uvicorn run:app --reload

查看项目接口

127.0.0.1:8000/docs

pyinstalle打包FastApi项目

项目通过uvicorn运行

uvicorn main:app --reload

安装 pyinstaller

pip install pyinstaller

打包应用

pyinstaller --onefile --name myapp run.py

现存问题

现在项目可以打包成功,打包成功却没有办法进行访问,暂未明白是啥原因,有清楚辛苦帮忙解答一下哈,谢谢

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值