developing reusable apps - james...
TRANSCRIPT
![Page 1: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/1.jpg)
Developing reusable apps
James Bennett
PyCon Chicago, March 15, 2008
![Page 2: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/2.jpg)
The fourfold path
Do one thing, and do it well.
Don’t be afraid of multiple apps.
Write for flexibility.
Build to distribute.
![Page 3: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/3.jpg)
1
![Page 4: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/4.jpg)
“”
Do one thing, and do it well.
-- The UNIX philosophy
![Page 5: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/5.jpg)
Application == encapsulation
![Page 6: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/6.jpg)
Case study: user registration
![Page 7: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/7.jpg)
![Page 8: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/8.jpg)
Features
User fills out form, inactive account created.
User gets email with link, clicks to activate.
And that’s it.
![Page 9: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/9.jpg)
Some “simple” things aren’t so simple.
![Page 10: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/10.jpg)
Approach features skeptically
![Page 11: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/11.jpg)
Should I add this feature?
What does the application do?
Does this feature have anything to do with that?
No? Guess I shouldn’t add it, then.
![Page 12: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/12.jpg)
Top feature request in django-registration:
User profiles
![Page 13: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/13.jpg)
“”
What does that have to do with user registration?
-- Me
![Page 14: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/14.jpg)
![Page 15: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/15.jpg)
The solution?
![Page 16: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/16.jpg)
django-profiles
Add profile
Edit profile
View profile
And that’s it.
![Page 17: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/17.jpg)
![Page 18: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/18.jpg)
2
![Page 19: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/19.jpg)
Don’t be afraid of multiple apps
![Page 20: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/20.jpg)
![Page 21: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/21.jpg)
The monolith mindset
The “application” is the whole site
Re-use is often an afterthought
Tend to develop plugins that hook into the “main” application
![Page 22: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/22.jpg)
The Django mindset
Application == some bit of functionality
Site == several applications
Tend to spin off new applications liberally
![Page 23: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/23.jpg)
Should this be its own application?
Is it orthogonal to whatever else I’m doing?
Will I need similar functionality on other sites?
Yes? Then I should break it out into a separate application.
![Page 24: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/24.jpg)
Case study: blogging
![Page 25: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/25.jpg)
I wanted a blog
Entries and links
Tagging
Comments with moderation
Contact form
“About” page
Etc., etc.
![Page 26: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/26.jpg)
I ended up with
A blog app (entries and links)
A third-party tagging app
contrib.comments + moderation app
A contact-form app
contrib.flatpages
Etc., etc.
![Page 27: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/27.jpg)
Advantages
Don’t keep rewriting features
Drop things into other sites easily
![Page 28: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/28.jpg)
urlpatterns += (‘’, (r’^contact/’, include(‘contact_form.urls’)),)
![Page 29: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/29.jpg)
But what about...
![Page 30: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/30.jpg)
Site-specific needs
Site A wants a contact form that just collects a message.
Site B’s marketing department wants a bunch of info.
Site C wants to use Akismet to filter automated spam.
![Page 31: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/31.jpg)
3
![Page 32: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/32.jpg)
Write for flexibility
![Page 33: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/33.jpg)
![Page 34: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/34.jpg)
Common sense
Sane defaults
Easy overrides
Don’t set anything in stone
![Page 35: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/35.jpg)
Form processing
Supply a form class
But let people specify their own if they want
![Page 36: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/36.jpg)
class SomeForm(forms.Form): ...
def process_form(request, form_class=SomeForm): if request.method == ‘POST’: form = form_class(request.POST) ... else: form = form_class() ...
![Page 37: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/37.jpg)
Specify a default template
But let people specify their own if they want
Templates
![Page 38: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/38.jpg)
def process_form(request, form_class=SomeForm, template_name=’do_form.html’): ... return render_to_response(template_name, ...
![Page 39: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/39.jpg)
You want to redirect after successful submission
Supply a default URL
But let people specify their own if they want
Form processing
![Page 40: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/40.jpg)
def process_form(request, form_class=SomeForm, template_name=’do_form.html’, success_url=’/foo/’): ... return HttpResponseRedirect(success_url)
![Page 41: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/41.jpg)
Provide a URLConf in the application
Use named URL patterns
Use reverse lookups: reverse(), permalink, {% url %}
URL best practices
![Page 42: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/42.jpg)
4
![Page 43: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/43.jpg)
Build to distribute
![Page 44: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/44.jpg)
So you did the tutorial
from mysite.polls.models import Poll
mysite.polls.views.vote
include(‘mysite.polls.urls’)
mysite.mysite.bork.bork.bork
![Page 45: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/45.jpg)
Project coupling kills re-use
![Page 46: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/46.jpg)
![Page 47: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/47.jpg)
What is a “project”?
A settings module
A root URLConf module
And that’s it.
![Page 48: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/48.jpg)
ljworld.com
worldonline.settings.ljworld
worldonline.urls.ljworld
And a whole bunch of reused apps
![Page 49: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/49.jpg)
What reusable apps look like
Single module directly on Python path (registration, tagging, etc.)
Related modules under a package (ellington.events, ellington.podcasts, etc.)
No project cruft whatsoever
![Page 50: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/50.jpg)
And now it’s easy
You can build a package with distutils or setuptools
Put it on the Cheese Shop
People can download and install
![Page 51: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/51.jpg)
General best practices
Be up-front about dependencies
Write for Python 2.3 when possible
Pick a release or pick trunk, and document that
But if you pick trunk, update frequently
![Page 52: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/52.jpg)
Templates are hard
Providing templates is a big “out of the box” win
But templates are hard to make portable (block structure/inheritance, tag libraries, etc.)
![Page 53: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/53.jpg)
I usually don’t do default templates
![Page 54: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/54.jpg)
Either way
Document template names
Document template contexts
![Page 55: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/55.jpg)
Be obsessive about documentation
It’s Python: give stuff docstrings
If you do, Django will generate documentation for you
And users will love you forever
![Page 56: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/56.jpg)
Recap:
Do one thing, and do it well.
Don’t be afraid of multiple apps.
Write for flexibility.
Build to distribute.
![Page 57: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/57.jpg)
Good examples
django-tagging (Jonathan Buchanan, http://code.google.com/p/django-tagging/)
django-atompub (James Tauber, http://code.google.com/p/django-atompub/)
Search for “django” on code hosting sites
![Page 58: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/58.jpg)
More information
django-hotclub (http://groups.google.com/group/django-hotclub/)
Jannis Leidel’s django-packages (http://code.google.com/p/django-reusableapps/)
Django sprint at PyCon
![Page 59: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/59.jpg)
Questions?
![Page 60: Developing reusable apps - James Bennettmedia.b-list.org/presentations/2008/pycon/reusable_apps.pdf · What reusable apps look like Single module directly on Python path (registration,](https://reader033.vdocuments.us/reader033/viewer/2022042304/5ecfe89bad2ea130f777a958/html5/thumbnails/60.jpg)
Photo credits
"Purple Sparkly Pony Ride" by ninjapoodles, http://www.flickr.com/photos/ninjapoodles/285048576/
“Stonehenge #2” by severecci, http://www.flickr.com/photos/severecci/129553243/
“sookiepose” by 416style, http://www.flickr.com/photos/sookie/41561946/
"The Happy Couple" by galapogos, http://www.flickr.com/photos/galapogos/343592116/