赞
踩
Run a Server Manually - Uvicorn - FastAPI
pip install "uvicorn[standard]"
main.py
- from typing import Union
- from fastapi import FastAPI
- import uvicorn
-
- app = FastAPI()
- '''
- 启动命令
- uvicorn main:app --reload --port 8000
- #导出依赖
- pip freeze >requirements.txt
- api文档地址
- http://localhost:8080/docs
- 参数类型:
- 请求正文(body)+路径参数({})+查询参数(?&)
- '''
-
-
- @app.get("/")
- async def root():
- return {"message": "Hello World"}
-
-
- @app.get("/items/{item_id}")
- def read_item(item_id: int, q: Union[str, None] = None):
- return {"item_id": item_id, "q": q}
-
-
- # 第二种启动方式:
- if __name__ == '__main__':
- uvicorn.run(app="main:app", host="localhost", port=8000)
- uvicorn main:app --host 0.0.0.0 --port 8080
-
-
- # uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 # 启动4个进程
main 是项目启动文件main.py
app是main.py里的FastAPI对象(app = FastAPI() )
允许所有ip连接:--host 0.0.0.0
项目启动在8080端口 : --port 8080
远程连接一断开服务会停止
Server Workers - Gunicorn with Uvicorn - FastAPI
Gunicorn将充当进程管理器,监听端口和IP。它会将通信传输到运行Uvicorn类的工作进程。Uvicorn将负责将Gunicornn发送的数据转换为FastAPI使用的ASGI标准。
pip install "uvicorn[standard]" gunicorn
- gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
-
-
- # -workers:要使用的worker进程的数量,每个进程将运行一个Uvicorn worker,在本例中为4个worker。
- # 导入uvicon.workers.UvicornWorker
- # --bind:这个命令告诉Gunicorn要监听的IP和端口,使用冒号(:)分隔IP和端口
- # Gunicorn还将负责管理失效流程,并在需要时重新启动新流程,以保持进程数量。
这种启动方式远程连接断开不会停止服务
查找进程: ps -ef|grep 进程名
杀死进程: kill -s 9 进程号
- ps -ef|grep Uvicorn
- ps -ef|grep Gunicorn
FastAPI in Containers - Docker - FastAPI
.
├── app
│ ├── __init__.py
│ └── main.py
├── Dockerfile
└── requirements.txt
- #
- FROM python:3.9
-
- # 设置工作目录
- WORKDIR /code
-
- # copy文件到容器
- COPY ./requirements.txt /code/requirements.txt
-
- # 创建日志目录
- RUN mkdir -p /log
-
- #
- RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
-
- #
- COPY ./app /code/app
-
- # 启动命令
- CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
-
-
- # 使用nginx代理请求头
- #CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
- # cd 到Dockerfile文件所在目录
-
- docker build -t myimage .
- docker run -d --name mycontainer -p 800:80 myimage
-
- # -p:端口映射 宿主机端口:容器端口
持续更新。。。
运行脚本 : ./startweb.sh
- #!/bin/bash
-
- image_name='apiimage'
- contrainer_name='apiproject'
- git_url='https://gitee.com/daixxxxx/apidemo.git'
- project_name='apidemo'
- prot=900
-
- if [ ! -d "./${project_name}/" ];then
- echo "项目目录不存在"
- # 克隆代码
- git clone ${git_url}
-
- # 进入项目目录
- cd ${project_name}
-
- # 制作镜像 apiimage:镜像名
- docker build -t ${image_name} .
-
- # 运行容器 apidemo:容器名
- docker run -v /usr/local/web/apilog:/log \
- -d --name ${contrainer_name} -p ${prot}:80 ${image_name}
-
-
- else
- echo "项目已经存在"
- # 进入dockerfile所在目录
- cd ./${project_name}
- # 拉取最新代码
- git pull ${git_url}
- # 停止apidemo容器
- docker stop ${contrainer_name}
- # 删除容器
- docker rm ${contrainer_name}
- # 制作镜像
- docker build -t ${image_name} .
- # 运行容器 apidemo:容器名
- docker run -v /usr/local/web/apilog:/log \
- -d --name ${contrainer_name} -p ${prot}:80 ${image_name}
- fi
-
-
- # 检查容器运行状态
- status=$(docker inspect --format='{{.State.Status}}' "$contrainer_name")
- if [ "$status" = "running" ];then
- echo "项目部署成功"
- else
- echo "项目部署失败"
- fi
- # cd 到脚本目录
- ./startweb.sh
- # 停止容器apiproject
- docker stop apiproject
持续更新。。。
持续更新。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。