返回顶部

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、相关报错总结

 

 

 

 

 

 

 

 

 

 

posted @ 2023-08-13 16:04  九尾cat  阅读(247)  评论(0编辑  收藏  举报