django中FastDFS客戶端與自定義文件存儲系統

  1. 什么是FastDFS

FastDFS 是用 c 語言編寫的一款開源的分布式文件系統。FastDFS 為互聯網量身定制, 充分考慮了冗余備份、負載均衡、線性擴容等機制,并注重高可用、高性能等指標,使用 FastDFS 很容易搭建一套高性能的文件服務器集群提供文件上傳、下載等服務。

FastDFS 架構包括 Tracker server 和 Storage server。客戶端請求 Tracker server 進行文 件上傳、下載,通過 Tracker server 調度最終由 Storage server 完成文件上傳和下載。

Tracker server 作用是負載均衡和調度,通過 Tracker server 在文件上傳時可以根據一些 策略找到 Storage server 提供文件上傳服務。可以將 tracker 稱為追蹤服務器或調度服務器。

Storage server 作用是文件存儲,客戶端上傳的文件最終存儲在 Storage 服務器上, Storageserver 沒有實現自己的文件系統而是利用操作系統 的文件系統來管理文件。可以將 storage 稱為存儲服務器。

利用docker安裝fastDFS

docker image pull delron/fastdfs
執行如下命令開啟tracker 服務
ocker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
執行如下命令查看tracker是否運行起來

docker container ls
如果想停止tracker服務,可以執行如下命令

docker container stop tracker
停止后,重新運行tracker,可以執行如下命令

docker container start tracker
執行如下命令開啟storage服務
docker run -dti --network=host --name storage -e TRACKER_SERVER=10.211.55.5:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
執行如下命令查看storage是否運行起來

docker container ls
如果想停止storage服務,可以執行如下命令

docker container stop storage
停止后,重新運行storage,可以執行如下命令

docker container start storage、
python版本的FastDFS客戶端使用說明參考https://github.com/jefforeill...

使用FastDFS客戶端,需要有配置文件。
base_path=FastDFS客戶端存放日志文件的目錄
tracker_server=運行tracker服務的機器ip:22122
上傳文件需要先創建fdfs_client.client.Fdfs_client的對象,并指明配置文件,如

from fdfs_client.client import Fdfs_client
client = Fdfs_client('fastdfs/client.conf')
通過創建的客戶端對象執行上傳文件的方法

client.upload_by_filename(文件名)

client.upload_by_buffer(文件bytes數據)

自定義Django文件存儲系統
Django自帶文件存儲系統,但是默認文件存儲在本地,我們需要將文件保存到FastDFS服務器上。
自定義文件存儲系統的方法如下:

1)需要繼承自django.core.files.storage.Storage,如

from django.core.files.storage import Storage

class FastDFSStorage(Storage):

...

2)支持Django不帶任何參數來實例化存儲類,也就是說任何設置都應該從django.conf.settings中獲取

from django.conf import settings
from django.core.files.storage import Storage

class FastDFSStorage(Storage):

def __init__(self, base_url=None, client_conf=None):if base_url is None:base_url = settings.FDFS_URLself.base_url = base_urlif client_conf is None:client_conf = settings.FDFS_CLIENT_CONFself.client_conf = client_conf

3)存儲類中必須實現_open()和_save()方法,以及任何后續使用中可能用到的其他方法。

_open(name, mode='rb')

被Storage.open()調用,在打開文件時被使用。

_save(name, content)

被Storage.save()調用,name是傳入的文件名,content是Django接收到的文件內容,該方法需要將content文件內容保存。

Django會將該方法的返回值保存到數據庫中對應的文件字段,也就是說該方法應該返回要保存在數據庫中的文件名稱信息。

exists(name)

如果名為name的文件在文件系統中存在,則返回True,否則返回False。

url(name)

返回文件的完整訪問URL

delete(name)

刪除name的文件

listdir(path)

列出指定路徑的內容

size(name)

返回name文件的總大小

注意,并不是這些方法全部都要實現,可以省略用不到的方法。

4)需要為存儲類添加django.utils.deconstruct.deconstructible裝飾器

我們在fastdfs目錄中創建fdfs_storage.py文件,實現可以使用FastDFS存儲文件的存儲類如下

from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client

@deconstructible
class FastDFSStorage(Storage):

def __init__(self, base_url=None, client_conf=None):"""初始化:param base_url: 用于構造圖片完整路徑使用,圖片服務器的域名:param client_conf: FastDFS客戶端配置文件的路徑"""if base_url is None:base_url = settings.FDFS_URLself.base_url = base_urlif client_conf is None:client_conf = settings.FDFS_CLIENT_CONFself.client_conf = client_confdef _save(self, name, content):"""在FastDFS中保存文件:param name: 傳入的文件名:param content: 文件內容:return: 保存到數據庫中的FastDFS的文件名"""client = Fdfs_client(self.client_conf)ret = client.upload_by_buffer(content.read())if ret.get("Status") != "Upload successed.":raise Exception("upload file failed")file_name = ret.get("Remote file_id")return file_namedef url(self, name):"""返回文件的完整URL路徑:param name: 數據庫中保存的文件名:return: 完整的URL"""return self.base_url + namedef exists(self, name):"""判斷文件是否存在,FastDFS可以自行解決文件的重名問題所以此處返回False,告訴Django上傳的都是新文件:param name:  文件名:return: False"""return False
  1. 在Django配置中設置自定義文件存儲類

在settings/dev.py文件中添加設置

django文件存儲

DEFAULT_FILE_STORAGE = 'fastdfs.fdfs_storage.FastDFSStorage'

FastDFS

FDFS_URL = 'http://xxx:8888/'
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'fastdfs/client.conf')

  1. 添加image域名

在/etc/hosts中添加訪問FastDFS storage服務器的域名

127.0.0.1 xxx

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252842.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新近碰到的病毒(TR.Spy.Babonock.A)

先來段Microsoft的說明: Worm:Win32/Babonock.A Alert level: Severe Detected with Windows Defender Antivirus Also detected as:Worm/Win32.AutoIt (AhnLab)Trojan-Spy.Win32.AutoIt.p (Kaspersky)Worm/Autoit.ANVE (AVG)TR/Spy.Babonock.A (Avira)Win32/Autoit…

鏡頭基本參數

非常好的文章 ,下載不了,但是會經常閱讀。 https://wenku.baidu.com/view/47a7deddee06eff9aff8074e.html?rec_flagdefault&sxts1529650964474

Linux課程筆記 Day09 課上內容總結 MySql,Php的安裝及Apache,Nginx,Php的優化

一 MySql 1.1 如何選擇MySql的版本 1.2 MySql單實例安裝 (1) 建立mysql用戶 首先以root身份登陸到linux系統,然后執行如下命令創建mysql用戶及用戶組 [roottest3 ~]# groupadd mysql [roottest3 ~]# useradd -s /sbin/nologin -g …

jenkins 通過自動拉取Gitlab上的代碼實現自動更新NGINX

所需要用到的環境: Gitlab: 172.20.7.70Jenkins: 172.20.7.71nginx: 172.20.7.72 gitlab 和Jenkins安裝自行百度 開始實驗操作 首先通過網頁訪問nginx,nginx默認測試頁我是改了的 ,所以看到的不是它原…

Kylin工作原理、體系架構

核心思想:預計算。 對多維分析可能用到的度量進行預計算,將計算好的結果保存成Cube,并存在HBase中,供查詢時直接訪問 將高復雜度的聚合運算、多表連接……操作轉換成對預計算結果的查詢。決定了Kylin擁有很好的快速查詢、高并發能…

工業相機圖像傳感器的靶面大小

在機器視覺中,工業相機是一種比較重要的配件。而在 工業相機中,圖像傳感器又是最最關鍵核心的東西。而圖像傳感器的靶面的大小,往往直接關系到成像的質量。通常來講,圖像的成像質量與像素的大小成正比。這也就意味著,同…

SpringMVC+Mybatis學習

簡單Web項目搭建&#xff1a; 一.流程 1. 導包 n個springMVC&#xff1b; 2個mybatis<其中一個是mybatis-spring>&#xff1b; 3個jackson包&#xff1b; 2. xml配置 web.xml和applicationContext.xml 3. 建包&#xff0c;建接口&#xff0c;建類 4. 建jsp 二&#xff1a…

PPT怎么在線轉視頻?

PPT在線轉視頻的方法有哪些&#xff1f;在PPT中有些播放上的問題還是可以進行文件的轉換&#xff0c;下面就給大家簡單的介紹一下方法。步驟一&#xff1a;PPT轉視頻的直接方法是進入迅捷PDF在線轉換器網站中&#xff0c;點擊導航欄中的視頻音頻轉換中的PPT轉視頻&#xff1b; …

At least one JPA metamodel must be present!

使用spring jpa是一直報這個錯&#xff0c;找了兩天網上沒有找到答案&#xff0c;最后發現時配置配錯了&#xff0c;如下&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa<…

夜貓子”必需的!——融合夜視技術

融合夜視技術是一項正在發展中的前沿技術&#xff0c;通過將多個工作在不同波段的夜視傳感器獲得的圖像經過處理後生成高質量的融合圖像&#xff0c;融合圖像的分辨率更高&#xff0c;能夠揭示出那些很難被看到的特徵。按照融合的方式&#xff0c;融合夜視技術可以分為數字融合…

Vue中登錄模塊

轉載于:https://www.cnblogs.com/DZzzz/p/8921783.html

unity 中的UGUI 屏蔽鼠標穿透

void Update() { if(IsTouchedUI()) { Debug.Log("當前觸摸在UI上"); } else { Debug.Log("當前沒有觸摸在UI上"); } } void OnMouseDown() { if(IsTouchedUI()) { Debug.Log("當前觸摸在UI上"); } else { Debug.Log(&qu…

深度解析紅外探測器

輻射/設計/技術之前我們跟大家解析了紅外探測器的相關性能參數。 對于紅外探測器的工作原理你了解多少呢&#xff1f;今天小編再繼續上次的講解&#xff0c;為大家解析非制冷紅外焦平面探測器技術原理 及機芯介紹。 非制冷紅外技術原理 非制冷紅外探測器利用紅外輻射的熱效應&a…

js基礎總結性能優化

一.加載和執行1.推薦所有的script標簽盡可能放到body標簽的底部&#xff0c;以盡量減少對整體頁面下載速度的影響。2.組織腳本減少頁面包含的scirpt標簽數量&#xff0c;可以把多個文件合并成一個。3.無阻塞腳本1&#xff09;.延遲腳本defer:html解析完才加載&#xff0c;執行順…

Python2 Python3 爬取趕集網租房信息,帶源碼分析

*之前偶然看了某個騰訊公開課的視頻,寫的爬取趕集網的租房信息,這幾天突然想起來,于是自己分析了一下趕集網的信息,然后自己寫了一遍,寫完又用用Python3重寫了一遍.之中也遇見了少許的坑.記一下.算是一個總結.*python2 爬取趕集網租房信息與網站分析 分析目標網站url尋找目標標…

紅外熱成像技術原理

目前&#xff0c;新的熱成像儀主要采用非致冷焦平面陣列技術&#xff0c;集成數萬個乃至數十萬個信號放大器&#xff0c;將芯片置于光學系統的焦平面上&#xff0c;無須光機掃描系統而取得目標的全景圖像&#xff0c;從而大大提高了靈敏度和熱分辨率&#xff0c;并進一步地提高…

網站中公用頭部與尾部

一、html 1. <iframe src"1.html" frameborder"0"></iframe> 2. <embed src"1.html"/> 二、寫公用的js 文件&#xff0c;js中寫字divde符串&#xff0c;然后在需要的頁面適當位置引入公用的js. 三、ajax動態拉取填充 四、后端…

基于webpack的PC端和mobile端開發以及生產環境的搭建

我們用webpack做單頁面應用開發應該嘗試過很多次了&#xff0c;如果在同一個項目需要支持PC端和移動端&#xff0c;做成多頁面應用&#xff0c;開發時能根據請求的終端返回不同的內容&#xff0c;應該怎么做呢&#xff1f;以下描述的是我嘗試的一種方案&#xff0c;并且以vue-c…

深度學習簡介(一)——卷積神經網絡

本文的主要目的&#xff0c;是簡單介紹時下流行的深度學習算法的基礎知識&#xff0c;本人也看過許多其他教程&#xff0c;感覺其中大部分講的還是太過深奧&#xff0c;于是便有了寫一篇科普文的想法。博主也是現學現賣&#xff0c;文中如有不當之處&#xff0c;請各位指出&…

node+mongoose使用例子

https://github.com/Aquarius1993/nodeNotes 功能 1. 注冊 2. 登錄 3. 修改密碼 4. 修改頭像 5. 獲取用戶筆記 6. 添加&#xff0c;刪除,更新筆記安裝部署 1. 安裝 Node.js MongoDB 2. npm install 3. 啟動 MongoDB 4. npm start 5. visit http://localhost:8899 https://git…