Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[Django] URL prefix with runserver
Search
Sébastien Fievet
February 27, 2013
Programming
1.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[Django] URL prefix with runserver
Sébastien Fievet
February 27, 2013
More Decks by Sébastien Fievet
See All by Sébastien Fievet
Introduction to Flask
zyegfryed
0
71
Django Round-Up – Meetup Django CH #28
zyegfryed
0
68
Django Round-Up – Meetup Django CH #25
zyegfryed
0
61
Django Round-Up – Meetup Django CH #23
zyegfryed
0
59
Django Round-Up – Meetup Django CH #21
zyegfryed
0
77
Django Round-Up – Meetup Django CH #20
zyegfryed
0
84
Django Round-Up – Meetup Django CH #19
zyegfryed
2
93
[Django] Generating PDF with PDFForm
zyegfryed
0
94
[Django] RESTful API
zyegfryed
1
230
Other Decks in Programming
See All in Programming
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
220
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
180
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
120
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
55
36k
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
580
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
170
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
140
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
510
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
310
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
How to Talk to Developers About Accessibility
jct
2
540
How STYLIGHT went responsive
nonsquared
100
6.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
990
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
The Pragmatic Product Professional
lauravandoore
37
7.4k
Designing for Timeless Needs
cassininazir
1
470
Transcript
URL prefix with runserver Sébastien Fievet Meetup Django Suisse #12
February 27, 2013
What we have
What we have ๏On production http://example.com/myproject/
What we have ๏On production http://example.com/myproject/ ๏With runserver http://127.0.0.1:8000/
What we want ๏On production http://example.com/myproject/ ๏With runserver http://127.0.0.1:8000/myproject/
1
“ ” At any point, your urlpatterns can “include” other
URLconf modules. This essentially “roots” a set of URLs below other ones. -- Including other URLconfs
The trick You can also “include” urlpatterns!
# -- myproject/myproject/urls.py from django.conf import settings from django.conf.urls import
patterns, url, include # Your regular urls urlpatterns = patterns('', # ... snip ... ) # The ugly patch if settings.URL_DEBUG: urlpatterns = patterns('', url(r'^myproject/', include(urlpatterns)), )
“ ” i18n_patterns() is only allowed in your root URLconf.
Using it within an included URLconf will throw an ImproperlyConfigured exception. -- i18_patterns limitations
2
Django Middleware
# -- myproject/myproject/settings.py ROOT_URL = '/myproject' # ... snip ...
MIDDLEWARE_CLASSES = ( 'myproject.middleware.PrefixMiddleware', # ... snip ... )
# -- myproject/myproject/middleware.py import re from django.conf import settings class
PrefixMiddleware(object): def __init__(self): prefix = getattr(settings, 'ROOT_URL', '/') self.prefix = prefix.rstrip('/') self.regprefix = re.compile("^%s(.*)$" % self.prefix)
# -- myproject/myproject/middleware.py class PrefixMiddleware(object): # ... snip ... def
process_request(self, request): environ = request.environ url = environ['PATH_INFO'] url = re.sub(self.regprefix, r'\1', url) if not url: url = '/' environ['PATH_INFO'] = url environ['SCRIPT_NAME'] = self.prefix self._patch_request(request, environ) return None
# -- myproject/myproject/middleware.py class PrefixMiddleware(object): # ... snip ... def
_patch_request(self, request, environ): script_name = environ['SCRIPT_NAME'] path_info = environ['PATH_INFO'] request.environ = environ request.path_info = path_info request.path = '%s%s' % (script_name, path_info) request.META = environ request.META['PATH_INFO'] = path_info request.META['SCRIPT_NAME'] = script_name
But...
But... Monkey-patching approach
But... Monkey-patching approach Messing with Django internals is bad!
3
WSGI Middleware
pip install PasteDeploy==1.5.0 PasteDeploy
# -- myproject/myproject/wsgi.py import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") from django.core.wsgi import
get_wsgi_application application = get_wsgi_application() # Apply WSGI middleware here. from paste.deploy.config import PrefixMiddleware application = PrefixMiddleware(application, prefix='/myproject')
4
WSGI Middleware (2)
WSGI Middleware (2) PasteDeploy package overkill
WSGI Middleware (2) PasteDeploy package overkill NIH syndrome!
# -- myproject/myproject/middleware.py import re class PrefixMiddleware(object): def __init__(self, app,
prefix='/'): self.app = app self.prefix = prefix.rstrip('/') self.regprefix = re.compile("^%s(.*)$" % self.prefix) def __call__(self, environ, start_response): url = environ['PATH_INFO'] url = re.sub(self.regprefix, r'\1', url) if not url: url = '/' environ['PATH_INFO'] = url environ['SCRIPT_NAME'] = self.prefix return self.app(environ, start_response)
# -- myproject/myproject/wsgi.py import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") from django.core.wsgi import
get_wsgi_application application = get_wsgi_application() # Apply WSGI middleware here. from .middleware import PrefixMiddleware application = PrefixMiddleware(application, prefix='/myproject')
Questions?