Serve Your Current Directory With Python and HTTP
This is going to be a short post showing how to run an HTTP server to serve your current working directory.
TLDR
For Python 3 run:
python3 -m http.server
For Python 2 run:
python -m SimpleHTTPServer
.bashrc
alias:
alias serve="python3 -m http.server"
Explanation
Sometimes at work, I’ve had the need to spin up a quick HTTP server to serve my current working directory. I usually need this for two use cases:
- Share a quick link to have people download something from my computer.
- I have an
index.html
file in another computer along with a bunch of static resources and don’t feel like copying the whole folder to be able to see the page in my browser. This use case happens a lot when I’m running unit tests on another computer and need to look at coverage reports (which are rendered in HTML).
It turns out that serving your current directory with an HTTP server is easy. You only need python
.
Setup
Before we get started, let’s create some sample files.
nmesa@desktop-nicolas:~/demos/serve-cwd$ echo file1 > file1.txt
nmesa@desktop-nicolas:~/demos/serve-cwd$ echo file2 > file2.txt
nmesa@desktop-nicolas:~/demos/serve-cwd$ mkdir dir1 dir2
nmesa@desktop-nicolas:~/demos/serve-cwd$ echo file3 > dir1/file3.txt
nmesa@desktop-nicolas:~/demos/serve-cwd$ echo file4 > dir2/file4.txt
nmesa@desktop-nicolas:~/demos/serve-cwd$ tree
.
├── dir1
│ └── file3.txt
├── dir2
│ └── file4.txt
├── file1.txt
└── file2.txt
2 directories, 4 files
We created two files and two directories in the root, and one file in each of the directories.
Find out your python version
The command to spin up the HTTP server varies depending on the version of python that you have. Run python --version
to get your current version of python
.
nmesa@desktop-nicolas:~/demos/serve-cwd$ python --version
Python 3.5.2
If you see Python 3.x.x
, use the Python 3 command. If you see Python 2.x.x
, use the Python 2 command.
In this case, I’m using Python 3.
Python 3 command
nmesa@desktop-nicolas:~/demos/serve-cwd$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 ...
Python 2 command
nmesa@desktop-nicolas:~/demos/serve-cwd$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
Test it out
The previous commands spun up an HTTP server listening on port 8000
. Let’s point our web browser to the server’s IP address on port 8000
(192.168.0.250:8000
in this case). The page should look like this:
Root directory
Sample root directory listing. This is the equivalent of running an ls
on the directory where the server is running.
Child directory
Let’s click the dir1/
link:
dir1
directory listing.
File
Let’s click the file3.txt
link.
file3.txt
contents. Note that this file rendered in the browser. This is because the HTTP server is smart enough to add a content type to the HTTP response. This becomes handy when you need to serve HTML along with CSS, JS, and images.
Update (Oct 21, 2018)
I’ve been using this a lot at work to serve test coverage reports. To save some typing, let’s add the following alias to our .bashrc
(.bash_profile
in Mac) file:
alias serve="python3 -m http.server"
Let’s test it out by running serve
from our target directory (note that you will need to run source ~/.bashrc
or start a new terminal for this to work):
nmesa@desktop-nicolas:~/demos/serve-cwd$ serve
Serving HTTP on 0.0.0.0 port 8000 ...
We can also specify a different port:
nmesa@desktop-nicolas:~/demos/serve-cwd$ serve 9000
Serving HTTP on 0.0.0.0 port 9000 ...
This command starts the web server in port 9000
.
Conclusion
Python makes it easy to spin up an HTTP server to share your current working directory. Please don’t forget to kill the server once you’re done and be careful with what you share.
Links / Further reading
- SimpleHTTPRequestHandler source code (python 3)
- SimpleHTTPRequestHandler source code (python 2)
- alias command