一、环境准备
使用Ubuntu 22.04 LTS系统,执行以下命令安装基础依赖:
```bash
sudo apt update && sudo apt install -y python3.10 python3-pip
pip install django djangorestframework
```
注意:国内用户可执行pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple加速包下载,确保网络畅通。
二、项目初始化与配置
1. 创建Django项目与应用
在指定目录执行以下命令生成项目结构:
```bash
django-admin startproject e_archives
cd e_archives
python manage.py startapp archive
```
2. 核心配置文件修改
完整替换e_archives/settings.py内容,配置权限、媒体存储、时区:
```python
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'django-insecure-safe-key-keep-it-private'
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'archive',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'e_archives.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'e_archives.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = True
STATIC_URL = 'static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
```
重点:配置媒体文件存储路径,确保档案上传后持久化存储,权限控制仅允许登录用户操作。
三、核心功能开发(含四性检测逻辑)
1. 定义电子档案模型
替换archive/models.py,新增四性检测字段:
```python
from django.db import models
from django.contrib.auth.models import User
class ElectronicArchive(models.Model):
file = models.FileField(upload_to='archives/')
file_hash = models.CharField(max_length=64, unique=True)
original_filename = models.CharField(max_length=255)
file_size = models.BigIntegerField()
create_time = models.DateTimeField(auto_now_add=True)
is_real = models.BooleanField(default=False) 真实性
is_complete = models.BooleanField(default=False) 完整性
is_usable = models.BooleanField(default=False) 可用性
is_secure = models.BooleanField(default=False) 安全性
upload_user = models.ForeignKey(User, on_delete=models.CASCADE)
```
2. 序列化器与视图逻辑
新建archive/serializers.py,定义档案序列化规则:
```python
from rest_framework import serializers
from .models import ElectronicArchive
class ArchiveSerializer(serializers.ModelSerializer):
class Meta:
model = ElectronicArchive
fields = '__all__'
read_only_fields = ['file_hash', 'is_real', 'is_complete', 'is_usable', 'is_secure']
```
替换archive/views.py,实现文件上传、哈希计算、四性检测:
```python
import hashlib
import os
from django.conf import settings
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import ElectronicArchive
from .serializers import ArchiveSerializer
class ArchiveViewSet(viewsets.ModelViewSet):
queryset = ElectronicArchive.objects.all()
serializer_class = ArchiveSerializer
def perform_create(self, serializer):
file = self.request.FILES['file']
计算SHA-256哈希(真实性校验核心)
hash_obj = hashlib.sha256()
for chunk in file.chunks():
hash_obj.update(chunk)
file_hash = hash_obj.hexdigest()
保存档案基础元数据
serializer.save(
file=file,
file_hash=file_hash,
original_filename=file.name,
file_size=file.size,
upload_user=self.request.user
)
执行四性检测
archive = serializer.instance
真实性:系统内无相同哈希则有效
archive.is_real = not ElectronicArchive.objects.filter(file_hash=file_hash).exclude(pk=archive.pk).exists()
完整性:文件非空且哈希生成成功
archive.is_complete = (file.size > 0) and (len(file_hash) == 64)
可用性:仅允许指定格式
allowed_formats = ['.pdf', '.doc', '.docx', '.jpg', '.png']
ext = os.path.splitext(file.name)[1].lower()
archive.is_usable = ext in allowed_formats
安全性:大小≤10MB且无恶意后缀
forbidden_exts = ['.exe', '.bat', '.sh', '.dll']
archive.is_secure = (file.size <= 10485760) and (ext not in forbidden_exts)
archive.save()
自定义接口:查询四性检测结果
@action(detail=True, methods=['get'])
def check_results(self, request, pk=None):
archive = self.get_object()
return Response({
'真实性': archive.is_real,
'完整性': archive.is_complete,
'可用性': archive.is_usable,
'安全性': archive.is_secure
})
```
3. 配置路由

替换e_archives/urls.py,绑定API路由:
```python
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from archive.views import ArchiveViewSet
from django.conf import settings
from django.conf.urls.static import static
router = DefaultRouter()
router.register(r'archive', ArchiveViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(router.urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
四、启动与功能测试
1. 初始化数据库
依次执行以下命令生成数据表:
```bash
python manage.py makemigrations
python manage.py migrate
```
2. 创建超级用户
按提示输入用户名、密码、邮箱,用于登录后台管理:
```bash
python manage.py createsuperuser
```
3. 启动服务
```bash
python manage.py runserver 0.0.0.0:8000
```
4. 验证四性检测
1. 访问http://127.0.0.1:8000/admin,用超级用户登录;
2. 点击「电子档案」→「添加」,上传符合要求的文件;
3. 访问http://127.0.0.1:8000/api/archive/,找到对应档案ID;
4. 访问http://127.0.0.1:8000/api/archive/[档案ID]/check_results,查看四性检测结果。
可调整项:修改archive/views.py中的allowed_formats、forbidden_exts和文件大小,可自定义检测规则。