Skip to content

Static Files

Serving static files is a common requirement for web applications. Nexios provides a robust and flexible system for serving static assets like CSS, JavaScript, images, and other file types with security and performance in mind.

Basic Setup

To serve static files in Nexios, use the StaticFiles class:

python
from nexios import NexiosApp
from nexios.static import StaticFiles

app = NexiosApp()

# Create a static files handler for a single directory
static_files = StaticFiles(directory="static")

## Mounting with Group
static_group = Group(path="/static", app=static_files)
app.add_route(static_group)

With this setup, a file at static/css/style.css would be accessible at /static/css/style.css.

Single Directory

The simplest configuration uses a single directory for all static files:

python
static_files = StaticFiles(directory="static")
static_group = Group(path="/static", app=static_files)
app.add_route(static_group)

Multiple Directories

For more complex setups, you can serve files from multiple directories:

python
static_files = StaticFiles(directories=["static", "public/assets", "uploads"])
static_group = Group(path="/static", app=static_files)
app.add_route(static_group)

When serving from multiple directories, Nexios searches for files in the order the directories are specified.

URL Prefixing

The prefix parameter defines the URL path under which static files are served:

python
static_files = StaticFiles(directory="static")
app.register(static_files, prefix="/assets")  # Serve files at /assets/ instead of /static/

Examples

Complete Application Setup

python
from nexios import NexiosApp
from nexios.static import StaticFiles
from nexios.routing import Group

app = NexiosApp()

# Serve static files with optimizations
static_files = StaticFiles(
    directory="static",
    prefix="/static",
    cache_control="public, max-age=3600",
    allowed_extensions=["css", "js", "png", "jpg"]
)
static_group = Group(path="/static", app=static_files)
app.add_route(static_group)

# Add middleware for logging
app.add_middleware(StaticFileLogger())

Security & Extension Filtering

For security reasons, you can restrict which file extensions are allowed to be served:

python
from nexios.routing import Group
# Only allow specific file extensions
static_files = StaticFiles(
    directory="static",
    allowed_extensions=["css", "js", "png", "jpg", "jpeg", "gif", "svg", "ico"]
)
static_group = Group(path="/static", app=static_files)
app.add_route(static_group)

This prevents serving potentially dangerous files like .php, .py, or other executable files.

Custom 404 Handler

You can provide a custom handler for when static files are not found:

python
def custom_404_handler(request, response):
    """Custom 404 handler for static files"""
    return response.html(
        """
        <html>
            <head><title>Custom 404</title></head>
            <body>
                <h1>Custom 404 - File Not Found</h1>
                <p>The requested file could not be found.</p>
                <p><a href="/">Go back home</a></p>
            </body>
        </html>
        """,
        status_code=404
    )

static_files = StaticFiles(
    directory="static",
    custom_404_handler=custom_404_handler
)
app.register(static_files, prefix="/static")

Performance & Caching

Cache Control

Configure caching headers for better performance:

python
static_files = StaticFiles(
    directory="static",
    cache_control="public, max-age=3600"  # Cache for 1 hour
)
app.register(static_files, prefix="/static")

Advanced Configuration

You can combine all these features for a fully configured static file server:

python
def custom_not_found(request, response):
    """Custom 404 page with styling"""
    return response.html(
        """
        <!DOCTYPE html>
        <html>
        <head>
            <title>Page Not Found</title>
            <style>
                body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
                .container { max-width: 600px; margin: 0 auto; }
                h1 { color: #333; }
                a { color: #007bff; text-decoration: none; }
                a:hover { text-decoration: underline; }
            </style>
        </head>
        <body>
            <div class="container">
                <h1> File Not Found</h1>
                <p>The requested file could not be found on this server.</p>
                <p><a href="/">Return to Home</a></p>
            </div>
        </body>
        </html>
        """,
        status_code=404
    )

# Advanced static file configuration
static_files = StaticFiles(
    directories=["static", "assets", "uploads"],
    allowed_extensions=["css", "js", "png", "jpg", "jpeg", "gif", "svg", "ico", "txt", "pdf"],
    custom_404_handler=custom_not_found,
    cache_control="public, max-age=86400",  # Cache for 24 hours
)

static_group = Group(path="/static", app=static_files)
app.add_route(static_group)