IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 2021-09-18 -> 正文阅读

[Python知识库]2021-09-18

django更改存储方式,实现连接sftp上传文件到其他服务器

下面只是简单地实现方法(demo),具体内容视自己需求具体使用

关于使用drf-yasg中的swagger实现能够上传文件的测试功能

需要在视图文件中使用解析器,为了更改上传文件的头部信息,重点在’parser_classes’ 详情,可以参考drf-yasg的git中issues,有相关内容,

安装django-storages:

? (django-storages封装了对python连接sftp的连接)

pip install django-storages

setting.py中配置SFTPStorages作为后端存储文件的方式

# 更改django的默认存储
DEFAULT_FILE_STORAGE = 'storages.backends.sftp.SFTPStorage'
# 配置sftp的服务器连接时的信息
SFTP_STORAGE_HOST = '10.69.39.25'
SFTP_STORAGE_ROOT = 'home/apadmin/'# 文件在sftp服务器上的存储位置
SFTP_STORAGE_PARAMS = {
    'username': 'ROOT',
    'password': 'ROOT',
    'allow_agent': False,# 禁用連接到SSH代理
    'look_for_keys': False,# 禁用搜索可發現的私鑰文件 ~/.ssh/
}
SFTP_STORAGE_INTERACTIVE = False # 一個布爾值,指示在無法使用密鑰建立連接時是否提示輸入密碼

配置model.py

from django.db import modelsfrom storages.backends.sftpstorage import SFTPStorage

# Create your models here.
# 导入存放文件的位置
from drf_vue_blog.settings import SFTP_STORAGE_ROOT
# SFTP 作为存储的方式
sftp = SFTPStorage()
class Test(models.Model):
    # 表中存放文件名字和文件路径,path指向sftp服务器存放路径
    filename = models.CharField(max_length=100,verbose_name='存放文件的名字',default='')
    filepath = models.FilePathField(path=SFTP_STORAGE_ROOT,default='', verbose_name='存放文件的路徑')

views.py

class TestView(APIView):
	parser_classes = (MultiPartParser,)
	@swagger_auto_schema(operation_description='Upload File',
                         operation_id='Upload File',
                         manual_parameters=[openapi.Parameter(name='file',
                                                              in_=openapi.IN_FORM,
                                                              type=openapi.TYPE_FILE,
                                                              required=True,
                                                              description='Upload File'),]
    def post(self,request):
	# 获取用户上传的文件
    obj = request.FILES.get('file')
    # file_path = os.path.join(obj.name)
    # f = open(file_path,'wb')
    # 打开文件循环写入到sftp服务器中
    f = sftp.sftp.open(obj.name,'wb')
    for i in obj.chunks():
        f.write(i)
    f.close()
    # 数据库表中插入数据,存放文件名字和路径位置
    Test.objects.create(filename=obj.name,
                        filepath=os.path.join(SFTP_STORAGE_ROOT,obj.name))
    
# urls.py
from django.contrib import admin
from django.urls import path, include

from article.views import TestView

urlpatterns = [
    # 上传文件到SFTP
    path('upload', TestView.as_view())
    # 下载文件从SFTP
    path('download',DownloadView.as_view())
]
class productpnserializer(serializers.Serializer):
    file_name = serializers.CharField(label='下載文件的名字', required=True)
class DownloadView(APIView):
    @swagger_auto_schema(query_serializer=productpnserializer,operation_summary='下載文件')
    def get(self,request):
        last = Test.objects.last()
        print(last.filename,last.filepath) # 通信錄更新.xlsx home/apadmin/通信錄更新.xlsx或者DRF.md home/apadmin/DRF.md
        
        
        file_name = request.query_params.get('file_name')
        if not file_name:
            pass
            # 邏輯處理
            # TODO

        # with sftp.sftp.open(file_name, 'rb') as f:

        response = FileResponse(sftp.sftp.open(file_name, 'rb'))
        response['Content-Type'] = 'application/octet-stream'
        # response['Content-Disposition'] = 'attachment;filename*=UTF-8"{}"'.format(escape_uri_path(file_name))
        response["Content-Disposition"] = "attachment; filename*=UTF-8''{}".format(escape_uri_path(file_name))
        return response
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:56:01  更:2021-09-19 07:58:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:34:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码