说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :Django项目之Web端电商网站的实战开发(三)_cdtaogang's blog-优快云博客
目录
一丶Windows环境下安装FastDFS_Client
1.在windows环境下直接使用pip install fdfs-client-py进行安装则会出现以下提示
2.在windows环境下需进行如下安装
- step1 下载fdfs_client包百度网盘,提取码moz7
- step2 将解压之后的fdfs_client文件夹copy到python解释器下的Lib目录中
- step3 进入fdfs_client目录,编辑storage_client.py文件,将第12行代码注释(避免提示ImportError: No module named sendfile错误信息)
- step4 安装mutagen
- step5 安装requests
- step6 在解释器目录下新建logs文件夹,用于存放fdfs客户端日志文件
- step7 修改fdfs配置文件client.conf,需要注意的是base_path的路径是在以client.conf为起始路径进行查找的
- step8 回到虚拟机ubuntu(192.168.1.10),开启fdfs服务以及nginx服务
- step9 进行上传文件测试,打开cmd命令窗口,进行python2环境(博主将一个水果图片直接放在D盘中然后进行此图片上传操作),配置文件路径以及要上传的文件路径均为绝对路径
from fdfs_client.client import Fdfs_client
client = Fdfs_client(r"D:\Python27\Lib\fdfs_client\client.conf")
client.upload_by_filename(r"D:\goods.jpg")
- step10 上传成功后,返回文件id,在windows浏览器中直接访问ubuntu电脑的ip(也就是nginx服务器的ip端口,然后nginx再去到fdfs系统中获取对应文件id的文件,最后返回给浏览器,最后浏览器将该文件渲染出来,最终显示出图片)http://192.168.1.10:8888/group1//M00/00/00/wKgBClygfSuAO8GOAAAX1PFRdzg942.jpg,如下图可以看见响应报头中的server为在ubuntu中安装的nginx版本
- step11 同样的在ubuntu系统中访问该上传成功的文件id,一样成功的在浏览器中显示出来(这里的IP就要写本地的IP)
二丶Django二次开发对接FastDFS
1.项目中使用上传图片使用图片流程图
2.更改django默认上传文件的存储方式 ,django站点管理中进行文件的上传默认使用的是FileSystemStorage类,这个类在本地文件系统上实现了基本的文件存储功能,它继承自Storage类 ,并且提供父类的所有公共方法的实现,所以可以定义一个类来继承Storage类,重写这个类中方法来实现更改django的默认存储方式,可以参考django的API文档
3.编写一个自定义存储系统,
- step1 自定义的存储系统必须为
Django.core.files.storage.Storage
的一个子类
from django.core.files.storage import Storage
class MyStorage(Storage):
...
- step2 在你的存储类中,除了其他自定义的方法外,还必须实现
_open()打开文件
以及_save()保存文件
方法,如果你的类提供了本地文件存储,它必须重载path()
方法 - step3 在项目utils目录下创建一个fdfs的python包,并在这个包下创建storage.py模块,在这个模块中实现自定义存储系统
- step4 在storage.py中定义一个类继承与storage的子类Stroage,实现_open()以及_save()方法
- step5 导入Fdfs_client类,将client.conf配置文件拷贝到utils/fdfs目录下
- step6 修改client.conf配置文件中
base_path=D:\Python27\logs
- step7 因为项目中场景不使用_open方法,只是用_save方法,所以在_save进行编写,创建Fdfs_client对象
client = Fdfs_client(r"./utils/fdfs/client.conf")
- step8 上传文件到FastDFS系统中,upload_by_buffer方法是上传文件内容,而不是文件名了
res = client.upload_by_buffer(content.read())
- step9 判断是否上传成功
# 上传成功返回的字段数据
"""
dict
{
'Group name': group_name,
'Remote file_id': remote_file_id,
'Status': 'Upload successed.',
'Local file name': '',
'Uploaded size': upload_size,
'Storage IP': storage_ip
}
"""
if res.get("Status") != "Upload successed.":
# 表示上传失败
raise
- step10 上传成功获取文件id,并返回
filename = res.get("Remote file_id")
return filename
- step11 重写exists方法调用_save方法之前会去调用exists方法,判断文件在系统中是够存在
def exists(self, name):
"""如果提供的名称所引用的文件在文件系统中存在,则返回True,否则如果这个名称可用于新文件,返回False"""
# 因为在django中不存在文件名情况,所以直接返回false
return False
4.在django admin后台管理页面测试文件存储类
- step1 在settings配置文件中设置django文件存储类为上面定义的类
DEFAULT_FILE_STORAGE = "utils.fdfs.storage.FDFSStorage"
- step2 在df_goods/admin中注册商品类型模型类
from django.contrib import admin
from df_goods.models import GoodsType
# 注册商品类型模型类
admin.site.register(GoodsType)