
Python 3.6+ 推荐使用 f-string 替代 .format() 进行字符串插值,它语法更简洁、性能更优,且在模板字符串中天然避免因参数缺失或顺序错误导致的运行时异常。
python 3.6+ 推荐使用 f-string 替代 `.format()` 进行字符串插值,它语法更简洁、性能更优,且在模板字符串中天然避免因参数缺失或顺序错误导致的运行时异常。
在 Django 或其他 Web 框架中构建 HTTP 响应头(如 Content-Disposition)时,常需动态插入文件名。原代码使用 .format() 方法拼接字符串,不仅冗长,还存在潜在的安全与可维护性风险(例如未转义特殊字符可能引发响应头注入)。而 f-string 不仅语义清晰、执行更快,还能通过表达式内联提升可读性。
以下是重构后的完整示例:
def write_xlsx_response(self, queryset):
response = HttpResponse(
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
# ✅ 使用 f-string 替代 .format()
response["Content-Disposition"] = f'attachment; filename="{self.get_filename()}.xlsx"'
export_xlsx_assessment(queryset, response)
return response
def write_csv_response(self, queryset):
response = HttpResponse(content_type="text/csv") # ⚠️ 注意:标准 MIME 类型应为 "text/csv",非 "application/CSV"
response["Content-Disposition"] = f'attachment; filename="{self.get_filename()}.csv"'
export_csv_assessment(queryset, response)
return response关键改进说明:
- ✅ 语法简化:f'...{expr}...' 直接嵌入方法调用,无需额外参数占位与传参;
- ✅ 性能提升:f-string 在编译期解析,比运行时调用 .format() 快约 20–30%;
- ⚠️ 安全性注意:self.get_filename() 返回值若含双引号、分号或换行符,仍可能导致 HTTP 响应头污染。生产环境建议进一步清理文件名,例如:
from django.utils.text import get_valid_filename safe_name = get_valid_filename(self.get_filename()) response["Content-Disposition"] = f'attachment; filename="{safe_name}.csv"' - ? MIME 类型修正:"application/CSV" 非标准写法,应统一为 "text/csv"(RFC 4180),确保客户端正确识别。
综上,迁移至 f-string 是低风险、高收益的现代化改造,推荐在所有支持 Python 3.6+ 的项目中全面采用,并结合输入校验保障响应头安全。

















