Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
[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
76
Django Round-Up – Meetup Django CH #28
zyegfryed
0
69
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
96
[Django] RESTful API
zyegfryed
1
230
Other Decks in Programming
See All in Programming
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
Security issues being discussed on Web Platforms
petamoriken
0
1.2k
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
190
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
180
The Rails Doctrine Decade
koic
2
360
Intent as Code
shoppingjaws
6
1.1k
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.1k
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
170
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
130
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
3.1k
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
150
App Intentsのビルドプロセスを支える技術
kntkymt
0
430
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
480
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Google's AI Overviews - The New Search
badams
0
1.6k
Marketing to machines
jonoalderson
1
5.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
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?