一般网上的文章都是以脚本的方式写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. CentOS系统重命名

    感觉默认的系统名称很难看,得改改,如下 一.查看linux 系统版本信息 [root@iZbp15rmf8lyj2yhq136ebZ ~]# cat /etc/redhat-release CentO ...

  2. 如何在.net6webapi中配置Jwt实现鉴权验证

    JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...

  3. 写一个Python简单的Socket网络通讯

    完成需求 用Python完成一个简单的Socket通讯实例 1. 服务端 用于提供服务 源码: import socket s = socket.socket() # 创建服务器端套接字 # sk.s ...

  4. 使用python连接阿里云iot平台时遇到的问题及解决方法(on_connect打印的rc值为9,上传物模型值)

    使用python连接阿里云iot平台时遇到的问题及解决方法                                                            on_connect打 ...

  5. Apikit SaaS 10.9.0 版本更新: 接口测试支持通过 URL 请求大型文件,支持导出为 Postman 格式文件

    Hi,大家好! Eolink Apikit 即将在 2023年 6月 8日晚 18:00 开始更新 10.9.0 版本.本次版本更新主要是对多个应用级资源合并,并基于此简化付费套餐和降低费率. 本次应 ...

  6. CSS3+Jquery实现带动画效果的下拉选择框

    CSS3+JQuery实现带动画效果的下拉选择框. 元素结构为: 1 <div class="box"> 2 <p>this is the first li ...

  7. MyBatis体系笔记

    MyBatis 什么是MyBatis MyBatis是优秀的持久层框架 MyBatis使用XML将SQL与程序解耦,便于维护 MyBatis学习简单,执行高效,是JDBC的延伸 1.MyBatis开发 ...

  8. 区块链应用:椭圆曲线数字签名算法ECDSA

    1 椭圆曲线密码学 椭圆曲线密码学(Elliptic Curve Cryptography,缩写ECC),是基于椭圆曲线数学理论实现的一种非对称加密算法.椭圆曲线在密码学中的使用是在1985年有Nea ...

  9. Java并发(十二)----线程应用之多线程解决烧水泡茶问题

    1.背景 统筹方法,是一种安排工作进程的数学方法.它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用. 怎样应用呢?主要是把工序安排好. 比如,想泡壶茶喝.当 ...

  10. 春节无法线下社交聚会,来线上“一起X”共享体验

    引语: 共享体验或许是全真互联网时代最显著的标志. 被疫情深刻改变的一年里,人们的社交关系和社交活动正在发生巨大的改变. 一方面,从线下转线上,我们能通过互联网连接更多的人,参与各种形式的社交活动,将 ...