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
相关产品推荐
相关产品推荐

