使用FastApi构建python后端,并部署在免费服务器Render/Replit上

本文仅作本人初学后端教程笔记,实现了使用python写一个简单的查询、带参数查询、上传图片并返回图片参数、模拟登录的api。实现好之后可以在本地测试,亦或部署在免费服务器比如Render/Replit。

本文共 940 字,阅读时间大约5分钟,上手操作时间约30-60分钟。

本文的撰写离不开ChatGPT 4o的帮助,我也是从0后端基础开始的。

1.使用FastApi编写api

🚀 为什么用 FastAPI 更合适?

复制代码
写接口更快,更强类型,更现代化

文档自动生成,无需额外工具

性能超高,生产级别部署没压力

未来你要对接前端、移动端、别的系统,直接/docs 就能用!

首先我们先用FastApi写

  1. 最简单的查询,不带任何参数。比如get-time,发送请求,服务器返回服务器的时间。

  2. 带参数的查询,带一个参数传入。比如get-temperature,需要传入city参数。

  3. 带有附件的post提交,比如get-image-info,需要传入本地的图片,返回服务器处理后的数据。

  4. 模拟登录,比如login,输入用户名密码,返回登陆的信息。

    from fastapi import FastAPI, Query, File, UploadFile, Form, HTTPException
    from fastapi.middleware.cors import CORSMiddleware
    import random
    from datetime import datetime
    from PIL import Image
    import io
    from pydantic import BaseModel
    import uvicorn

    app = FastAPI()

    if name == 'main':
    uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True)

    可选:允许跨域(前端访问用)

    app.add_middleware(
    CORSMiddleware,
    allow_origins=[""], # 或指定你的前端域名
    allow_credentials=True,
    allow_methods=["
    "],
    allow_headers=["*"],
    )

    @app.get("/get-time")
    def get_temperature():
    timestamp = datetime.now().isoformat()
    return{
    "timestamp": timestamp
    }

    @app.get("/get-temperature")
    def get_temperature(city: str = Query(..., description="城市名称")):
    temperature = round(random.uniform(32, 36.5), 2)
    timestamp = datetime.now().isoformat()
    return{
    "city": city,
    "temperature": temperature,
    "timestamp": timestamp
    }

    @app.post("/get-image-info")
    async def get_image_info(file: UploadFile = File(...)):
    contents = await file.read()

    复制代码
     try:
         # 使用 PIL 解析图片尺寸
         image = Image.open(io.BytesIO(contents))
         width, height = image.size
    
         return {
             "filename": file.filename,
             "width": width,
             "height": height
         }
     except Exception as e:
         return {
             "error": "无法识别图片",
             "detail": str(e)
         }

    模拟数据库中的用户信息(实际应查数据库)

    fake_user_db = {
    "vincent": {
    "username": "vincent",
    "password": "123456", # 实际应加密存储
    "full_name": "Vincent Wang"
    }
    }

    登录返回模型

    class LoginResponse(BaseModel):
    message: str
    token: str = None
    full_name: str = None

    @app.post("/login", response_model=LoginResponse)
    async def login(username: str = Form(...), password: str = Form(...)):
    user = fake_user_db.get(username)
    if not user or user["password"] != password:
    raise HTTPException(status_code=401, detail="用户名或密码错误")

    复制代码
     # 模拟生成 token(实际应用 JWT 等)
     token = f"token-{username}"
    
     return {
         "message": "登录成功",
         "token": token,
         "full_name": user["full_name"]
     }

2. 上传代码到Github

在Github上新建一个仓库,上传刚才的代码。

  1. 注册使用replit免费服务器
    登录https://replit.com/注册账号,点击左上角Import code or design,

    选择Github源

选择后点击导入即可。

Replit会自动识别启动命令,确认。

然后点击最上面的Run即可运行。

4. 测试API

部署好运行之后即可测试api。在地址栏输入api

这个面板无法测试比如上传附件的post,那么可以用postman测试。

这个时候就需要一个临时的外网地址。点击地址栏左侧的复制地址按钮

在弹出的界面copy dev接口地址。

打开 Postman,新建一个请求。

请求方法选择:POST

请求 URL 填写:
https://9a094bdd-2c2b-4380-b7b5-b296f117cd48-00-3b1dquurmhoxv.janeway.replit.dev/

切换到 Body 标签页,选择 form-data。

在下面的表格里添加一个参数:

Key:file(必须和你 FastAPI 里函数参数名一致)

Type:选择 File

Value:选择一张本地图片文件

5. render.com也可以

https://render.com/