import uvicorn
from fastapi import FastAPI, HTTPException, Query
app = FastAPI()
people_id_str = {"1": "2"}
people_id_int = [1, 2, 3, 4, 5]
@app.post("/fastapi/{people_idone}")
async def postdate(
people_idone: int,
people_id_three: str = Query("1")
):
if people_idone not in people_id_int:
raise HTTPException(status_code=400, detail="people_idone不在范围里",headers={"nice":"what"})
# 如果people_idone不在列表people_id_int里,那就报错400,并新增一个headers
if people_id_three not in people_id_str:
raise HTTPException(status_code=401, detail="people_id_three不在范围里")
# 如果people_id_three不在people_id_str里,那就报错401
return {"people_id": people_idone, "people_id_three": people_id_str[people_id_three]}
if __name__ == "__main__":
uvicorn.run(app='start:app', host='0.0.0.0', port=8091, reload=True, debug=True)
需要注意的是,host一定要修改为0.0.0.0,不能是127.0.0.1,如果你设置为了127.0.0.1,那你就会发现,只有你自己可以访问的到(通过curl访问),为什么。看一下这篇文章
传送门
严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有不清楚的主机和目的网络。这里的“不清楚”是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个“收容所”,所有不认识的“三无”人员,一律送进去。
本机地址,主要用于测试。用汉语表示,就是“我自己”。
首先,我们代码开发完成之后
(venv) ZHR:fastapitest zc$ pip3 freeze > requirements.txt
然后会在项目的根目录下生成一个requirements.txt,里面有所有的这个项目依赖的包,比如下面的这样
anyio==3.4.0
asgiref==3.4.1
click==8.0.3
fastapi==0.70.0
h11==0.12.0
idna==3.3
pydantic==1.8.2
sniffio==1.2.0
starlette==0.16.0
typing_extensions==4.0.0
uvicorn==0.15.0
我们项目中很多文件都是不需要上传到github上的,所以我们需要将没必要上传的文件不上传
在plugins里搜索ignore,安装,然后重启
重启后
注意,如果你的项目已经上传过github了,这个ignore文件是对已经上传的东西不管用的,需要清除缓存之后才可以使用
(venv) ZHR:fastapitest zc$ git rm -r --cached .
这样之后上传到github上就不会有venv等用不到的内容上传上去
在github上新建了项目之后会有怎么上传到github的指导
但是,推荐不要执行(据说新增了这个世因为黑命贵,master,slave,让人想起黑奴)
git branch -M main
然后将
git push -u origin main
替换为
git push -u origin mastrt
由于github经常链接不上,就很烦,那么我们可以链接github的镜像地址
就例如上面的这个地址,将
https://github.com/
修改为
https://hub.fastgit.org/
就可以了
着重讲一下这个SSH Publishers,因为之前我也对这个理解的比较敷衍
要知道这个的逻辑,要先知道当初我们怎么配置的Publish over SSH
还需要知道我们新建的这个项目是保存在哪里的,随便找一个之前部署过的其他的项目,从控制台输出就知道项目在哪里了
比如说上面这个,说明我们的jenkins项目是在Jenkins所在主机
/var/lib/jenkins/workspace/大风起兮云飞扬
那我们新建的fastapitest项目就会在远程主机(也就是Jenkins部署完成后,将部署出来的内容推送到另一台主机上部署,这才是真实的生产部署方式)的
/var/lib/jenkins/workspace/fastapitest
base_dir=/usr/local/JenkinsAndSpring/
project_dir=fastapitest
url_dir=/usr/local/JenkinsAndSpring/fastapitest/venv/bin/python3
pid=$(ps -ef | grep "${url_dir}" | grep -v grep | awk '{print $2}')
$(kill -9 ${pid})
$(cd ${base_dir}${project_dir})
$(rm -rf *)
virtualenv -p python3 --system-site-packages ${base_dir}${project_dir}/venv
$(source ${base_dir}${project_dir}/venv/bin/activate)
$(pwd)
if [ -f ${base_dir}${project_dir}/requirements.txt ];then
${base_dir}${project_dir}/venv/bin/python3 -m pip install -r ${base_dir}${project_dir}/requirements.txt --default-timeout=10000 && echo 0 || echo 0
fi
nohup ${url_dir} ${base_dir}${project_dir}/start.py >${base_dir}${project_dir}/log.log 2>&1 &
echo "+++++++++++++ 开始运行 +++++++++++++"
这里面需要注意的点
1、由于项目是占用端口的,所以每次部署的时候要先杀死原来的端口才可以,我们只需要将/usr/local/JenkinsAndSpring/fastapitest/venv/bin/python3的端口停掉即可。
2、不知道为什么,最后执行start.py的时候就一直提示找不到文件,明明已经cd到了项目目录,没办法,在脚本里新增了一个url_dir,手动将目录定位到start.py的路径
对,没有看错,我尝试过100多次,才将项目部署保持稳定,太难了,还是知识储备不够。
尝试着请求接口
再检查一下日志
[root@hecs-82454 fastapitest]# cat log.log
INFO: Will watch for changes in these directories: ['/root']
INFO: Uvicorn running on http://0.0.0.0:8091 (Press CTRL+C to quit)
INFO: Started reloader process [9052] using statreload
INFO: Started server process [9056]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: 222.249.228.194:25938 - "POST /fastapi/1?people_id_three=1 HTTP/1.1" 200 OK
[root@hecs-82454 fastapitest]# pwd
/usr/local/JenkinsAndSpring/fastapitest
完美,多部署几次也没问题,大功告成