DEV Community

Cover image for Handling URL Query Parameters in a Lightweight Python Web Framework
HexShift
HexShift

Posted on

Handling URL Query Parameters in a Lightweight Python Web Framework

Query parameters allow clients to send additional data in the URL, typically after a ? symbol. Parsing these parameters correctly is essential for filtering, searching, pagination, and other common web app features.


What Are Query Parameters?

A URL like /search?q=python&sort=asc contains query parameters:

  • q with value "python"
  • sort with value "asc"

They are key-value pairs separated by & after the ? character.


Extracting Query Parameters

When your framework receives a request, the path may include a query string:

/users?id=42&active=true
Enter fullscreen mode Exit fullscreen mode

You can split the path on ? to separate the path from the query string:

path, _, query_string = full_path.partition('?')
Enter fullscreen mode Exit fullscreen mode

Parsing Query Strings with urllib

Python’s built-in urllib.parse module offers utilities:

from urllib.parse import parse_qs

def parse_query_params(query_string):
    params = parse_qs(query_string)
    # parse_qs returns values as lists, so simplify:
    return {k: v[0] if len(v) == 1 else v for k, v in params.items()}
Enter fullscreen mode Exit fullscreen mode

Example:

parse_query_params("q=python&sort=asc&tag=web&tag=python")
# returns: {'q': 'python', 'sort': 'asc', 'tag': ['web', 'python']}
Enter fullscreen mode Exit fullscreen mode

Integrating Query Parsing into Requests

Add query parameters to your request object so handlers can easily access them:

request["query_params"] = parse_query_params(query_string)
Enter fullscreen mode Exit fullscreen mode

Handlers can then do:

def search_handler(request):
    q = request["query_params"].get("q", "")
    sort = request["query_params"].get("sort", "desc")
    # perform search using q and sort
    return f"Results for {q} sorted {sort}"
Enter fullscreen mode Exit fullscreen mode

Handling Missing or Malformed Queries

  • If no ? is present, query string is empty
  • parse_qs safely returns an empty dict on empty input
  • Values are URL-decoded automatically by parse_qs

Supporting Multiple Values per Key

For keys appearing multiple times, parse_qs returns a list. This is useful for filters:

/products?color=red&color=blue
Enter fullscreen mode Exit fullscreen mode

Your handler can accept lists for flexible queries.


URL Encoding and Decoding

Clients URL-encode special characters (%20 for space, etc). parse_qs handles decoding automatically, so your app gets clean strings.


Practical Uses

  • Pagination: ?page=2&limit=10
  • Search queries: ?q=keyword
  • Filtering: ?category=books&price_min=10
  • Sorting: ?sort=asc

Wrap-Up

Parsing URL query parameters is straightforward with Python’s standard library. Integrating this step into your lightweight framework lets your handlers accept dynamic inputs via the URL, making your apps far more interactive and useful.

Want to dive deeper? Check out my 20-page PDF guide: Building a Lightweight Python Web Framework from Scratch

Feature flag article image

Create a feature flag in your IDE in 5 minutes with LaunchDarkly’s MCP server ⏰

How to create, evaluate, and modify flags from within your IDE or AI client using natural language with LaunchDarkly's new MCP server. Follow along with this tutorial for step by step instructions.

Read full post

Top comments (0)

Gen AI apps are built with MongoDB Atlas

Gen AI apps are built with MongoDB Atlas

MongoDB Atlas is the developer-friendly database for building, scaling, and running gen AI & LLM apps—no separate vector DB needed. Enjoy native vector search, 115+ regions, and flexible document modeling. Build AI faster, all in one place.

Start Free

👋 Kindness is contagious

Take a moment to explore this thoughtful article, beloved by the supportive DEV Community. Coders of every background are invited to share and elevate our collective know-how.

A heartfelt "thank you" can brighten someone's day—leave your appreciation below!

On DEV, sharing knowledge smooths our journey and tightens our community bonds. Enjoyed this? A quick thank you to the author is hugely appreciated.

Okay