8. Django系列之上传文件与下载-djang为服务端,requests为客户端

摘要:
preface运维平台新上线一个探测功能,需要上传文件到服务器上和下载文件从服务器上,那么我们就看看requests作为客户端,django作为服务器端怎么去处理?对于静态文件我们不建议通过django下载,而是建议通过django返回一个重定向URL给client,这个url是nginx提供下载,众所周知,nginx是非常牛逼的静态web-server。以下代码都是简单的代码,可以正常使用,只是实现最基本的要上传文件到服务器上和下载文件从服务器上,不涉及到公司的业务逻辑。

preface

运维平台新上线一个探测功能,需要上传文件到服务器上和下载文件从服务器上,那么我们就看看requests作为客户端,django作为服务器端怎么去处理? 对于静态文件我们不建议通过django下载,而是建议通过django返回一个重定向URL(下载文件的URL)给client,这个url是nginx提供下载,众所周知,nginx是非常牛逼的静态web-server。
以下代码都是简单的代码,可以正常使用,只是实现最基本的要上传文件到服务器上和下载文件从服务器上,不涉及到公司的业务逻辑。文件可以通过md5校验,反正我测试都是一致的MD5值。

Author:温柔易淡

代码如下

使用的python2.7的版本,其他的如果没有做特殊说明是python2.7的版本,那么我的其他博客都是python3.5的版本

  1. 先看客户端的代码:
#!/usr/bin/env python
# encode:utf-8
import requests

def post_file():   #文件上传(post方法)
    post_url='http://127.0.0.1/file/post/'

    data=[]
    fr=open(r'/tmp/Python-2.7.13.tgz','rb')
    file = {'file':('Python-2.7.13.tgz',open(r'/tmp/Python-2.7.13.tgz','rb'),'application/x-tar')}
    m = {'act': 'avatar', 'save': '1'}


    rt =requests.post(url=post_url,files=file,data=m)
    print(rt.status_code,rt.text)

def get_file():   #文件下载(get方法)
    get_url = 'http://127.0.0.1/file/get/'
    get_params = {'filename':'Python-2.7.13.tgz'}
    rt = requests.get(url=get_url,params=get_params)
    with open('/tmp/vmware-root/Python-2.7.13.tgz','wb') as f:
        # it's not img or others and so on ,if it is ,we need to use BytesIO to save
        # for example:
        #   from io import BytesIO
        #   i = Image.open(BytesIO(r.content))  # r is a  return object

        for chunk in rt.iter_content():
            f.write(chunk)
    print('ok')

#post_file()
get_file()
  1. 再看服务器端的代码:
from django.shortcuts import render,HttpResponse
from django.http import StreamingHttpResponse

# Create your views here.


def file_get(request):   #文件下载(get方法)
    print(request.GET)
    file_name = request.GET.get('filename')
    file_path = "/root/%s"%(file_name)

    def file_read(file_name,chunk_size=1024):
        # itertor return the file's chunk, if the file size is very large,it must be useful, so server won't OOM 
        with open(file_name,'rb') as f:
            while True:
                chunks = f.read(chunk_size)
                if chunks:
                    print(chunks)
                    yield chunks
                else:
                    break

    response_data = StreamingHttpResponse(file_read(file_path))
    response_data['Content-Type'] = 'application/octet-stream'   # set the type as stream then PC will save it in their disk
    response_data['Content-Disposition'] = 'attachment;filename="%s"'%(file_name)   # set the file name

    return response_data

def file_post(request):  
    print(request.POST,request.FILES)
    file_obj = request.FILES.get('file')
    print(type(file_obj))
    if file_obj:
        save_file_path='/root/%s'%(file_obj.name)
        with open(save_file_path,'wb') as f:
            for chunks in file_obj.chunks():
                f.write(chunks)

    return HttpResponse('ok')

其他的url代码就不赘述了。

免责声明:文章转载自《8. Django系列之上传文件与下载-djang为服务端,requests为客户端》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle 建库SAP-Function下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django model update的各种用法介绍

Django开发过程中对表(model)的增删改查是最常用的功能之一,本文介绍笔者在使用model update过程中遇到的那些事 model update常规用法 假如我们的表结构是这样的 class User(models.Model): username = models.CharField(max_length=255, unique=Tr...

Django多级评论

一、原理 #多级评论原理简单原理,弄完之后发现基础白学了 msg_list = [ {'id':1,'content':'xxx','parent_id':None}, {'id':2,'content':'xxx','parent_id':None}, {'id':3,'content':'xxx','parent_id':Non...

操蛋的Django model------select_related() 主要用于一对一和一对多

实例: 创建表,表都是一对一,一对多 class Province(models.Model): name = models.CharField(max_length=10) class City(models.Model): name = models.CharField(max_length=5) province = mode...

Channels集成到Django消息实时推送

channel架构图 InterFace Server:负责对协议进行解析,将不同的协议分发到不同的Channel Channel Layer:频道层,可以是一个FIFO队列,通常使用Redis Django中配置Channel: CHANNEL_LAYERS的配置: CHANNEL_LAYERS = { "default": {...

django 多表操作

三种关系 一对一,一对多,多对多 创建表 1 一对一 2 xx = models.OneToOneField(to='表名',to_field='字段名',on_delete=models.CASCADE) #删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级...

django-admin.py创建项目失败解决方法

环境:Ubuntu、python2.7、django1.9.5 当用django-admin.py startproject projectName创建对应的django项目时出现command not found: django-admin.py情况的解决方案: 找到对应的文件django-admin.py的路径:            如图运行相关命令...