1. 程式人生 > >使用Python建立簡單的HTTP服務(基於SimpleHTTPServer) 和 FTP服務(基於pyftpdlib)

使用Python建立簡單的HTTP服務(基於SimpleHTTPServer) 和 FTP服務(基於pyftpdlib)

之一  使用python內建的SimpleHTTPServer建立http服務

(1)Windows下cmd方式(假設電腦提前已安裝了python)

在 開始/執行/cmd 下,用cd命令切換至某個目錄,敲入:

python -m SimpleHTTPServer 80  

後面的80埠是可選的,不填會採用預設埠8000。注意,這會將當前所在的資料夾設定為預設的Web目錄,試著在瀏覽器敲入本機地址:

http://localhost:80

如果當前資料夾有index.html檔案,會預設顯示該檔案,否則,會以檔案列表的形式顯示目錄下所有檔案。執行完畢,請ctrl+c,並關閉cmd。

(2)指令碼方式

可以做成一個指令碼如test.py,再建立一個快捷方式,就可以很方便的啟動檔案分享了。如果有更多需求,完全可以根據自己需要定製,具體的請參見官方文件

SimpleHTTPServer,或者直接看原始碼。我拷貝一段,方便參考:

import SimpleHTTPServer
import SocketServer
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()

試著在瀏覽器敲入本機地址:

http://localhost:8000

如果test.py所在的當前資料夾中有index.html檔案,會預設顯示該檔案,否則,會以檔案列表的形式顯示目錄下所有檔案。執行完畢,請ctrl+c,並關閉cmd。

之二  Python版FTP伺服器

看到這裡,預設你已經安裝了Python,不過你還需要安裝另外一個好用的工具。你知道,當需要找Chrome外掛的時候,會去GoogleWebStore;當需要找Firefox應用的時候,會去MozillaAdd-ons;當你需要找Python元件的時候,你需要,安裝方法參見(先安裝pip,然後設定系統變數,再用“pip install  pyftpdlib ”命令安裝pyftpdlib模組),記得安裝玩pip後,要將類似“C:\Python27\Scripts”設定到系統path中,否則在cmd中,敲入”pip list“會沒有反應哦。自己慢慢探索,此處就不詳細介紹了。

Python沒有內建一個直接可以用的FTP伺服器,所以需要第三方元件的支援,我找到的這個元件叫pyftpdlib,首先安裝:

pip install pyftpdlib

安裝完後,和HTTP服器類似,執行以下命令就可以啟動一個FTP伺服器了:

python -m pyftpdlib -p 21

後面的21埠依然是可選的,不填會隨機一個,被佔用的埠將跳過。在瀏覽器敲入本機地址:

ftp://localhost:21

這時候,是匿名訪問,也就是使用者名稱是anonymous,密碼為空,如果想要控制訪問許可權,你需要自己定製伺服器,具體的可以參看,我這裡拷貝過來一段作為介紹:

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

===============================================================================

2015.8.29 更新

上面的程式碼我自己沒用起來,看了git hub後,經過試驗,如下的程式碼最為實用,自己可以做成一個例如命名為ftpserver.py的檔案,以後就可以用,省得去下載其他ftp軟體,一來安裝太麻煩,二來設定太麻煩。登陸方式建議採用admin/123456的方式,不建議匿名方式,反正匿名方式我沒成功。

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

authorizer = DummyAuthorizer()
## 新增  使用者名稱/密碼/ftp目錄。當目錄用"."表示.py檔案當前所在的目錄
authorizer.add_user("admin", "123456", "E:/Download", perm="elradfmwM")
## 新增匿名訪問時的 ftp目錄
authorizer.add_anonymous("E:/Download", perm="elradfmwM")
handler = FTPHandler
handler.authorizer = authorizer

## 設定ftp的本地或者ip地址/埠,可以根據自己的實際情況修改ip和埠即可。
# server = FTPServer(("0.0.0.0", 21), handler)
# server = FTPServer(("127.0.0.1", 21), handler)
server = FTPServer(("192.168.1.n", 21), handler)
server.serve_forever()

或者採用下面這個不用每次輸本機ip的方法

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import socket

# 自動獲得本機ip地址
ip = socket.gethostbyname(socket.gethostname())
authorizer = DummyAuthorizer()
## 新增  使用者名稱/密碼/ftp目錄。當目錄用"."表示.py檔案當前所在的目錄
authorizer.add_user("admin", "123456", "E:/Download", perm="elradfmwM")
## 新增匿名訪問時的 ftp目錄
authorizer.add_anonymous("E:/Download", perm="elradfmwM")
handler = FTPHandler
handler.authorizer = authorizer

## 設定ftp的本地或者ip地址/埠,可以根據自己的實際情況修改ip和埠即可。
# server = FTPServer(("0.0.0.0", 21), handler)
# server = FTPServer(("127.0.0.1", 21), handler)
server = FTPServer((ip, 21), handler)
server.serve_forever()

============================================

後記

Python第三方元件就是個大寶庫,基本上我自己遇到的大部分問題都可以在這裡面找到解決文案。同時,建議喜歡折騰的程式設計師,甚至沒有程式背景的IT人員,都嘗試學習一下這門語言,這對解決問題的能力以及思維的鍛鍊都有莫大裨益。