在自己的虚拟环境下,把ngnix以及fastdfs安装成功后。
workon django_py3(进入你的虚拟环境 workon 环境名称)
直接pip install fdfs_client-py-master,
再pip install py3fdfs。
现在进入Python交互式,如果按照之前的做法:
>>> from fdfs_client.client import Fdfs_client
>>> client = Fdfs_client('/etc/fdfs/client.conf')
>>> ret = client.upload_by_filename('test')
>>> ret
{'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/
wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'
, 'Storage IP':'192.168.243.133'}
但是实际上却会出现如下报错
(bj18_py3) python@ubuntu:~$ python
Python 3.5.2 (default, Jul 5 2016, 12:43:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from fdfs_client.client import Fdfs_client
>>> client = Fdfs_client('/etc/fdfs/client.conf')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/python/.virtualenvs/bj18_py3/lib/python3.5/site-packages/fdfs_client/client.py", line 51, in __init__
self.tracker_pool = poolclass(**self.trackers)
TypeError: type object argument after ** must be a mapping, not str
>>>
我们通过查看django源代码可以知道
class Fdfs_client(object):
42 '''
43 Class Fdfs_client implemented Fastdfs client protol ver 3.08.
44
45 It's useful upload, download, delete file to or from fdfs server, etc. I t's uses
46 connection pool to manage connection to server.
47 '''
48
49 def __init__(self, trackers, poolclass=ConnectionPool):
50 self.trackers = trackers
51 self.tracker_pool = poolclass(**self.trackers)
52 self.timeout = self.trackers['timeout']
53 return None
以及同文件下的get_tracker_conf函数
def get_tracker_conf(conf_path='client.conf'):
20 cf = Fdfs_ConfigParser()
21 tracker = {}
22 try:
23 cf.read(conf_path)
24 timeout = cf.getint('__config__', 'connect_timeout')
25 tracker_list = cf.get('__config__', 'tracker_server')
26 if isinstance(tracker_list, str):
27 tracker_list = [tracker_list]
28 tracker_ip_list = []
29 for tr in tracker_list:
30 tracker_ip, tracker_port = tr.split(':')
31 tracker_ip_list.append(tracker_ip)
32 tracker['host_tuple'] = tuple(tracker_ip_list)
33 tracker['port'] = int(tracker_port)
34 tracker['timeout'] = timeout
35 tracker['name'] = 'Tracker Pool'
36 except:
37 raise
38 return tracker
由此可知,传递Fdfs+client需要的四个参数,ip port timeout name
client = Fdfs_client({'host_tuple': ['写你自己虚拟机里面的IP地址'], 'port': 22122, 'timeout': 30, 'name': 'Tracker Pool'})
你以为这样就完了么,下面还会报错
>>> from fdfs_client.client import Fdfs_client>>> client = Fdfs_client({'host_tuple': ['192.168.64.132'], 'port': 22122, 'timeout': 30, 'name': 'Tracker Pool'})
>>> ret = client.upload_by_filename('test')Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/python/.virtualenvs/bj18_py3/lib/python3.5/site-packages/fdfs_client/client.py", line 84, in upload_by_filename
raise DataError(errmsg + '(uploading)')
fdfs_client.exceptions.DataError: [-] Error: test is not a file.(uploading)
查看client.py后,发现应该保存并使用已有的文件 绝对路径 ret = client.upload_by_filename(’ ‘) 括号里面填写的是要在你本机存在的文件名或者文件路径,或者在当前路径下拥有你需要上传的文件。最终结果如下
>>> from fdfs_client.client import Fdfs_client
>>> client = Fdfs_client({'host_tuple': ['192.168.64.132'], 'port': 22122, 'timeout': 30, 'name': 'Tracker Pool'})
>>> ret = client.upload_by_filename('12.txt')
>>> ret
{'Uploaded size': '10B', 'Status': 'Upload successed.', 'Remote file_id': b'group1/M00/00/00/wKhAhF9LG7iAXGoxAAAACjFO5Bc698.txt', 'Local file name': '12.txt', 'Storage IP': b'192.168.64.132', 'Group name': b'group1'
最后Python与fastdfs交互成功。进入新建django项目联合起来