The document is a comprehensive guide on web development using Python and Django, covering topics such as project setup, creating apps, building views and templates, handling forms, and managing user authentication. It emphasizes Django's features like ORM, middleware, and template inheritance while providing code examples and exercises. The guide also discusses best practices for environment setup, package management, and code organization.
Today
• Iteratively builda full-featured site
• Background for each feature
• Implement a feature
• Review our example solution
• Keep yours? git show tag
• Follow directly? git reset --hard tag
Django
• A high-levelPython web framework
• Encourages rapid development and clean,
pragmatic design
• “For perfectionists with deadlines”
• Focus on automation and DRY
• Widely supported, many deployment
options
Introspection
>>> help(Foo)
Help onclass Foo in module __main__:
class Foo(__builtin__.object)
| Classes can have docstrings too.
|
| Methods defined here:
|
| __init__(self, bar)
| So can functions/methods.
| ...
--------------------------------------------------------
| Data descriptors defined here:
35.
And more...
• Generators • Properties
• Generator Expressions • Context Managers
• List Comprehensions • Class Decorators
• Set Comprehensions • Abstract Base Classes
• Dictionary • Metaclasses
Comprehensions
36.
Style: PEP-8
• Notabs • Line breaks around
78-79 chars
• Four-space indents
• Some other OCD-
• Don’t mix tabs & spaces pleasing ideas :-)
• lower_case_methods
• CamelCaseClasses
Environment Setup
• Macor Linux? You’ve already got Python!
• You’ll also need Git if you don’t have it;
download it from http://git-scm.com or use
your package manager to install it
• Windows? Well, then...
39.
Windows Setup
• PortablePython and Portable Git
• Won’t modify your system at all
• Can be easily uninstalled
• If you want to permanently install Python
and Git you can easily do that too
40.
Portable Python 2.7
•Download http://bit.ly/13eyQGn
http://p.osuosl.org/pub/portablepython/v2.7/PortablePython_2.7.3.1.exe
• Run the .EXE
• Install into c:django-precompiler
• Download won't work?
p://p.codemash.org/webdev_with_django
41.
Portable Git
• Downloadhttp://bit.ly/X4dGps
http://msysgit.googlecode.com/files/Git-1.8.0-preview20121022.exe
• Create a new folder
• Extract archive into a new folder:
c:django-precompilerPortable Git
1.8.0-preview20121022
• Download won't work?
p://p.codemash.org/webdev_with_django
42.
Fixing the Path
•Download:
https://gist.github.com/4399659
• Save it as a file named run-cmd.bat
• Run it
• Download won't work?
p://p.codemash.org/webdev_with_django
Installing Packages
• Installedpackages go into a site-packages
directory in your Python lib
• That’s the “system Python” by default
• But different programs may need different
versions of packages...
• So we have virtual environments!
45.
Virtual Environments
• virtualenv
•Creates an isolated Python environment
with its own site-packages
• Install whatever you want without fouling
anything else up
46.
Python 2 or3?
• The future of Python is Python 3
• Django 1.5 has experimental Python 3
support
• Python 2.7 is still recommended for
production applications
• Django 1.6 will fully support Python 3
47.
Activate the VirtualEnvironment
# Mac/Linux/etc...
$ virtualenv django-precompiler
$ cd django-precompiler
$ source bin/activate
# Windows
> python virtualenv django-precompiler
> cd django-precompiler
> Scripts/activate.bat
CODE SMASH!
• CodeSmash is a fictional soware
development conference for people who
need to punch out awesome code
• It needs a website!
• We’re going to build one
Templates
• Make atemplates directory under src:
$ mkdir templates
• Update settings to tell Django where to find
the templates
• Put an HTML file in the templates directory
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
61.
URLs
• Map URLsin requests to code that can be
executed
• Regular expressions!
• Subsections of your site can have their own
urls.py modules (more on this later)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Views
• Code thathandles requests
• Other frameworks oen call these
“controllers”
• Basically a function that:
• gets a request passed to it
• returns text or a response
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
64.
Views
from django.http importHttpResponse
def my_view(request):
return HttpResponse("Hello, world!")
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Exercise 1
• Createa template for the homepage
• Create a view that will respond with the
rendered template
• Connect the / URL to the view
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Apps
• Django believesstrongly in separating
chunks of a site into apps that can be reused
• Ecosystem of reusable apps available
• Create an app; from the src directory:
$ django-admin.py startapp myapp
> python Scripts/django-admin.py startapp myapp Framework
Middleware
• Add it to INSTALLED_APPS in settings.py URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
71.
New App Contents
src/
codesmash/
myapp/
__init__.py
models.py
tests.py <-- you should write them!
views.py
urls.py <-- you'll want to make one of these
forms.py <-- one of these too
Framework
Middleware
templates/
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Connecting App URLs
#Use include to connect a regex to an app's urls.py
# Use namespace to keep app URL names nicely isolated
urlpatterns = patterns('',
(r'^myapp/',
include('myapp.urls', namespace='myapp')),
...
)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
74.
Form Validation
• Why?
•Classes for each kind of input field
• Form class to gather input fields
• View method uses the form class to validate
inputs
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
75.
A Very SimpleForm
from django import forms
class MyForm(forms.Form):
name = forms.CharField(max_length=30)
email = forms.EmailField()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
76.
Using a Formin a View
from myapp.forms import MyForm
def my_view(request):
form = MyForm(request.POST or None)
if request.method == "POST" and form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
# do something great with that data
return render(request, 'myapp/myform.html', {
'form': form
Framework
})
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
77.
Django Template Language
•Call a function or do logic:
{% ... %}
• Variable substitution:
{{ bar }}
• Filters:
Framework
{{ foo|bar }} Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Sending Mail
• Addan EMAIL_BACKEND in settings.py
EMAIL_BACKEND =
'django.core.mail.backends.console.EmailBackend'
• Import and use
from django.core.mail import send_mail
send_mail('subject', 'message', 'sender',
['recipient', ...]) Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
80.
Exercise 2
• Createa contact app
• Create a contact form with subject,
message, and sender’s email address
• Create view to display and process the form
and “send” the message
• Connect the view to “/contact” URL Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Redirecting on Success
•Make the POST action redirect with a GET
on successful processing
• Avoid “resubmit form” issues when
reloading or returning to success page
(browser back button)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
83.
Redirecting
from django.shortcuts importredirect
def my_view(request):
...
return redirect('namespace:name')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
84.
Exercise 3
• Makea separate contact form URL and
template for displaying a success message
• Update the POST handler to redirect to the
success page
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Template Inheritance
• Definea base template for the site
• Other templates extend the base template
• Blocks allow child templates to inject
content into areas of the parent template
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
helloworld.html
{% extends "base.html"%}
{% block title %}Hello, World{% endblock %}
{% block content %}
<h1>Hey! Great!</h1>
<p>Sure is some lovely content right here.</p>
<p>Yup.</p>
{% endblock %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
90.
Exercise 4
• Refactorthose templates!
• Make a base.html with appropriate blocks
• Make other templates extend it and fill in
the blocks
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
No Need toReinvent
• Django comes with a robust user
framework: django.contrib.auth
• Registration
• Login/Logout
• Password Recovery
Framework
• Etc. Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Create the Database
$python manage.py syncdb
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
96.
Extend the UserCreationForm
fromdjango.contrib.auth.forms import UserCreationForm
class RegistrationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
fields = ("username", "email")
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
97.
Register the User
form= RegistrationForm(request.POST)
if form.is_valid():
form.save()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
The User Object
•Always have one in every request
• Always available to templates
• Can be anonymous or populated depending
on whether the user has authenticated
100.
Exercise 5
• Starta new app called • Profile page should just
“accounts” display username and email
• Set up a UserCreationForm • Set up templates for the
subclass in accounts.forms form and profile page in
with username and email templates/accounts/
• Set up a view that displays • Wire up the URLs (be sure to
the form on GET give them names)
• Make the view handle POSTs • Link to registration from the Framework
– check the form, register the header
Middleware
user, log in, and redirect to a
user profile page URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
More Reusable Goodness
•django.contrib.auth provides URLs and
views for login and logout
• Will want to provide our own templates
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Exercise 6
• Enableauth URLs • Show username in
header when user is
• Add login and logout logged in
links to the site header
• Link to user profile when
• Show login when user is user is logged in
logged out, logout when
user is logged in • Customize login and
logout pages
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Django Admin
• FreeCRUD!
• Navigate database data by model
• Make changes
• Highly customizable
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
112.
Enabling the AdminApp
• Uncomment admin lines from
INSTALLED_APPS in settings.py
• Uncomment admin lines from the project’s
urls.py
• Mini-exercise: go do that :-)
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
django.contrib.flatpages
• Store simple“flat” HTML pages in the
database
• Has a URL, title, and content
• Useful for one-off pages with no logic that
don’t deserve full apps
• Add/edit content via the admin app Framework
Middleware
• Let’s enable it now! URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Make a FlatpageTemplate
• Put it in templates/flatpages/default.html
• In the title block, add:
{{ flatpage.title }}
• In the content block, add:
{{ flatpage.content }}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Models
• Model classesare the nouns of the system
• Used to create database tables
• Integrated with the ORM to interact with
the database
• Need to `python manage.py syncdb`
when adding a new model class Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
123.
Models
from django.db import models
class Thingy(models.Model):
name = models.CharField(max_length=255)
awesome = models.BooleanField(default=True)
description = models.TextField(blank=True)
def __str__(self):
return self.name
Framework
Middleware
def __unicode__(self): # note: not in Python 3
return unicode(str(self))
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
124.
Exercise 9
• Createa “talks” app to manage talks
• Create a Talk model; it should have:
• title - up to 255 characters
• approved - true or false, default false
• recording_release - true or false, default false
• abstract - text describing the talk
Framework
• outline - text outlining the talk Middleware
URLs
• notes - text about the talk that won't be public
Views
Tem-
Models
plates
Tags &
DB
Filters
Wiring the Modelfor Admin Access
• Each app manages its own admin wiring
• Goes into an admin.py within the app
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Exercise 10
• Createan admin.py for the talks app
• Register the Talk model
• Start up the admin app and verify that Talks
appears
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Exercise 11
• Createnew model classes • All should have a name, up
for foreign keys: to 255 characters
• Category • All should have a __str__;
Time Slot’s should use
• Talk Type strime (see strime.net)
• Audience Skill Level • Location and Time Slot
should be optional
• Location
• Do a many-to-many on Framework
django.contrib.auth.models. Middleware
• Time Slot User for talk speakers URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Changing Existing Models
•Adding/removing/changing fields in a
model requires a schema migration
• Django doesn’t support it out of the box
• Pro mode: use South
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
139.
Cheesy Precompiler Way
$ ./manage.py dbshell
> DROP TABLE talks;
$ ./manage.py syncdb
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
140.
Querying the Model
all_thingies= Thingy.objects.all()
single_thingy = Thingy.objects.get(id=1)
big_thingies = Thingy.objects.filter(size='big')
ordered_thingies = Thingy.objects.all().order_by('size')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
141.
Relations in Templates
•When a model object retrieved from the
ORM has relations, you get a relation
manager and not an actual iterable
collection
• Need to call .all() (or get or filter) on it
before you get back the related model
objects Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
142.
Relations in Templates
{%for gizmo in gizmos %}
{% for thingy in gizmo.thingies.all %}
...
{% endfor %}
{% endfor %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
143.
Exercise 12
• Createa view and template to display a list
of all talks, ordered by title
• Be sure to display all of the talk speakers
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Optimizing Queries
• Whatwe just did will make lots of extra
database queries (because of the loops)
• Go read up on:
• select_related: does a join in SQL
• prefetch_related: queries in advance, caches
results, allows “join” in Python
146.
Model Managers
• Aplace to encapsulate data queries
• Extend to provide extra queries with
developer-friendly interfaces
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
147.
Model Managers
class ThingyManager(models.Manager):
def big_ones(self):
return self.get_query_set().filter(size='big')
def of_color(self, color):
return self.get_query_set().filter(color=color)
class Thingy(models.Model):
Framework
objects = ThingyManager()
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
148.
Using a ModelManager
big_thingies = Thingy.objects.big_ones()
green_thingies = Thingy.objects.of_color('green')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
149.
Exercise 13
• Movethe queries from the previous exercise
into a TalkManager
• Change the queries to only get talks that
have been approved
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Generic Views
• Manyviews fall into the same patterns
• Django provides generic view classes for
things like showing a list of objects, creating
an object, updating an object, deleting, etc.
• Subclass and set properties or override
certain methods to customize Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
152.
Generic List Views
fromdjango.views.generic import ListView
class ThingyListView(ListView):
queryset = Thingy.objects.all()
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
153.
Generic List ViewURLs
from django.conf.urls import patterns, include, url
from myapp.views import ThingyListView
urlpatterns = patterns('myapp.views',
...
url(r'^$', ThingyListView.as_view(), name='things')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
154.
Generic List ViewTemplates
• Generic List Views are automatically wired
to templates
• Naming convention: lowercase model
name + “_list.html”, eg:
templates/myapp/thingy_list.html
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
155.
Exercise 14
• Replacethe view that lists talks with a
generic list view
• Redo the URL mapping to use your new
generic list view subclass
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Can You GuessWhat’s Next?
• Need to create new talks
• We could do it the hard way...
• Make a Form
• Make a View
• Read validated data, put it into a model object
Framework
• Save the model, redirect... Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
158.
Model Forms
from djangoimport forms
from myapp.models import Thingy
class ThingyForm(forms.ModelForm):
class Meta:
model = Thingy
exclude = ('flavor', 'user')
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
159.
Generic Create Views
fromdjango.views.generic.edit import CreateView
from myapp.forms import ThingyForm
class ThingyCreationView(CreateView):
model = Thingy
form_class = ThingyForm
success_url = "/accounts/profile"
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
160.
Generic Create ViewTemplates
• Generic Create Views are automatically
wired to templates
• Naming convention: lowercase model
name + “_form.html”; eg:
templates/myapp/thingy_form.html
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
161.
Exercise 15
• Makea Generic Create • Be sure to connect a
View and Model Form to “create” URL to the new
submit new talk Generic Create View
proposals
• Don’t forget a template!
• Exclude approval status,
location, and time slot • Link to the create form
(since the speaker from user profile
doesn’t control them)
• List user’s submitted Framework
talks on user profile Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Exercise 16
• Createa Generic Edit View for talks
• Use the Model Form from the previous
exercise
• Be sure to wire it to a URL for editing
• Change the existing template to indicate
whether we’re editing or creating Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Security in Views
•Can you spot a security problem in the
previous exercise?
• Anyone can edit any talk!
• Generic views can restrict access by limiting
the queryset available in the view
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
168.
Restricting Object Access
#In models.py...
class ThingyManager(models.Manager):
def for_user(self, user):
return self.get_query_set().filter(user=user)
# In views.py...
class ThingyUpdateView(UpdateView):
def get_queryset(self):
Framework
return Thingy.objects.for_user(
Middleware
self.request.user)
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
169.
Exercise 17
• Lockdown the update view from the
previous exercise so that a talk may only be
edited by its speakers
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Read-Only Data inGeneric Edit Views
• Model Form automatically builds form
elements for everything in the model
• Model Form excludes anything that it was
told to exclude
• Excluded fields are still available as
attributes of a variable called “object” (the Framework
object being displayed/edited) Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Exercise 18
• Changethe talk form from the previous
exercises
• Show time slot, location, and approval
status without allowing them to be modified
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
Custom Template Filters
•Django comes with many filters
• You can add your own
• Function that accepts a value and returns a
string
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
179.
Defining a CustomFilter
# In myapp/templatetags/myfilters.py...
from django import template
from django.utils.html import format_html
register = template.Library()
@register.filter
def my_filter(value):
...
Framework
return format_html("...")
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
180.
Using a CustomFilter
{% load myfilters %}
{% block content %}
<p>{{ foo|my_filter }}</p>
<p>{{ bar }}</p>
{% endblock %}
Framework
Middleware
URLs
Views
Tem-
Models
plates
Tags &
DB
Filters
181.
Exercise 20
• Createa custom filter function
“boolean_icon” that will show one image if
a value is True and another if it’s False
• Use the boolean_icon in the user’s profile to
indicate whether a talk has been approved
• Use static icons from the admin site: Framework
from django.contrib.admin.templatetags.admin_static import static
Middleware
icon_url = static('admin/img/icon-{0}.gif'.format( URLs
{True: 'yes', False: 'no', None: 'unknown'}[value])
Views
Tem-
Models
plates
Tags &
DB
Filters
Credits
• Image fromDjango Unchained by Sony
Pictures
http://www.nydailynews.com/entertainment/tv-movies/django-star-foxx-life-
built-race-article-1.1220275
• Image of Django Reinhardt by ~Raimondsy
http://raimondsy.deviantart.com/art/Django-Reinhardt-314914547
• Other images from ClipArt Etc.
http://etc.usf.edu/clipart/
191.
Contact Information
MikeCrute David Stanek
Finite Loop Soware American Greetings
http://mike.crute.org http://traceback.org
@mcrute @dstanek
Mike Pirnat
American Greetings
http://mike.pirnat.com
@mpirnat