Django实现文件上传、文件列表查看、修改、限流和日志记录1
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/
通过访问http://localhost:8000/upload/来上传文件到远程服务器的/data目录了。如果选择了文件进行上传,会将文件名记录在日志文件中,并在页面上显示上传成功的提示信息。如果没有选择文件或选择了空文件,会显示相应的错误信息。
上传文件及验证
至此,一个简单的文件上传功能已经实现,并且上传到远程服务器上指定/data目录。
后续改进优化功能
1、使用更安全的服务器秘钥连接
2、查看上传文件
3、修改上传文件
4、用户认证功能
5、日志记录功能
6、实现上传文件列表功能
7、接口限流功能【用户、IP等】
8、相关报错总结