You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Vercel部署Flask星标徽章应用遭遇404错误求助

排查Vercel部署Flask星标徽章应用的404错误

问题概述

在Vercel部署了一款用于生成GitHub仓库星标数量SVG徽章的Flask应用,访问时出现404错误,无法正常生成目标徽章(如Microsoft/VsCode仓库的星标徽章)。

项目文件详情

main.py(存放于dynamicBadges目录)

import requests
from flask import Flask, Response

app = Flask(__name__, template_folder='dynamicBadges/templateFiles', static_folder='dynamicBadges/staticFiles')

# VARIANT 1 ----------------------------------------------------------------
variant_1 = ['#B02E26', '#974800', '#8E7500', '3F6900', '#4B6700', '#00696A', '#4B53B9', '#006493', '#8A33B8', '#9E2A99', '#99405E', '#1B1B1B']
on_variant_1 = '#FFF'

# VARIANT 2 ----------------------------------------------------------------
variant_2 = ['#FFB4AA', '#FFB689', '#E9C327', '#92DA35', '#AFD364', '#4CDADB', '#BEC2FF', '#8DCDFF', '#E8B3FF', '#FFABF1', '#FFB1C5', '#C6C6C6']
on_variant_2 = ['#690004', '#512400', '#3B2F00', '#1F3700', '#253600', '#003737', '#181F89', '#00344F', '#500075', '#5C005A', '#5E1130', '#303030']

# VARIANT 3 ----------------------------------------------------------------
variant_3 = ['#FFDAD5', '#FFDBC7', '#FFE177', '#ACF850', '#CAF07D', '#6FF6F7', '#E0E0FF', '#CAE6FF', '#F6D9FF', '#FFD7F4', '#FFD9E1', '#E2E2E2']
on_variant_3 = ['#410001', '#311300', '#231B00', '#102000', '#141F00', '#002020', '#00036B', '#001E30', '#310049', '#380037', '#3F001B', '#1B1B1B']

@app.route('/badge/stars/<style>/<variant>/<username>/<repo>')
def github_stars_badge(style, variant, username, repo):
    url = f'https://api.github.com/repos/{username}/{repo}'
    headers = {'Accept': 'application/vnd.github.v3+json'}
    r = requests.get(url, headers=headers)
    if r.ok:
        index = int(style) - 1

        if variant == '1':
            background = variant_1[index]
            foreground = on_variant_1
        if variant == '2':
            background = variant_2[index]
            foreground = on_variant_2[index]
        if variant == '3':
            background = variant_3[index]
            foreground = on_variant_3[index]

        data = r.json()
        stars = data['stargazers_count']

        if len(str(stars)) == 1:
            width = 20 + 68
        elif len(str(stars)) == 2:
            width = 2 * 16 + 68
        elif len(str(stars)) == 3:
            width = 3 * 14 + 68
        elif len(str(stars)) == 4:
            width = 4 * 13 + 68
        else:
            width = len(str(stars)) * 13 + 68
        
        svg = f'<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="30" fill="{background}" rx="15"><path d="M40 0h4v20h-4z" fill="#4c1"/><rect rx="15" width="{width}" height="30" fill="{background}"/><text x="11" y="22" fill="{foreground}" font-size="20" font-family="Product Sans">Stars : {stars}</text></svg>'
        return Response(svg, mimetype='image/svg+xml')
    else:
        return 'Error', r.status_code

vercel.json(存放于项目根目录)

{
    "version": 2,
    "builds": [
    {
        "src": "dynamicBadges",
        "use": "@vercel/python",
        "config": {
        "maxLambdaSize": "15mb"
        }
    }
    ],
    "routes": [
    {
        "src": "/badge/stars/(.*)/(.*)/(.*)/(.*)",
        "dest": "dynamicBadges/main.py"
    }
    ]
}

requirements.txt(存放于项目根目录)

Flask==2.3.2

错误排查与修复方案

1. 修正vercel.json配置

Vercel的Python构建器需要明确指定Flask应用的入口文件而非目录,同时路由的dest路径需添加前缀/:

{
    "version": 2,
    "builds": [
        {
            "src": "dynamicBadges/main.py",
            "use": "@vercel/python",
            "config": {
                "maxLambdaSize": "15mb"
            }
        }
    ],
    "routes": [
        {
            "src": "/badge/stars/(.*)/(.*)/(.*)/(.*)",
            "dest": "/dynamicBadges/main.py"
        }
    ]
}

2. 完善main.py的兼容性与错误处理

  • 修复颜色值缺失#的问题:将variant_1中的'3F6900'改为'#3F6900'
  • 添加WSGI入口适配Vercel运行环境:在文件末尾添加
if __name__ == '__main__':
    app.run()
else:
    application = app
  • 增加参数合法性校验避免索引越界:在index = int(style) - 1后添加
if index < 0 or index >= len(variant_1):
    return 'Invalid style parameter', 400

3. 补充依赖库

代码中使用了requests库但未在requirements.txt中声明,需添加:

Flask==2.3.2
requests==2.31.0

4. 测试访问路径

部署完成后,访问示例路径:/badge/stars/1/1/microsoft/vscode,验证是否能正常生成SVG徽章。

内容的提问来源于stack exchange,提问作者Dolium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:07:10