Django实现文件上传、文件列表查看、修改、限流和日志记录 1
上一章已经实现了文件的上传到项目的指定目录中,这章我们继续乘胜追击继续优化实现。 一般都是上传文件到后端服务器上,因此需要建立一个远程服务器的连接,本章连接远程服务器实现文件上传 实现点击上传本地文件到远程服务器的/data目录,判断文件是否为空,为空返回提交页面,不为空提交上传文件,并添加日志和登录
安装Django和paramiko库
pip install Django paramiko
创建项目
创建一个Django项目并进入项目目录
django-admin startproject file_upload
cd file_upload
创建应用
创建一个Django应用:
python manage.py startapp file_upload_app
添加应用
在file_upload/settings.py文件中,将file_upload_app添加到INSTALLED_APPS列表中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'file_upload_app',
]
添加路由映射
在file_upload/urls.py文件中,添加文件上传的URL映射:
from django.contrib import admin
from django.urls import path
from file_upload_app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('upload/', views.upload_file, name='upload'),
]
编写上传视图函数
在file_upload_app/views.py文件中,编写文件上传的视图函数
from django.shortcuts import render
# Create your views here.
import os
from django.utils import timezone
from django.shortcuts import render, redirect
from django.conf import settings
from django.contrib import messages
import paramiko
import tempfile
def upload_file(request):
if request.method == 'POST':
file = request.FILES.get('file')
if file:
# 连接远程服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# ssh.connect('remote_server_ip', username='username', password='password')
ssh.connect('10.0.0.127', username='root', password='123456')
try:
# 创建临时文件
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
# 将上传的文件内容写入临时文件
for chunk in file.chunks():
temp_file.write(chunk)
temp_file.seek(0) # 将文件指针移动到文件开头
# 上传临时文件到远程服务器的/data目录
sftp = ssh.open_sftp()
# sftp.put(temp_file.name, '/data/' + file.name)
sftp.putfo(temp_file, '/data/' + file.name)
sftp.close()
ssh.close()
# 添加日志
log_file_path = '/git/Python/file_upload/file_upload_app/app.log' # 修改为你的日志文件路径
with open(log_file_path, 'a') as log_file:
# log_file.write('Uploaded file: {}\n'.format(file.name))
log_file.write('[{}] Uploaded file: {} by {}\n'.format(timezone.now(), file.name, request.user.username))
log_file.close()
messages.success(request, '文件上传成功')
return redirect('upload') # 重定向到上传页面
except Exception as e:
messages.error(request, '文件上传失败:{}'.format(str(e)))
else:
messages.error(request, '请选择要上传的文件')
return render(request, 'upload.html')
模板文件
在file_upload_app/templates/upload.html文件中,编写文件上传的HTML模板:
base.html
在file_upload_app/templates/base.html文件中,编写基础模板:
<!DOCTYPE html>
<html>
<head>
<title>文件上传</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
upload.html
{% extends 'base.html' %}
{% block content %}
<h2>文件上传</h2>
{% for message in messages %}
<div>{{ message }}</div>
{% endfor %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file">
<button type="submit">上传</button>
</form>
{% endblock %}
运行Django
python manage.py runserver
#访问地址
http://localhost:8000/upload/
上传文件及验证
至此,一个简单的文件上传功能已经实现,并且上传到远程服务器上指定/data目录。
后续改进优化功能
1、使用更安全的服务器秘钥连接
2、查看上传文件
3、修改上传文件
4、用户认证功能
5、日志记录功能
6、实现上传文件列表功能
7、接口限流功能【用户、IP等】
8、相关报错总结