Python 搭建 FastAPI 项目
一般网上的文章都是以脚本的方式写Demor的,没找到自己想要的那种项目结构型的示例(类似Java SpringBoot 创建 Model,通过 pom 进行关联配置的那种)
看了一些源码,再结合自己的想法,建了一个简单的示例, 用 Python 做接口服务的项目搭建,仅供参考
代码结构说明

VipQA
│ .env # 环境变量配置文件
│ app_init.py # 我用它来放了项目初始化代码
│ main.py # 主程序,用来启动项目
│ requirements.txt # 项目依赖包 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 进行安装
│ settings.py # 用来将 .env 里的变更值取出来。 Python 设置环境变量方法(https://www.cnblogs.com/vipsoft/p/17677020.html)
│ __init__.py # 目前没放代码
│
├─db # 里面放了初始化数据库的脚本
│ └─ build_nodes.py
│
├─routers # 路由目录,相当于 Java 里的 Controller
│ │ node_router.py # neo4j 节点接口,用来处理节点相关的接口方法
│ └─ __init__.py # 路由配置,把目录下的各模块路由注册到 API 里面
│
├─service # 业务逻辑处理,参考JAVA,供 Controller 调用
│ node_service.py # neo4j 节点服务,处理节点逻辑
│ __init__.py # 目前空
│
├─static # 静态资源目录
│ 404.html # URL地址不存在时,显示这个页面
│ index.html # 默认首页
│
└─utils # 工具类
│ neo4j_provider.py # neo4j 连接工具
└─ __init__.py # 目前空
主程序代码
requirements.txt
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 知识图谱依赖包
neo4j==5.10.0
# async web framework
# web 服务器
uvicorn==0.23.2
# 代码框架
fastapi==0.101.1
# 环境配置 .env 使用依赖包
python-dotenv==0.20.0
# 命令行、控制台,返回内容,字体变颜色
colorama==0.4.4
.env 环境变量配置文件
# app
APP_HOST=127.0.0.1
APP_PORT=8000
# neo4j
NEO4J_URI=neo4j://172.16.3.64:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=password
NEO4J_VERSION=5
NEO4J_DATABASE=neo4j
NEO4J_PORT=8080
settings.py
变量设置一般有两种,一种取文件里的,还有是取系统的环境变量,详见:Python 设置环境变量方法
from dotenv import dotenv_values
from typing import List
dotenv_config = dotenv_values('.env')
class Settings:
BACKEND_CORS_ORIGINS: List = ['*']
# APP
APP_HOST = dotenv_config.get("APP_HOST", "127.0.0.1")
APP_PORT = int(dotenv_config.get("APP_PORT", 8000))
# Neo4j
NEO4J_URI = dotenv_config.get("NEO4J_URI", "neo4j://172.16.3.64:7687")
NEO4J_USER = dotenv_config.get("NEO4J_USER", "neo4j")
NEO4J_PASSWORD = dotenv_config.get("NEO4J_PASSWORD", "password")
NEO4J_VERSION = dotenv_config.get("NEO4J_VERSION", "5")
NEO4J_DATABASE = dotenv_config.get("NEO4J_DATABASE", "neo4j")
NEO4J_PORT = int(dotenv_config.get("NEO4J_PORT", 8080))
settings = Settings()
app_init.py
项目启动
import time
import logging
import os
from settings import settings
from starlette.middleware.cors import CORSMiddleware
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from routers import api_router
# 创建 FastAPI 实类,供 main.py 调用
def create_application() -> FastAPI:
# 等待其他组件启动完成
time.sleep(3)
application = FastAPI(
title="FastAPI结构示例", # 文档标题
description="使用 FastAPI 实现 Node4j 基础功能. ", # 文档简介
version="0.0.1", # 文档版本号
# docs_url=None, redoc_url=None, # 配置离线文档,None 后,http://127.0.0.1:8000/docs 就不能再访问了
)
# api_router => routers/__init__.py 里面 的 api_router = APIRouter()
# 访问接口时,所有的接口前面都要加上 api 前缀,相当于 Java 里的 server.servlet.context-path: /api 配置
application.include_router(api_router, prefix='/api') # 后面带 API 的就表示接口,路由到 routers 目录下找对应的接口,相当于 Java 的 Controller,
register_middleware(application) # 支付跨域
register_static(application) # 添加HTML静态页面配置
register_event(application) # 添加项目事件
return application
def register_static(app):
# 如果需要使用静态文件, 可以使用 StaticFiles,将它挂载到应用程序中。
html_path = os.path.dirname(os.path.abspath(__file__))
app.mount('/static', StaticFiles(directory=os.path.join(html_path, 'static')))
@app.get('/')
async def read_index():
# 跳转到 static 下面的 index.html 文件
return FileResponse(os.path.join(html_path, 'static', 'index.html'))
@app.exception_handler(404)
async def not_found(request: Request, exc):
accept = request.headers.get('accept')
if not accept:
# 返回JSON 格式
return JSONResponse(content={'error': "Not found"}, status_code=exc.status_code)
if exc.status_code == 404 and 'text/html' in accept:
# 404 跳转到 static 下面的 404.html 页面
return FileResponse(os.path.join(html_path, 'static', '404.html'))
else:
return JSONResponse(content={'error': "Not found"}, status_code=exc.status_code)
# 支持跨域
def register_middleware(application):
if settings.BACKEND_CORS_ORIGINS:
application.add_middleware(
CORSMiddleware,
allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
def register_event(app):
@app.on_event("startup")
async def startup_event():
logging.info("App Startup")
@app.on_event("shutdown")
async def shutdown_event():
logging.info("App Shutdown")
接口路由
routers/init.py
from fastapi import APIRouter
from . import node_router
api_router = APIRouter()
# tags 显示在 Swagger 上的标题
# 这边的 prefix 相当于 java 里的 Controller 上的 @RequestMapping("/node")
api_router.include_router(node_router.router, tags=['Node'], prefix='/node')
node_router.py
from fastapi import APIRouter, status
from fastapi.responses import JSONResponse
router = APIRouter()
# 定义一个根路由
@router.get("/add")
def add_node():
# TODO 往 neo4j 里创建新的节点
data = {
'code': 0,
'message': '',
'data': 'add success'
}
return JSONResponse(content=data, status_code=status.HTTP_200_OK)

附JAVA,接口前缀配置
所有接口前面的前缀
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8088
servlet:
# 应用的访问路径
context-path: /api
业务接口上的前缀(所有类方法前)
@RequestMapping("/node")
public class NodeController{
@PostMapping("/add")
public void add(){
}
}
源码地址:https://gitee.com/VipSoft/VipQA
Python 搭建 FastAPI 项目的更多相关文章
- 3 分钟轻松搭建 Ruby 项目自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这是一篇关于 Ruby 项目持续集成的快速指导教程,教大家如何使用 f ...
- element-ui和npm、webpack、vue-cli搭建Vue项目
一.element-ui的简单使用 1.安装 1. npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S 2. CDN ...
- 2. 搭建DRF项目
企业项目开发流程 一.需求分析 1.企业的web项目类型: 商城 门户网站[企业站和门户站] 社交网络 资讯论坛 内部系统 个人博客 内容收费站 前端的静态页面制作,外界开发的时候,是照着psd/pn ...
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- 使用 Django1.11搭建blog项目
使用Django搭建blog项目 简单设置: http://blog.csdn.net/w_e_i_/article/details/70761604 模板渲染: http://blog.csdn.n ...
- VSCode搭建django项目
之前我们使用VSCode搭建C#项目,今天写一篇关于django项目的搭建,其实以其说是搭建django框架,不如说是如何通过vscode开发django项目:django官网:https://www ...
- 使用yarn搭建vue项目
今天尝试了一下用yarn的方式搭建vue项目,方法其实是和npm的用法一样.但是在创建过程中报错了.现在整理一下,便于后期查错时使用. 以windows系统为例 1.全局安装yarn,三种方式 官网上 ...
- 搭建django项目连接mysql数据库环境
开通博客园这么久,即将写下第一篇博客,十分兴奋.首先了,庆祝自己写下了码农生涯博客园第一篇博客,其次了,庆祝自己经过了10个小时奋战,终于成功搭建django项目连接mysql数据库的环境.在此过程中 ...
- 80个Python练手项目列表
80个Python练手项目列表 我若将死,给孩子留遗言,只留一句话:Repetition is the mother of all learning重复是学习之母.他们将来长大,学知识,技巧.爱情 ...
- 一步一步使用ABP框架搭建正式项目系列教程之本地化详解
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...
随机推荐
- 【技术分享】万字长文图文并茂读懂高性能无锁 “B-Tree 改”:Bw-Tree
[技术分享]万字长文图文并茂读懂高性能无锁 "B-Tree 改":Bw-Tree 原文链接: https://mp.weixin.qq.com/s/I5TphQP__tHn6JoP ...
- find提权
更新中.............. find 常用参数 语法:find [path-] [expression] path为查找路径,.为当前路径,/为根目录 expression即为参数 -name ...
- rust实现weatherforecast的获取天气webapi
rust用来写webapi可能有点大材小用,但是作为入门学习应该说是不错的选择. cargo new webapi创建一个webapi项目,在src下面新建handler文件夹和models文件夹. ...
- O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?
本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作. 在流程表单设计界面, ...
- PostgreSQL 12 文档: 部分 VIII. 附录
部分 VIII. 附录 目录 A. PostgreSQL错误代码 B. 日期/时间支持 B.1. 日期/时间输入解释 B.2. 处理无效或不明确的时间戳 B.3. 日期/时间关键词 B.4. 日期/时 ...
- 一个C#跨平台的机器视觉和机器学习的开源库
大家都知道OpenCV是一个跨平台的机器视觉和机器学习的开源库,可以运行在Linux.Windows.Android和Mac OS操作系统上,由C++开发. 今天给大家介绍一个用C#对OpenCV封装 ...
- Vue + Volo.Abp 实现Auth2.0客户端授权模式认证
@ 目录 注册Client Auth2.0授权 创建vue-oidc-client 创建Auth2.0认证跳转 获取令牌 创建回调页面 创建退出登录 最终效果 Volo.Abp的身份服务器模块默认使用 ...
- 「学习笔记」Lambda 表达式
Lambda 表达式因数学中的 \(\lambda\) 演算得名, 直接对应于其中的 lambda 抽象. Lambda 表达式能够捕获作用域中的变量的无名函数对象, 我们可以将其理解为一个匿名的内联 ...
- Jenkins自动化测试构建完成 发送钉钉消息
背景 有时自动化测试完成后,我们可以通过构建完成后给钉钉群发消息,这样就能及时通知到所有人员了. 接入流程 1:建立钉钉机器人,可以通过群助手,添加机器人,增加WebHook自定义接入,然后添加完成会 ...
- Java IO流 - 字节流的使用详细介绍
IO流的基本介绍: IO流的概述: i 表示intput,是数据从硬盘文件读入到内存的过程,称之输入,负责读. o 表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写. ...