011、Python+fastapi,第一个后台管理项目走向第11步:建立python+fastapi项目,简单测试一下

一、说明

本文章就是记录自己的学习过程,如果有用您可以参考,没用你就略过,没有好与不好之分,今天主要是参考了gitee上的一些项目,一步一步的往后i建立

对于学习来说,如果您有java c++等经验,python相对来说简单,当然是入门简单,所以找个简单的教材看看就可开始干了,当然面试除外,问的问题不一样,毕竟不允许你bug多不是。自己学,多点bug也不是坏事,但是面试不一样,得好好学,我不用去面试,就边学边干

至于为什么选fastapi而不是django,这个也是听说fastapi效率更高,还有就是如果以后采集数据,进行数据处理,深度学习不知道会不会更好,反正网上说更适合,我也就用了

二、安装要用的包

既然是站在巨人的肩膀(RuoYi-Vue3-FastAPI)之上,就不客气了,直接搞个requirements.txt文件,装吧,前端好多都是这么玩的(nodejs),在根目录建一个requirements.txt

进入项目根目录直接装

安装之前设置一下pip源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip install -r requirements.txt

我这里出错了,python 版本3.8 不行,后来升级了3.9,包的版本和python版本不匹配造成的。

后来又出错了:ERROR: pandas 2.1.4 has requirement pytz>=2020.1, but you'll have pytz 2019.3 which is incompatible.

pip install --upgrade pytz

安装最新的就可以了,后来在别的机器上跑了一遍,没有这一错误

三、导入数据库

前面讲过,我们是在RuoYi-Vue3-FastAPI的基础上学习,所以数据库直接导入,比较数据库的设计还是花时间的,直接搞定框架,再回来学习

没有装远程链接工具,直接用命令行导入

e) jiangkping@bm1dqvp3wr5zfyw:~/Downloads$ sudo mysql -u root -p
Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owner

<think> 我们正在处理一个关于将Django项目迁移到FastAPI的具体方法的查询。根据用户提供的引用,我们可以总结出以下几点关键信息: 1. 引用[2]提到:在Python大型项目中,FastAPI和Django可以相互配合,FastAPI用于API服务,Django用于传统Web开发。 2. 引用[3]提到了一种新兴方案:Django Ninja,它可以在Django项目中实现FastAPI风格的API,这提供了一种渐进迁移的可能。 3. 引用[4]对比了Django和FastAPI,指出FastAPI是一个现代异框架,具有高性能和内置的自动文档、数据验证等特性。 用户的需求是“将Django项目迁移到FastAPI的具体方法”。迁移意味着从Django框架转向FastAPI框架。由于这两个框架的设计哲学和结构不同,迁移不是简单的替换,而是需要重新设计架构。我们可以考虑两种主要策略: 策略1:完全迁移 - 将整个项目从Django重写为FastAPI。 策略2:渐进迁移 - 保留Django项目,逐将部分功能(特别是API部分)迁移到FastAPI,通过微服务架构实现共存。 根据引用[3]中提到的Django Ninja,我们还可以考虑第三种策略:使用Django Ninja在Django项目中模拟FastAPI风格,这样可以获得类似FastAPI的体验而不需要完全迁移。 但是用户明确要求迁移到FastAPI,所以我们主要讨论前两种策略,并简要提及第三种作为替代方案。 具体迁移骤: 一、完全迁移骤: 1. 分析现有Django项目结构,包括模型(Models)、视图(Views)、路由(URLs)、模板(Templates)、静态文件、中间件、设置等。 2. 设计FastAPI项目结构。FastAPI没有Django那样严格的项目结构,因此需要自行组织。 3. 迁移模型:由于FastAPI不包含内置ORM,我们需要选择一种ORM(如SQLAlchemy、Peewee或Tortoise ORM)来替代Django ORM。需要重写模型定义,并处理数据库迁移(可以使用Alembic)。 4. 迁移业务逻辑:将Django视图中的业务逻辑提取出来,改写为FastAPI的路由函数。注意,FastAPI是基于异的(也支持同),所以可以考虑使用异数据库驱动以提高性能。 5. 重构模板和静态文件:如果原项目使用了Django的模板系统,则需要选择一种支持FastAPI的模板引擎(如Jinja2)并重新配置。静态文件服务可以通过FastAPI的`StaticFiles`模块提供。 6. 迁移中间件:将Django中间件的功能用FastAPI中间件实现。 7. 替换Django表单验证:使用FastAPI内置的Pydantic模型进行请求数据验证。 8. 替换Django的认证和授权系统:FastAPI提供了安全工具(如OAuth2PasswordBearer),需要重新实现认证流程。 9. 设置数据库连接:在FastAPI中配置数据库连接(例如通过异数据库驱动连接)。 10. 迁移测试:将Django的测试用例改写为FastAPI测试(可以使用`TestClient`)。 11. 部署:部署方式不同,FastAPI通常使用ASGI服务器(如Uvicorn或Hypercorn)运行。 二、渐进迁移(微服务架构): 1. 保留现有Django项目,将其作为整体运行(例如处理管理后台、用户界面等)。 2. 将API部分抽离出来,使用FastAPI构建新的API服务。 3. 通过HTTP请求(或消息队列)在两个服务之间通信。例如,Django项目中的某些功能需要调用API时,可以调用FastAPI服务。 4. 逐将更多的功能迁移到FastAPI服务,直到最终可能完全替代Django。 三、替代方案:使用Django Ninja 如果用户的主要目的是想获得FastAPI类似的开发体验(如自动文档、基于类型提示的验证)而不想完全迁移,则可以使用Django Ninja(如引用[3]所述)。这样可以在Django项目内构建FastAPI风格的API,同时继续使用Django ORM和其他功能。 考虑到用户要求的是迁移到FastAPI的具体方法,我们重点展开第一种和第二种。 详细骤(以完全迁移为例): 骤1:项目分析和准备 - 确定Django项目中的功能模块,划分优先级,制定迁移计划。 - 创建新的FastAPI项目(可以使用`fastapi`模板或自行搭建)。 骤2:设置数据库和模型迁移 - 安装选择的ORM(例如SQLAlchemy)和异驱动(如`asyncpg`用于PostgreSQL)。 - 创建模型(使用SQLAlchemy的declarative_base)。 - 使用Alembic初始化迁移环境,生成初始迁移脚本。 骤3:构建FastAPI核心组件 - 创建主应用文件(例如`main.py`),初始化FastAPI应用。 - 创建路由文件,将Django的URL映射到FastAPI的路由。 骤4:视图迁移 - 对于每个Django视图,分析其功能,将其改写为FastAPI的路由函数。 - 注意:Django的类视图(Class-based Views)需要转换为函数式视图(或使用FastAPI的APIRouter组织)。 - 使用Pydantic模型定义请求和响应体。 骤5:处理认证和权限 - 如果原项目使用了Django的认证系统,需要在FastAPI中重新实现。可以使用JWT、OAuth2等。 骤6:静态文件和模板(如果需要) - 配置静态文件服务:`app.mount("/static", StaticFiles(directory="static"), name="static")` - 配置模板引擎:例如安装`jinja2`,创建模板文件夹,并在路由函数中返回模板响应。 骤7:测试和调试 - 编写单元测试和集成测试,确保迁移后的功能与原来一致。 骤8:部署 - 使用ASGI服务器部署FastAPI应用。 注意事项: - 迁移过程可能很复杂,尤其是对于大型项目,建议分模块进行。 - 如果项目依赖Django特有的功能(如Admin后台、用户认证系统、内容管理框架等),迁移成本会很高,可能需要寻找替代方案。 渐进迁移骤: 1. 在现有Django项目旁边启动一个FastAPI服务。 2. 将一些新的API功能或需要高性能的API放在FastAPI中实现。 3. 通过HTTP调用或消息队列实现Django和FastAPI之间的通信。 4. 逐迁移旧功能,直到所有API都迁移到FastAPI,而Django只保留非API部分(如管理后台)或者完全弃用。 选择哪种策略取决于项目规模和团队资源。完全迁移适合中小型项目或愿意投入重写的团队;渐进迁移适合大型项目,可以逐迁移,降低风险。 最后,我们也可以向用户建议,如果只是想要FastAPI风格的API开发体验,而不想完全放弃Django,可以考虑使用Django Ninja(如引用[3])。 根据以上分析,我们给出具体回答。 </think> ### 将Django项目迁移到FastAPI的具体方法 迁移Django项目FastAPI需要分骤进行,以下是详细方法和建议: --- #### **一、迁移策略选择** 1. **渐进式迁移(推荐)** 保留核心Django功能(如Admin后台、ORM),逐将API层替换为FastAPI: ```python # Django项目保持运行(端口8000) python manage.py runserver # 单独启动FastAPI服务(端口8001) from fastapi import FastAPI app = FastAPI() ``` - 优势:降低风险,新旧系统可并行运行 - 适用场景:大型项目迁移[^2] 2. **完全重构** 彻底重写所有功能到FastAPI,适合小型项目或需要全面异化的场景[^4]。 --- #### **二、关键组件迁移骤** 1. **路由与视图迁移** - Django视图 → FastAPI路由 ```python # Django视图示例 def user_detail(request, id): user = User.objects.get(id=id) return JsonResponse({'name': user.name}) # FastAPI等价实现 from fastapi import APIRouter router = APIRouter() @router.get("/user/{id}") async def get_user(id: int): user = await User.objects.aget(id=id) # 使用异ORM查询 return {"name": user.name} ``` 2. **数据处理迁移** - 用Pydantic替代Django表单: ```python from pydantic import BaseModel class UserCreate(BaseModel): name: str email: str @router.post("/users") async def create_user(user: UserCreate): new_user = await User.objects.acreate(**user.dict()) return {"id": new_user.id} ``` 3. **数据库整合** - 方案1:继续使用Django ORM(需异适配) ```python # 安装异支持包 pip install django-async-orm # 在FastAPI中复用Django模型 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") import django django.setup() from myapp.models import User ``` - 方案2:切换为SQLAlchemy/Tortoise ORM(需重写模型)[^4] --- #### **三、混合架构方案** 通过Django Ninja实现平滑过渡(推荐)[^3]: ```python # 在现有Django项目中添加FastAPI风格API from django_ninja import NinjaAPI from pydantic import BaseModel api = NinjaAPI() class UserResponse(BaseModel): name: str email: str @api.get("/user/{id}", response=UserResponse) def get_user(request, id: int): user = User.objects.get(id=id) return user # 自动序列化 ``` - **优点**: - 保留Django ORM和Admin - 获得FastAPI的自动文档(`/docs`)和验证 - 支持逐替换视图函数 --- #### **四、注意事项** 1. **异处理** FastAPI原生支持异,需将阻塞操作(如数据库查询)改为`async/await`语法。 2. **认证系统迁移** - Django Session → FastAPI的JWT/OAuth2 - 复用Django用户模型: ```python from django.contrib.auth import get_user_model User = get_user_model() ``` 3. **部署调整** - 使用ASGI服务器(Uvicorn/Hypercorn)替代WSGI - Nginx配置示例: ```nginx location /api/ { proxy_pass http://fastapi_server:8001; # FastAPI服务 } location / { proxy_pass http://django_server:8000; # 保留Django } ``` --- #### **五、工具推荐** 1. **自动化迁移** - 使用[`django-to-fastapi`](https://github.com/rednafi/django-to-fastapi)工具转换基础代码 2. **测试验证** - 用`TestClient`确保API行为一致: ```python from fastapi.testclient import TestClient client = TestClient(app) response = client.get("/user/1") ``` > **迁移决策树**: > └─ 保留Django Admin/ORM? → 选择**渐进迁移**或**Django Ninja** >    └─ 需要极致性能? → 选择**完全重构+ORM** --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值