Python http web server 快速建立網頁伺服器

本篇介紹如何使用 Python 來快速地建立一個網頁伺服器 http web server,如果你不想架設 Apache,只需要一個簡單的網頁伺服器或者檔案伺服器分享檔案用途的話,那麼 Python 可以幫你達成這目的,千萬不要錯過接下來的內容,Python 2 跟 Python 3 都會一起介紹。利用 Python 2 內建 SimpleHTTPServer 模組,而 Python 3 是 http.server 模組,下一個簡單的指令,馬上就建立好一個網頁目錄伺服器/檔案伺服器,其他人就可以很簡單地用瀏覽器瀏覽目錄裡的檔案,這功能在分享檔案時非常有幫助!除此之外,也可以顯示目錄裡靜態網頁唷!

以下建立 Python http server 內容分為以下幾部分,

  • Python 2.x 使用指令建立 SimpleHTTPServer
  • Python 3.x 使用指令建立 http.server
  • 寫一個簡單 Python 2 的本機 http server
  • 寫一個簡單 Python 3 的本機 http server

Python 2.x 使用指令建立 SimpleHTTPServer

Python 內建 http server,透過下列指令,你可以快速地建立目錄檔案伺服器。
以下用 Python 2 的 SimpleHTTPServer 模組快速建立一個簡單網頁伺服器(Web Server)
關於 Python 2.7 的 SimpleHTTPServer 實作細節可以看 2.7/Lib/SimpleHTTPServer.py 原始碼。

1
2
$ cd /home/somedir
$ python -m SimpleHTTPServer

Python 3.x 使用指令建立 http.server

同樣的功能在 Python 3 改名叫做 http.server,透過下列指令,你可以快速地建立目錄檔案伺服器。
以下用 Python 3 的 http.server 模組快速建立一個簡單網頁伺服器(Web Server)
關於 Python 3.5 的 http.server 實作細節可以看 3.5/Lib/http/server.py 原始碼。

1
2
3
$ cd /home/somedir
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 ...

看到以上輸出表示伺服器已經啟動好了,預設 port 是 8000,接下來就可以開起 http://127.0.0.1:8000/http://localhost:8000/ 網頁看看效果,

如果想要更改伺服器所使用的 port 的話直接在後面指定 port number,例如我想改成 7000 的話就可以這樣下指令

1
2
$ python3 -m http.server 7000
Serving HTTP on 0.0.0.0 port 7000 ...

以上的作法是本機的位址(localhost)的作法,別台電腦是無法連進來的,
假設我想讓別台電腦或手機裝置連到我的這台電腦的話,就需要將這個伺服器 bind 在真實的網路介面上,
假如我的電腦主機內網IP為 192.168.0.2,那麼指令就要輸入,

1
2
$ python3 -m http.server -b 192.168.0.2
Serving HTTP on 192.168.10.180 port 8000 ...

這樣就會啟動一個網頁伺服器在 192.168.0.2 這個網路介面上,內網的裝置就可以透過這個IP連到我的電腦的網頁伺服器 web server(假如你電腦的防火牆有正確的設定的話),如果是要讓外網的電腦連進來的話,就改換成你電腦的真實對外IP即可。

寫一個簡單 Python 2 的本機 http server

如果想寫一個客製化的 Python 程式實現內建模組沒有的功能的話,
Python 2 寫法如下,不過 Python 2 即將不支援了,稍後也會示範一下 Python 3 的範例

python2-httpserver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"

if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = ('127.0.0.1', port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print("Serving HTTP on " + str(sa[0]) + " port " + str(sa[1]) + "...")
httpd.serve_forever()

寫一個簡單 Python 3 的本機 http server

Python 2 即將不支援了,趕緊跟上寫一下 Python 3 的範例吧!
Python 3 的範例如下,

python3-httpserver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import http.server
from http.server import SimpleHTTPRequestHandler

HandlerClass = SimpleHTTPRequestHandler
ServerClass = http.server.HTTPServer
Protocol = "HTTP/1.0"

if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = ('127.0.0.1', port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()

Python http web sever 背景執行

Python 執行 http server 後程式會在前景執行,用 & 可以將程式放到背景執行,如果要結束的話再用 kill 指令停止程式。

1
2
3
4
5
# python 2
$ python -m SimpleHTTPServer &

# python 3
$ python3 -m http.server &

但是用 ssh 或 telnet 再執行 python 的 http server 時,遇到 ssh 登出的話就會結束程式,因為 ssh 斷線登出時會發出 SIGNUP 訊號,而 Python 收到 SIGNUP 訊號後就會結束程式。這時可以使用 nohup 這個指令來解決這個問題,nohup 解決指令如下,nohup 會將後面的執行程式標準輸出導向 nohup.out 檔案裡,

1
2
3
4
5
# python 2
$ nohup python -m SimpleHTTPServer &

# python 3
$ nohup python3 -m http.server &

另外也可以用 tmux 或 screen 開啟 terminal,這樣 ssh 登出後 terminal 不會因此結束可以繼續執行,之後再重新連上 tmux 或 screen 的 session 即可。

本篇介紹的方法用作檔案伺服器的話只能下載不能上傳,下一篇就來介紹 Python SimpleHTTPServerWithUpload 上傳檔案功能

以上就是 Python http web server 快速建立網頁伺服器的介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
[1] Tech Tip: Really Simple HTTP Server with Python | Linux Journal
https://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python
[2] 用Python 的SimpleHTTPServer 模組快速建立一個臨時網頁伺服器(Web Server) - G. T. Wang
https://blog.gtwang.org/web-development/python-simplehttpserver-web-server/
[3] Python 3快速建立網頁伺服器Web server | Funny_DotBlog - 點部落
https://dotblogs.com.tw/funny_dotblog/2019/05/16/python_webserver
[4] Python: Let’s Create a Simple HTTP Server (Tutorial) - Afternerd
https://www.afternerd.com/blog/python-http-server/
[5] a minimal http server in python. Responds to GET, HEAD, POST requests, but will fail on anything else.
https://gist.github.com/bradmontgomery/2219997

其它相關文章推薦
如果你想學習 Python 相關技術,可以參考看看下面的文章,
Python SimpleHTTPServerWithUpload 上傳檔案功能
[Python小專案] Tornado+PyAutoGUI 多媒體控制播放的網頁
Python 新手入門教學懶人包
Python str 字串用法與範例
Python list 串列用法與範例
Python set 集合用法與範例
Python dict 字典用法與範例
Python tuple 元組用法與範例