一般网上的文章都是以脚本的方式写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 项目的更多相关文章

  1. 3 分钟轻松搭建 Ruby 项目自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这是一篇关于 Ruby 项目持续集成的快速指导教程,教大家如何使用 f ...

  2. element-ui和npm、webpack、vue-cli搭建Vue项目

    一.element-ui的简单使用 1.安装 1. npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S 2. CDN ...

  3. 2. 搭建DRF项目

    企业项目开发流程 一.需求分析 1.企业的web项目类型: 商城 门户网站[企业站和门户站] 社交网络 资讯论坛 内部系统 个人博客 内容收费站 前端的静态页面制作,外界开发的时候,是照着psd/pn ...

  4. Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验

    (一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...

  5. 使用 Django1.11搭建blog项目

    使用Django搭建blog项目 简单设置: http://blog.csdn.net/w_e_i_/article/details/70761604 模板渲染: http://blog.csdn.n ...

  6. VSCode搭建django项目

    之前我们使用VSCode搭建C#项目,今天写一篇关于django项目的搭建,其实以其说是搭建django框架,不如说是如何通过vscode开发django项目:django官网:https://www ...

  7. 使用yarn搭建vue项目

    今天尝试了一下用yarn的方式搭建vue项目,方法其实是和npm的用法一样.但是在创建过程中报错了.现在整理一下,便于后期查错时使用. 以windows系统为例 1.全局安装yarn,三种方式 官网上 ...

  8. 搭建django项目连接mysql数据库环境

    开通博客园这么久,即将写下第一篇博客,十分兴奋.首先了,庆祝自己写下了码农生涯博客园第一篇博客,其次了,庆祝自己经过了10个小时奋战,终于成功搭建django项目连接mysql数据库的环境.在此过程中 ...

  9. 80个Python练手项目列表

    80个Python练手项目列表   我若将死,给孩子留遗言,只留一句话:Repetition is the mother of all learning重复是学习之母.他们将来长大,学知识,技巧.爱情 ...

  10. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

随机推荐

  1. 代码随想录算法训练营Day15 二叉树| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2

    代码随想录算法训练营 代码随想录算法训练营Day15 二叉树| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2 层序遍历10 题目链接:层序遍历10 给你二叉树的根节点 root ,返回其 ...

  2. 如何卸载 python setup.py install 安装的包?

    当我们半自动安装某些 python 包时,总是存在很多依赖关系的问题,而这些问题还是很难避免的,所以,当我们安装一个不确定的包的时候,最好提前收集一些相关资料,或者请教他人,同时最好把安装过程都记录下 ...

  3. UpSetR:多数据集绘图可视化处理利器

    说到集合数据可视化,我们第一时间想到的就是韦恩图.在 NGS 相关的研究中,韦恩图用来直观表征不同的集合之间元素重叠关系,是经常在文献中出现的图. 在集合数少的时候韦恩图是很好用的,但是当集合数多比如 ...

  4. 解决org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource **/**/dao/**Mapper.xml问题

    1. 问题分析 出现此问题的原因是资源过滤的问题,编写在DAO包中的XML文件没有被打包. 2. 解决方案 在pom.xml文件中加入如下资源过滤: <!-- 静态资源导出问题 --> & ...

  5. 5月这几个API安全漏洞值得注意!

    5月份的一些API安全漏洞报告 希望大家查漏补缺 及时修复自己API可能出现的漏洞 No.1 微软.NET Core漏洞 漏洞详情:微软官方发布公告称,其.NET Core 2.1.3.1和5.0版本 ...

  6. 自然语言处理 Paddle NLP - 情感分析技术及应用-理论

    自然语言处理 Paddle NLP - 信息抽取技术及应用 定义:对带有感情色彩的主观性文本进行 分析.处理.归纳和推理的过程 主观性文本分析:技术难点 背景知识 电视机的声音小(消极) 电冰箱的声音 ...

  7. FPGA加速技术在游戏和娱乐系统中的应用:实现高效的游戏和娱乐系统

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 <35. FPGA加速技术在游戏和娱乐系统中的应用:实现高效的游戏和娱乐系统>这篇文章是一篇针对 ...

  8. 编译器设计中的元编程:从Python到JavaScript的实现

    目录 编译器设计中的元编程:从Python到JavaScript的实现 随着编程语言的发展,编译器的实现也在不断地演变.编译器的实现方式有很多种,其中元编程(metaprogramming)是一种非常 ...

  9. vue2父传子,子传父

    首先看父传子 自定义一个子组件 <template> <div> 子组件: <span>{{inputName}}</span> </div> ...

  10. GGTalk 开源即时通讯系统源码剖析之:虚拟数据库

    继上篇<GGTalk 开源即时通讯系统源码剖析之:服务端全局缓存>详细介绍了 GGTalk 对需要频繁查询数据库的数据做了服务端全局缓存处理,以降低数据库的读取压力以及加快客户端请求的响应 ...