A few tools for helping with case-insensitvity in Django URLs.

django-icase, django, python
pip install django-icase==0.1.1



A few tools for helping with case-insensitvity in Django URLs.

  • 404 handler that redirects non-matched, non-lowercase URLs. E.g. if /About/ is not matched, the handler will redirect to /about/ before returning a 404
  • Middleware that enforces lower-cased URLs. E.g. all non-lowercased URLs will be redirected to their lowercased form.


If you only need to match URL patterns, then it's simple to add case-insensitivity to your regular expressions.:

urlpatterns = patterns('',
    (r'^(?i)static/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.STATIC_DOC_ROOT, 'show_indexes': True}),
    (r'^(?i)login/$', 'django.contrib.auth.views.login'),
    (r'^(?i)logout/$', do_logout),

From Alex Martelli's Stack Overflow explanation.

However this doesn't do anything to match slugs, which are often case-sensitive matched by default - it's up to the app. If the app uses a straightforward = expression, e.g.:

object = MyModel.objects.get(slug=slug)

Then MySlug won't match myslug.

There are also instances where you want to enforce URL casing for other reasons (or a client does!).


Install django-icase:

pip install django-icase

To use the custom 404 handler, simply specify this in your project configuration.:

handler404 = 'icase.views.icase_404_handler'

To use the lowercasing middleware, add it to your INSTALLED_MIDDLEWARE.:


Django & Python support

Actively supported versions of Django are supported by this app, although there is little reason it should not work on others.

Tested against Python 3 and Python 2.7.9.