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

Python使用format向字符串传参 Django配置URL报错解决

报错根因

错误出在settings.py的配置写法:你在配置加载阶段就对URL字符串调用了.format()方法尝试传参,但Django启动加载settings文件时,当前作用域内根本不存在key、phone、otp三个变量,自然会抛出未解析引用的错误。
配置文件只应该存放静态常量、模板字符串这类加载阶段就能确定值的内容,动态参数填充的逻辑必须放到实际执行业务的代码段中。

正确实现步骤

1. 修改settings.py配置

删除URL后面提前调用的.format()部分,只保留带占位符的URL模板即可:

# settings.py
KAVENEGAR_URL = "https://api.kavenegar.com/v1/{key}/verify/lookup.json?receptor={phone}&token={otp}"

2. 修正service.py的业务逻辑

注意两点:一是补上缺失的requests导入、如果APICallError自定义异常未定义需要提前声明;二是格式化URL时优先用关键字参数传值,避免位置参数顺序错配导致URL拼接错误:

# service.py
import requests
from django.conf import settings

# 自定义接口调用异常,若已有定义可忽略这段
class APICallError(Exception):
    pass

def send_otp_sms(key, phone, otp):
    kavenegar_url = settings.KAVENEGAR_URL.format(
        key=key,
        phone=phone,
        otp=otp
    )
    response = requests.post(kavenegar_url)
    if response.status_code != 200:
        raise APICallError(f"短信接口请求失败,状态码:{response.status_code}, 返回:{response.text}")
    return response
优化建议
  • 字符串格式化优先使用关键字参数而非位置参数,后续如果调整URL模板的占位符顺序,不需要修改业务层的传参顺序,容错率更高
  • 生产环境建议给requests请求加超时时间,避免接口无响应时进程卡死:response = requests.post(kavenegar_url, timeout=10)
  • 敏感参数比如Kavenegar的API key不要硬编码在settings.py里,建议存到环境变量中读取,避免密钥泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:27:45