在Django中调用Replicate API的i2vgen-xl模型上传本地图片报错求助
问题解决步骤
错误原因分析
- input: prompt is required:i2vgen-xl模型必须传入
prompt参数,你的请求未提供该必填项。 - input.image: Does not match format 'uri':你传入的图片路径格式错误(包含多余单引号),且Replicate API要求图片参数为合法URI(可传入本地文件绝对路径或直接传入文件对象)。
具体修复方案
1. 补充必填的prompt参数
先确保表单包含prompt输入字段(如果你的ImageForm还没有,需添加):
# forms.py 示例代码 from django import forms class ImageForm(forms.Form): Image = forms.ImageField() prompt = forms.CharField(label="提示词", max_length=200)
2. 修正图片参数格式
Replicate的Python客户端支持直接传入本地文件对象或绝对路径,以下两种方式任选其一:
方式一:使用已保存图片的绝对路径
def X(request): form = ImageForm() if request.method == 'POST': form = ImageForm(request.POST, request.FILES) if form.is_valid(): # 保存表单并获取实例 instance = form.save() # 获取图片的绝对路径 image_path = instance.Image.path # 设置API Token(建议放到settings.py中,不要硬编码) os.environ["REPLICATE_API_TOKEN"] = "你的API Token" # 调用模型,补充必填的prompt参数 output = replicate.run( "ali-vilab/i2vgen-xl:5821a338d00033abaaba89080a17eb8783d9a17ed710a6b4246a18e0900ccad4", input={ "image": open(image_path, "rb"), # 以二进制模式打开文件并传入 "prompt": form.cleaned_data['prompt'] } ) print(output) else: print("表单验证失败") return render(request, "img2vid.html", {'form': form})
方式二:直接使用上传的文件对象(无需提前保存到本地)
如果不需要持久化保存图片,可以直接用表单中的文件对象:
def X(request): form = ImageForm() if request.method == 'POST': form = ImageForm(request.POST, request.FILES) if form.is_valid(): os.environ["REPLICATE_API_TOKEN"] = "你的API Token" # 从表单直接获取文件和提示词 image_file = form.cleaned_data['Image'] prompt = form.cleaned_data['prompt'] # 调用模型 output = replicate.run( "ali-vilab/i2vgen-xl:5821a338d00033abaaba89080a17eb8783d9a17ed710a6b4246a18e0900ccad4", input={ "image": image_file, "prompt": prompt } ) print(output) # 如果需要保存表单,取消下面注释 # form.save() else: print("表单验证失败") return render(request, "img2vid.html", {'form': form})
3. 额外注意事项
- API Token不要硬编码:建议把
REPLICATE_API_TOKEN放到Django的settings.py中,示例:
然后在视图中通过# settings.py import os REPLICATE_API_TOKEN = os.environ.get("REPLICATE_API_TOKEN", "你的默认Token")os.environ["REPLICATE_API_TOKEN"] = settings.REPLICATE_API_TOKEN引用。 - 避免手动拼接路径:不要用字符串硬编码路径,优先使用模型实例的
path属性或os.path.join构建路径,避免跨平台兼容问题。
内容的提问来源于stack exchange,提问作者Pv33_
相关产品推荐
相关产品推荐

