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

如何在Factory Boy中伪造Base64编码字符串?已遇多类报错

在Factory Boy中生成Base64编码字符串

核心实现方案

直接利用Factory Boy的LazyAttribute结合Faker生成随机文本,再经过Base64编码后转成字符串(适配Django的CharField要求):

import base64
import factory
from faker import Faker
from your_app.models import YourModel

fake = Faker()

class YourModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = YourModel

    name = factory.Faker("name")
    email = factory.Faker("email")
    # 生成符合要求的Base64编码字符串
    encoded_string = factory.LazyAttribute(lambda _: base64.b64encode(
        fake.text(max_nb_chars=380).encode('utf-8')
    ).decode('utf-8'))

你之前报错的原因

  • UnicodeDecodeError:base64.b64encode返回的是bytes类型,而Django的CharField要求传入字符串。直接赋值bytes对象会触发Django自动用utf-8解码,但Base64字节流并非所有场景都能被正确解码,所以必须手动调用.decode('utf-8')转成字符串。
  • binascii.Error:大概率是你直接将未解码的bytes对象当作字符串使用,或处理过程中截断了Base64字符串,导致其长度不符合Base64编码的4倍数规则。

进阶:生成结构化数据的Base64编码

如果需要生成类似JSON结构的Base64内容(比如你尝试的键值对),可以先构造结构化数据再编码:

import json

encoded_string = factory.LazyAttribute(lambda _: base64.b64encode(
    json.dumps({
        "key": fake.word(),
        "value": fake.sentence()
    }).encode('utf-8')
).decode('utf-8'))

注意事项

  • 控制原始文本长度:Base64编码后长度约为原始的1.33倍,你的CharField最大长度是512,所以原始文本长度建议不超过380(380*1.33≈505),避免超出字段限制。
  • 支持空值:如果字段允许null或blank,可以用factory.Maybe随机生成空值:
encoded_string = factory.Maybe(
    factory.Faker('boolean'),
    yes_declaration=factory.LazyAttribute(lambda _: base64.b64encode(
        fake.text(max_nb_chars=380).encode('utf-8')
    ).decode('utf-8')),
    no_declaration=None
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:53:34