如何在Django中运行加密函数并通过urls.py进行测试
解决Django加密函数测试与路由配置问题
一、修正现有代码的问题并编写测试视图
你的现有代码存在两个关键问题:
- 模块级别的
testaudio会在Django启动时仅执行一次,无法获取最新上传的音频数据; - 密钥
key = 'testing'长度仅7字节,不符合assert len(key) == key_bytes的16字节要求,会触发断言错误。
以下是修正后的完整代码:
# 导入必要依赖 from Crypto.Cipher import AES, Counter import binascii from Crypto.Random import Random from django.http import HttpResponse from .models import Audio_store key_bytes = 16 def encrypt(key, plaintext): assert len(key) == key_bytes, "密钥长度必须为16字节" # 生成随机初始化向量(IV) iv = Random.new().read(AES.block_size) iv_int = int(binascii.hexlify(iv), 16) ctr = Counter.new(AES.block_size * 8, initial_value=iv_int) # 创建AES-CTR加密器并加密 aes = AES.new(key, AES.MODE_CTR, counter=ctr) ciphertext = aes.encrypt(plaintext) return (iv, ciphertext) # 用于测试加密函数的视图 def test_encrypt(request): # 获取最新上传的音频数据(flat=True确保返回单个值而非元组) latest_audio_entry = Audio_store.objects.all().values_list('audio', flat=True).last() if not latest_audio_entry: return HttpResponse("未找到已上传的音频数据") # 补全密钥到16字节(测试用,正式环境请用安全方式管理密钥) key = 'testing123456789' try: # 处理FileField类型的音频字段:读取文件内容 if hasattr(latest_audio_entry, 'read'): plaintext = latest_audio_entry.read() else: plaintext = latest_audio_entry # 调用加密函数 iv, ciphertext = encrypt(key, plaintext) # 控制台打印调试信息 print(f"IV: {iv.hex()}") print(f"密文长度: {len(ciphertext)}") # 返回页面响应提示结果 return HttpResponse(f"加密成功!<br>IV(十六进制): {iv.hex()}<br>密文长度: {len(ciphertext)}") except AssertionError as e: return HttpResponse(f"参数错误:{str(e)}") except Exception as e: return HttpResponse(f"加密失败:{str(e)}")
二、配置urls.py路由
应用级urls.py(你的APP目录下)
添加测试路由映射:
from django.urls import path from . import views urlpatterns = [ # 保留你已有的其他路由 path('test-encrypt/', views.test_encrypt, name='test_encrypt'), ]
项目根urls.py
如果尚未包含应用路由,需添加如下配置(替换your_app_name为你的实际应用名称):
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('your-app-name/', include('your_app_name.urls')), ]
三、测试加密函数
- 确保已通过HTML页面上传过音频数据到
Audio_store模型; - 启动Django开发服务器:
python manage.py runserver; - 在浏览器访问:
http://localhost:8000/your-app-name/test-encrypt/(替换your-app-name为你的应用名); - 查看页面返回结果,同时观察终端控制台的打印信息,确认IV和密文是否正常生成。
额外注意事项
- 如果
Audio_store的audio字段是FileField,需确保读取文件内容的逻辑正确; - 测试用密钥仅作演示,正式环境请勿硬编码密钥,建议使用环境变量或加密配置文件管理;
- 可在
Audio_store模型中添加iv和ciphertext字段,用于存储加密后的结果以便后续解密。
内容的提问来源于stack exchange,提问作者HelpMePlease
相关产品推荐
相关产品推荐

