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
66
Django Round-Up – Meetup Django CH #25
zyegfryed
0
59
Django Round-Up – Meetup Django CH #23
zyegfryed
0
58
Django Round-Up – Meetup Django CH #21
zyegfryed
0
73
Django Round-Up – Meetup Django CH #20
zyegfryed
0
80
Django Round-Up – Meetup Django CH #19
zyegfryed
2
91
[Django] Generating PDF with PDFForm
zyegfryed
0
94
[Django] RESTful API
zyegfryed
1
230
Other Decks in Programming
See All in Programming
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.3k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
490
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
550
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
690
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.3k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
970
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
560
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
320
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
130
プロポーザルを書いてもらう
pvcresin
0
480
Featured
See All Featured
A Soul's Torment
seathinner
6
3.4k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
460
Git: the NoSQL Database
bkeepers
PRO
432
67k
Navigating Weather and Climate Data
rabernat
0
470
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
610
GitHub's CSS Performance
jonrohan
1033
470k
Tell your own story through comics
letsgokoyo
1
1k
Music & Morning Musume
bryan
47
7.3k
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
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?