FastApi如何快速构建一个web项目的实现
作者:Li-boss 发布时间:2022-06-29 07:24:10
标签:FastApi,构建,web
FastApi快速构建一个web项目
已经使用FastApi很久了。这个一个非常优秀的框架。和flask一样能够快速构建一个web服务。开发效率非常之高。今天我一个Demo来介绍一下这个框架的使用。供大家学习参考。
项目介绍
本项目主要介绍fastapi快速编写web服务,通过案例分别介绍项目搭建,接口编写,文档生成,模板渲染,excel读取,镜像部署等项目中常见的问题。
项目目录构成
data
learning.xlsx
templates
index.html
main.py
Dockerfile
README.md
requirements.txt
data 目录是存放Excel数据文件
templates 目录是存放html模板文件
main.py 是项目的入口文件
Dockerfile 是项目通过Docker部署构建镜像的文件
README.md 是项目的介绍文件
requirements.txt 是项目的依赖文件
项目内容
数据文件内容
数据文件内容见下图
data/learning.xlsx
模板渲染
见代码
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>编程语言学习Demo</title>
</head>
<body>
<h1>编程语言学习</h1>
<div>
<div style="color:red; ">
<b>注意:这是一个学习的Demo</b>
</div>
</div>
<table>
<tr>
<td>语言</td>
<td>学习目标</td>
<td>学习地址</td>
</tr>
{% for my_dict in info %}
<tr>
<!-- 模板过滤器使用 -->
<td>{{my_dict.语言|replace('nan','')}}</td>
<td>{{my_dict.学习目标|replace('nan','')}}</td>
<td><a href="{{my_dict.URL|e}}" target="_blank">{{my_dict.学习地址|replace('nan','')}}</td>
</tr>
{% endfor %}
</table>
<style>
table {
/*为页面中所有的table标签添加样式*/
width: 1800px;
/*让表格居中显示*/
border: black 1px solid;
/*添加边框*/
border-spacing: 0px;
/* 去掉table
/*标签及其子标签边框之间的白色空隙*/
border-collapse: collapse;
/*去掉重合线*/
}
th {
/*为页面中所有的th标签添加样式*/
border: black 1px solid;
/*添加边框*/
}
td {
/*为页面中所有的td标签添加样式*/
border: black 1px solid;
}
</style>
</body>
</html>
python代码
# 在视图函数中传入request对象,用于在模板对象中传递上下文(同时接收路径参数info,将其传递到上下文中)
@app.get("/", summary="这是一个模板渲染示例")
async def index(request: Request):
# 加载excel数据
result = pd.read_excel(file_path)
# 将excel数据转化为JSON对象
info = result.to_dict("records")
# 返回一个模板对象,同时使用上下文中的数据对模板进行渲染
return templates.TemplateResponse(
name="index.html", context={"request": request, "info": info}
)
同步接口
见代码
@app.get("/index", summary="这是一个同步接口")
def index():
return {"key": "这是一个同步接口返回的数据"}
异步接口
见代码
@app.get("/index/async", summary="这是一个异步接口")
def index_async():
return {"key": "这是一个异步接口返回的数据"}
项目入口文件
见代码
main.py
import os
from pathlib import Path
import pandas as pd
import uvicorn
from fastapi import FastAPI
# 导入Request上下文对象,用来在前后台之间传递参数
from starlette.requests import Request
# 导入jinja2模板引擎对象,用于后续使用
from starlette.templating import Jinja2Templates
app = FastAPI()
# 实例化一个模板引擎对象,指定模板所在路径
templates = Jinja2Templates(directory="templates")
data_path = os.path.abspath(Path("data"))
# 获取文件路径
file_path = os.path.join(data_path, "learning.xlsx")
# 在视图函数中传入request对象,用于在模板对象中传递上下文(同时接收路径参数info,将其传递到上下文中)
@app.get("/", summary="这是一个模板渲染示例")
async def index(request: Request):
# 加载excel数据
result = pd.read_excel(file_path)
# 将excel数据转化为JSON对象
info = result.to_dict("records")
# 返回一个模板对象,同时使用上下文中的数据对模板进行渲染
return templates.TemplateResponse(
name="index.html", context={"request": request, "info": info}
)
@app.get("/index/async", summary="这是一个异步接口")
def index_async():
return {"key": "这是一个异步接口返回的数据"}
@app.get("/index", summary="这是一个同步接口")
def index():
return {"key": "这是一个同步接口返回的数据"}
if __name__ == "__main__":
# 启动程序
uvicorn.run(app="main:app", host="0.0.0.0", port=8000, reload=True)
项目依赖
requirements.txt
fastapi==0.94.1
uvicorn==0.21.0
jinja2==3.1.2
pandas==1.5.3
openpyxl==3.1.2
gunicorn==20.1.0
项目部署
项目构建文件
Dockerfile
FROM python:3.8.16-slim-buster
LABEL MAINTAINER Li-boss "CSDN Li-boss"
COPY ./ /var/demo
RUN pip install -r /var/demo/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
WORKDIR /var/demo
EXPOSE 8000
CMD gunicorn main:app -b 0.0.0.0:8000 --forwarded-allow-ips='*' -w 4 -k uvicorn.workers.UvicornWorker
进入到Dockerfile所在的目录,执行下面的命令构建镜像.
docker build test_demo:v1 .
启动容器
docker run -it -p 8000:8000 test_demo:v1
访问地址
http://localhost:8000/
# 文档地址:
http://localhost:8000/docs
http://localhost:8000/redoc
访问效果
文档效果一
文档效果二
模板渲染效果一
来源:https://blog.csdn.net/qq_33196814/article/details/129718998


猜你喜欢
- 今天在启动mysql时出现以下问题:[root@www ~]# mysql -u root -pEnter password: ERROR
- 问题一:安装模块时出现报错 Microsoft Visual C++ 14.0 is required,也下载安装了运行库依然还是
- MD5(Message-Digest Algorithm 5) 模块用于计算信息密文(信息摘要),得出一个128位的密文。sha模块跟md5
- 使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现:下载包:paramikoimport paramiko#服务器
- 代码代码很简单,主要是为了熟悉Selenium这个库的函数,为后续的短信轰炸做个铺垫from selenium import webdriv
- 先说需求: 1、django 自带了admin后管,如果我们需要使用,只需把我们定义的models注册即可;2、但如果只是简单注册,那显示的
- 错误号 错误信息5 &n
- 一、动机(Motivate)“模板方法”,就是有一个方法包含了一个模板,这个模板是一个算法。在我们的
- asyncio在Python 2的时代,高性能的网络编程主要是使用Twisted、Tornado和Gevent这三个库,但是它们的异步代码相
- 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参
- 实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样
- 给zblog添加上“运行代码”的功能,这是“密陀僧”修改z-blog源码,给z-bog增添的新功能。这个方法出来很久了,我现在才加上还不晚吧
- 1.1. 前言众所周知,安服工程师又叫做Word工程师,在打工或者批量SRC的时候,如果产出很多,又需要一个一个的写报告的情况下会非常的折磨
- 本文实例为大家分享了js实现鼠标切换图片的具体代码,供大家参考,具体内容如下实现效果,可以利用鼠标移动在对应的小点点上,或者点击左右两侧的箭
- 如何拖拽文件到指定位置,具体方法如下在从本地上传图片的时候,如果使用拖拽效果,想想应该是更加的高大上,下面直接上代码完整代码:<!DO
- 这篇文章主要介绍了python线程信号量semaphore使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 一.图像点运算概念图像点运算(Point Operation)指对于一幅输入图像,将产生一幅输出图像,输出图像的每个像素点的灰度值由输入像素
- 博主最近试在服务器上进行spark编程,因此,在开始编程作业之前,要先搭建一个便利的编程环境,这样才能做到舒心地开发。本文主要有以下内容:1
- 本文是利用python 复制文件夹 刚开始写了一个普通的递归复制文件夹 然后想了想 觉得对io频繁的程序 thre
- 准备工作VUE开发工具:Visual studio Code倾斜摄影转换工具:CesiumLab—下载地址:http:/