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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:50:27