DEV Community

Trix Cyrus
Trix Cyrus

Posted on

How to Turn Your Device Into a Simple Server Using Python.

Author: Trix Cyrus

Lets make a python server hosted from your device.

Getting Started..

make a directory named server

mkdir server
Enter fullscreen mode Exit fullscreen mode

make a file named server.py

nano server.py
Enter fullscreen mode Exit fullscreen mode

paste the below code.

import http.server
import socketserver
import logging
import os
import threading
from urllib.parse import urlparse, parse_qs

PORT = 8080
DIRECTORY = "www"  

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

class MyHandler(http.server.SimpleHTTPRequestHandler):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=DIRECTORY, **kwargs)

    def log_message(self, format, *args):
        logging.info("%s - %s" % (self.client_address[0], format % args))

    def do_GET(self):
        parsed_path = urlparse(self.path)
        query = parse_qs(parsed_path.query)

        # Custom logic for different routes
        if parsed_path.path == '/':
            self.serve_file("index.html")
        elif parsed_path.path == '/about':
            self.respond_with_text("<h1>About Us</h1><p>This is a custom Python server.</p>")
        elif parsed_path.path == '/greet':
            name = query.get('name', ['stranger'])[0]
            self.respond_with_text(f"<h1>Hello, {name}!</h1>")
        else:
            self.send_error(404, "File Not Found")

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        logging.info("Received POST data: %s", post_data.decode('utf-8'))
        self.respond_with_text("<h1>POST request received</h1>")

    def serve_file(self, filename):
        if os.path.exists(os.path.join(DIRECTORY, filename)):
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            with open(os.path.join(DIRECTORY, filename), 'rb') as file:
                self.wfile.write(file.read())
        else:
            self.send_error(404, "File Not Found")

    def respond_with_text(self, content):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(content.encode('utf-8'))

class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
    daemon_threads = True  # Handle requests in separate threads

def run_server():
    try:
        with ThreadedHTTPServer(("", PORT), MyHandler) as httpd:
            logging.info(f"Serving HTTP on port {PORT}")
            logging.info(f"Serving files from directory: {DIRECTORY}")
            httpd.serve_forever()
    except Exception as e:
        logging.error(f"Error starting server: {e}")
    except KeyboardInterrupt:
        logging.info("Server stopped by user")

if __name__ == "__main__":
    server_thread = threading.Thread(target=run_server)
    server_thread.start()

    server_thread.join()
Enter fullscreen mode Exit fullscreen mode

make a directory named www

mkdir www
Enter fullscreen mode Exit fullscreen mode

now navigate to the www directory

cd www
Enter fullscreen mode Exit fullscreen mode

make a file named index.html

nano index.html
Enter fullscreen mode Exit fullscreen mode

paste the below code in it

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Python Simple Server</title>
</head>
<body>
    <h1>Welcome to My Python Server!</h1>
    <p>This is a simple web server running on your local device.</p>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Step 2: Test the Routes

After running the modified script, go to:

http://localhost:8080/ to see the home page.
http://localhost:8080/about to see the about page.
http://localhost:8080/greet?name=Trix
For any other path, the server will return a 404 error.

below is the directory structure

server/
├── server.py
└── www/
    └── index.html
Enter fullscreen mode Exit fullscreen mode

Running the Server on a Remote Device

What if you want to access your Python server from another device on the same network? You can easily do this by finding the local IP address of the machine running the server and using it instead of localhost.

Step 1: Find Your IP Address

use commands like

ipconfig
Enter fullscreen mode Exit fullscreen mode
ifconfig
Enter fullscreen mode Exit fullscreen mode

Look for your IPv4 address (something like 192.168.x.x).

Step 2. Modify Your Server Script

In your server script, replace the line where the server is started:

with ThreadedHTTPServer(("", PORT), MyHandler) as httpd:
Enter fullscreen mode Exit fullscreen mode

Change it to:

with ThreadedHTTPServer(("0.0.0.0", PORT), MyHandler) as httpd:
Enter fullscreen mode Exit fullscreen mode

Step 3: Access the Server from Another Device

Now, using the IP address you found earlier, you can access the server from any device on the same network by going to http://:8080 in a browser.

And All Set

~TrixSec

Top comments (0)