ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python使用FastApi项目开发-项目搭建及打包简介

Python使用FastApi项目开发-项目搭建及打包简介

文章目录

  • python开发web框架简介
  • FastApi安装
    • 安装依赖包
  • 代码编写
    • 创建数据库连接模块 database.py
    • 创建数据库实体模块 model.py
    • 创建实体类模型模块 schemas.py
    • 创建操作数据库模块 curd.py
    • 创建接收请求模块 main.py
    • 创建运行模块 run.py
    • 项目运行
      • 编写完以上代码,通过以下命令进行项目启动
      • 查看项目接口
  • pyinstalle打包FastApi项目
    • 项目通过uvicorn运行
    • 安装 pyinstaller
    • 打包应用
  • 现存问题
    • 现在项目可以打包成功,打包成功却没有办法进行访问,暂未明白是啥原因,有清楚辛苦帮忙解答一下哈,谢谢

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

现存问题

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进