無論工做中仍是其餘場合,常常會有文件分享的需求,好比本身下了一個4GB的遊戲,同事下了一個800MB的軟件,其餘人若是也須要這些文件,顯然直接分享是最快捷、最方便、最環保的方式了,若是再從新下,既浪費時間,又浪費電。Windows自帶了文件夾共享的功能,不過這玩意兒,至今我還沒仔細的去折騰過,也沒搞明白原理,我一直使用FTP來分享文件,若是有須要的話再弄個HTTP服務也足夠應付了,個人目的僅僅只是文件分享,簡單、易用是我主要關注的點。html
這種需求必然是很是廣泛的,解決方法也是多種多樣。好比飛鴿傳書、QQ,或者各類局域網通訊軟件以及網盤均可以,不過這些都須要點對點的操做,也就是說對方須要什麼文件,你就要把該文件發送過去,多一我的就須要多發一次,不能重用,對於程序員來講,不能接受,反覆可恥!我以爲,文件服務器更符合這種需求,目前已經有不少成熟的軟件能夠方便的實現這種需求,好比,FTP能夠選擇FileZilla,HTTP能夠選擇Apache、Nginx。固然,成熟意味着軟件更復雜,更大的學習成本、更多磁盤佔用,這要看你的需求的複雜程度。python
好了,我須要說明,我是個喜歡折騰的人,將一件看起來複雜、學習成本高的事情,折騰到簡單、易用是個人終極愛好,這篇文章正是這種折騰後的產物,但願直接達到目的的,成熟的軟件是你最好的歸宿。喜歡折騰,換種程序員喜歡的說法是,我熱衷於把複雜的實現,隱藏在良好命名的接口下。再換種通俗點的說法,汽車內部構造精良、結構複雜,而你只須要經過操做方向盤、剎車以及油門,就能夠很好的操控它,這都歸功於這些接口的友好實現。程序員
一樣的事情,只須要一遍就好。在平時寫代碼,也是這樣。若是我須要別人提供的一個接口,那我但願這個接口使用起來儘可能簡單,我只須要知道調用什麼接口、傳什麼參數就行。我本身寫代碼,必定嚴格按照這種思路,我不認爲使用者須要關注我是如何實現的,那是個人問題,使用者須要關注的是這個接口是幹什麼的、須要什麼參數、可能返回的結果以及可能拋出的錯誤,分工明確,減小沒必要要的溝通。瀏覽器
我在前面一遍文章中有提到Python--導出指定文件夾中as文件的徹底限定類名,好處我就很少說了,一個字,性感!很巧的是,我在折騰這個文件分享的功能時,遇到了他,藉着這個機會,又複習了一遍HTTP和FTP方面的內容。bash
閒話少說,首先確保裝了Python,我裝的是2.x版本,對了,個人操做系統是WIN7,其實對於Python來講,什麼操做系統並不重要。Python內置了一個簡單的HTTP服務器,只須要在命令行下面敲一行命令,一個HTTP服務器就起來了:服務器
python -m SimpleHTTPServer 80
後面的80端口是可選的,不填會採用缺省端口8000。注意,這會將當前所在的文件夾設置爲默認的Web目錄,試着在瀏覽器敲入本機地址:工具
http://localhost:80
若是當前文件夾有index.html文件,會默認顯示該文件,不然,會以文件列表的形式顯示目錄下全部文件。這樣已經實現了最基本的文件分享的目的,你能夠作成一個腳本,再創建一個快捷方式,就能夠很方便的啓動文件分享了。若是有更多需求,徹底能夠根據本身須要定製,具體的請參見官方文檔SimpleHTTPServer,或者直接看源碼。我拷貝一段,方便參考:學習
import SimpleHTTPServer import SocketServer PORT = 8000 Handler = SimpleHTTPServer.SimpleHTTPRequestHandler httpd = SocketServer.TCPServer(("", PORT), Handler) print "serving at port", PORT httpd.serve_forever()
看到這裏,默認你已經安裝了Python,不過你還須要安裝另一個好用的工具。你知道,當須要找Chrome插件的時候,會去Google的WebStore;當須要找Firefox應用的時候,會去Mozilla的Add-ons;當你須要找Python組件的時候,你須要pip:A tool for installing and managing Python packages,安裝方法就不介紹了。spa
Python沒有內置一個直接能夠用的FTP服務器,因此須要第三方組件的支持,我找到的這個組件叫pyftpdlib,首先安裝:操作系統
pip install pyftpdlib
安裝完後,和HTTP服器相似,執行如下命令就能夠啓動一個FTP服務器了:
python -m pyftpdlib -p 21
後面的21端口依然是可選的,不填會隨機一個,被佔用的端口將跳過。在瀏覽器敲入本機地址:
ftp://localhost:21
這時候,是匿名訪問,也就是用戶名是anonymous,密碼爲空,若是想要控制訪問權限,你須要本身定製服務器,具體的能夠參看pyftpdlib Tutorial,我這裏拷貝過來一段做爲介紹:
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer def main(): # Instantiate a dummy authorizer for managing 'virtual' users authorizer = DummyAuthorizer() # Define a new user having full r/w permissions and a read-only # anonymous user authorizer.add_user('user', '12345', '.', perm='elradfmwM') authorizer.add_anonymous(os.getcwd()) # Instantiate FTP handler class handler = FTPHandler handler.authorizer = authorizer # Define a customized banner (string returned when client connects) handler.banner = "pyftpdlib based ftpd ready." # Specify a masquerade address and the range of ports to use for # passive connections. Decomment in case you're behind a NAT. #handler.masquerade_address = '151.25.42.11' #handler.passive_ports = range(60000, 65535) # Instantiate FTP server class and listen on 0.0.0.0:2121 address = ('', 2121) server = FTPServer(address, handler) # set a limit for connections server.max_cons = 256 server.max_cons_per_ip = 5 # start ftp server server.serve_forever() if __name__ == '__main__': main()
只看代碼應該基本知道該怎麼用了,add_user顯然是添加用戶,2121是指定端口,固然也能夠隨機,還有最大鏈接數max_cons,每一個ip最大鏈接限制,更多的接口建議直接看docstrings。