Django项目仅展示上传字段,从OpenPGP密钥提取数据存入数据库
解决方案
1. 修改表单(forms.py)
只保留文件上传字段作为用户可见输入,其余字段由系统自动填充,无需用户输入:
from django import forms from .models import Users_Keys class KeyForm(forms.ModelForm): class Meta: model = Users_Keys fields = ('file_key',) # 仅保留文件上传字段
2. 修复并完善PGP密钥解析函数
原函数存在固定路径、字符串处理错误等问题,修改为接收上传文件对象,返回提取的邮箱和过期时间:
import datetime import gnupg def extract_gpg_info(file_obj): gpg = gnupg.GPG(gnupghome="/home/user/.gnupg") # 读取上传文件内容 file_content = file_obj.read().decode('utf-8') # 扫描密钥信息 import_result = gpg.scan_keys(file_content) if not import_result: raise ValueError("无法解析该PGP公钥文件") key_info = dict(import_result[0]) # 转换过期时间为DateField兼容的date对象 expires_timestamp = int(key_info.get('expires', 0)) time_expire = datetime.datetime.fromtimestamp(expires_timestamp).date() if expires_timestamp else None # 提取邮箱地址(从uid中直接解析,避免字符串拼接错误) uid_str = key_info['uids'][0] email_address = uid_str.split('<')[-1].split('>')[0] return email_address, time_expire
3. 重构视图逻辑(views.py)
表单验证通过后,先解析上传文件获取邮箱和时间,再手动创建模型对象存入数据库:
from django.shortcuts import render, redirect from .forms import KeyForm from .models import Users_Keys from .utils import extract_gpg_info # 若解析函数放在当前文件,可移除该行 def upload_key(request): if request.method == 'POST': form = KeyForm(request.POST, request.FILES) if form.is_valid(): uploaded_file = request.FILES['file_key'] try: # 提取密钥中的邮箱和过期时间 email, expire_date = extract_gpg_info(uploaded_file) # 创建并保存模型实例 user_key = Users_Keys( email=email, file_key=uploaded_file, date_time=expire_date ) user_key.save() return redirect('index') # 替换为你的成功页面路由名称 except ValueError as e: # 解析失败时给表单添加错误提示 form.add_error('file_key', str(e)) else: form = KeyForm() return render(request, 'upload.html', {'form': form})
4. 调整模板(upload.html)
仅渲染文件上传控件,避免显示其他字段:
{% extends 'background.html' %} {% block content %} <h2>上传PGP公钥</h2> <form method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ form.file_key.label_tag }} {{ form.file_key }} {% if form.file_key.errors %} <div class="text-danger"> {% for error in form.file_key.errors %} <p>{{ error }}</p> {% endfor %} </div> {% endif %} <button class="btn btn-outline-success mt-3" type="submit">上传</button> </form> {% endblock %}
额外注意事项
- 确保已安装依赖库:
pip install python-gnupg - 检查
gnupghome路径权限,确保Django进程可访问该目录 - 若密钥可能无过期时间,需将模型中
date_time字段改为允许空值:date_time = models.DateField(null=True, blank=True)
内容的提问来源于stack exchange,提问作者aquku
相关产品推荐
相关产品推荐

