一般网上的文章都是以脚本的方式写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. flutter填坑之旅(环境搭建篇--mac系统)

    上次配置过Mac到flutter环境,但是由于最近系统更新了,什么都没了又得从新配置,发现自己竟然好多都忘记了,看来还是得把它记下来才行 在Mac上安装并运行Flutter 最低要求: 操作系统:ma ...

  2. Java的Object类的方法

    Java的Object类是所有类的根类,它提供了一些通用的方法.下面是一些常用的Object类方法: 1. equals(Object obj):判断当前对象是否与给定对象相等.默认情况下,equal ...

  3. JavaWeb入门必备JavaEE规范!

    前言 对于学习 Java 的同学,大都是 Web 方向的.我们学习 JavaWeb 开发肯定是一个循序渐进的过程,学习前有一些前置知识要掌握,比如 JavaSE 相关知识,HTML.CSS.JavaS ...

  4. OSPF 多区域配置实验

    实验拓扑 实验需求 按照图示配置 IP 地址和loopback 接口 按照图示分区域配置 OSPF ,实现全网互通 为了路由结构稳定,要求路由器使用环回口作为 Router-id 在AR3上配置静默接 ...

  5. java匿名内部类的初解

    java原生态中的匿名内部类 1.匿名内部类的定义 使用匿名内部类的两种的方法 建立父类,重写父类的方法 实现接口的方法 2.普通类的实现 1. 普通类实现 实现普通类需要先声明对一个类的对象,再调用 ...

  6. 简约版八股文(day1)

    Java基础 面向对象的三大基本特征 封装:将一些数据和对这些数据的操作封装在一起,形成一个独立的实体.隐藏内部的操作细节,并向外提供一些接口,来暴露对象的功能. 继承:继承是指子类继承父类,子类获得 ...

  7. ZEGO自研RTC+直播系统架构,如何支撑一场高质量直播

    近年来得益于网络基础设施的进步,实时音视频(Real-Time Communication,以下简称 RTC)和直播(采用 CDN 进行内容分发)在各行业迅速落地,在疫情的催化下更是推动传统的教育.会 ...

  8. 实际上手体验maven面对冲突Jar包的加载规则

    一.问题背景 相信大家在日常的开发过程中都遇到过Jar包冲突的问题,emm,在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题.主要是一个完整的项目会不可避免的使用第三方的Jar ...

  9. ip2location.py

    import re import geoip2.database from tabulate import tabulate from matplotlib import pyplot as plt ...

  10. GoRedisLock:Golang保障数据一致性的分布式锁解决方案

    在现代分布式系统中,多个节点之间共享资源是常见的需求.然而,并发访问共享资源可能导致数据不一致性和竞争条件.为了解决这些问题,我们需要引入分布式锁.GoRedisLock是一个出色的分布式锁库,它结合 ...