Upload
brian-tol
View
3.382
Download
0
Embed Size (px)
DESCRIPTION
A brief overview on Django. Original presented at the Grand Rapids Python User Group.
Citation preview
A Quick Overview
A bit about me
• Programmer @ 5Q Communications
• Hack on Django mostly full-time
• Dozen+ sites in production
• Calvin grad
A bit about Django
• Named after Django Reinhart, jazz guitarist
• Python 2.3+ (Not 3.x yet, afiak)
• BSD license
• djangoproject.com
• Current release: 1.1
Who uses it?• NASA
• PBS
• NY Times
• LA Times
• National Geographic
• Discovery Channel
Features
• Object-Relational Mapper
• MVC architecture
• Templating Language
• “Automatic” admins
• Elegant urls
• i18n/unicode support
• Cache framework
• Testing framework
• Great docs (650+ pages)
• Friendly community
More Features
• Jython support
• Geospacial content (via GeoDjango)
• Built-in dev server
• Nice support for forms
• Built-in RSS/ATOM
• Built-in site maps
• Send emails easily
• “Signal” hooks
• Solid security emphasis
Projects and Apps
ProjectApp
App
App
App
Templates & Assets
Live anywhere in your PYTHONPATH
Settings: database, email, caching, etc.
HTML, CSS, images, etc.
Typical Project Layoutproject/
__init__.pysettings.pymanage.pyurls.pytemplates/static/staff_members/
__init__.pymodels.pyadmin.pyviews.pyurls.pytests.pytemplates/
Typical App Workflow
1. Create app
2. Create models.py and admin.py
3. ‘python manage.py syncdb’
4. Create urls.py and views.py
class StaffMember(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) title = models.CharField(blank=True, max_length=100) bio = models.TextField(blank=True) image = models.FileField(upload_to='bio_images', blank=True) email = models.EmailField() published = models.BooleanField()
staff_group = models.ForeignKey(StaffMemberGroup)
class StaffMemberGroup(models.Model): name = models.CharField(blank=True, max_length=100) order = models.IntegerField(blank=True, null=True)
python manage.py syncdb
1. Create tables2. Create basic indexes3. Create intermediate tables for m2m relationships
members = StaffMember.objects.all()
ordered_members = StaffMember.objects.all().order_by(‘last_name’)
published_members = StaffMember.objects.filter(published=True)
bob = StaffMember(first_name=”Bob”, last_name=”Smith”)
groups = StaffMemberGroup.objects.all()
for group in groups:print group.name for member in group.staffmember_set.all():
print member.first_name
class StaffMemberAdmin(admin.ModelAdmin): list_display = ('last_name', 'first_name', 'email', 'published') list_filter = ('published', 'staff_group') search_fields = ('first_name', 'last_name', 'bio', 'title', 'email') fieldsets = ( (None, { 'fields': (('first_name', 'last_name'), 'title', 'email', 'image', 'bio'), 'description': '', }), ('Options', { 'fields': ('published', 'staff_group'), }) )admin.site.register(StaffMember, StaffMemberAdmin)
urlpatterns = patterns('grpug.staff_members.views', url(r'^$', 'show_staff_members', name='staff-members'), )
urlpatterns = patterns('', (r'^staff_members/', include('grpug.staff_members.urls')), (r'^admin/doc/', include('django.contrib.admindocs.urls')), (r'^admin/(.*)', admin.site.root),)
project urls.py
staff_members app urls.py:
def show_staff_members(request): groups = StaffMemberGroup.objects.all() return render_to_response( 'staff_member.html', {'groups': groups} )
{% for group in groups %} <h2>{{group.name}}</h2> <ul> {% for member in group.staffmember_set.all %} <li> <h3>{{member.first_name}} {{member.last_name}}</h3> <p>{{member.bio}}</p> </li> {% endfor %} </ul>{% endfor %}
staff_member.html
{% extends ‘base_site.html’ %}
{% block content %}{% for group in groups %} <h2>{{group.name}}</h2> <ul> {% for member in group.staffmember_set.all %} <li> <h3>{{member.first_name}} {{member.last_name}}</h3> <p>{{member.bio}}</p> </li> {% endfor %} </ul>{% endfor %}
{% endblock content %}
staff_member.html
<html><body> {% block content %} {% endblock content %}</body></html>
base_site.html
Middleware
• process_request(self, request)
• process_view(self, request, view_func, view_args, view_kwargs)
• process_response(self, request, response)
• process_exception(self, request, exception)
Testing Framework
• doctests
• unit tests
• helpful stuff: fixtures, email test, “client”
c = Client()response = c.post(‘/login’, user_dict)
Some Warts
• No support for multiple databases
• Poor environment support (think rails)
• Template logic tags below average
• No built-in migrations
• Too big?
• REST/SOAP support lacking
• “Explicit” but still tightly coupled for some things
• No integrated deployment toolchain
• CMS extras lacking (wysiwyg, file browser...)
Rest of the stack
• Databases
• SQLite
• MySQL
• Postgresql
• Oracle
• Deployment
• mod_python
• mod_wsgi
• fast cgi
Tips
• virtualenv is your friend
• default settings.py is about 50% of what a production site ends up requiring
• local_settings.py
• Don’t be afraid of lots of apps
• ‘South’ is a solid migrations tool
Docs, Books, People
• docs.djangoproject.com
• djangobook.com
• djangosnippets.com
• djangopeople.net
• djangosites.org
Code Samples
• http://bitbucket.org/btol45/grpug-example/