Author: Trix Cyrus
Lets make a python server hosted from your device.
Getting Started..
make a directory named server
mkdir server
make a file named server.py
nano server.py
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()
make a directory named www
mkdir www
now navigate to the www directory
cd www
make a file named index.html
nano index.html
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>
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
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
ifconfig
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:
Change it to:
with ThreadedHTTPServer(("0.0.0.0", PORT), MyHandler) as httpd:
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