Introduction to Django - OSCON 2012 - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Introduction to...
Transcript of Introduction to Django - OSCON 2012 - O'Reilly Mediaassets.en.oreilly.com/1/event/80/Introduction to...
Introduction to Django - OSCON 2012
Jacob Kaplan-Moss, Revolution Systems
Copyright © 2012 Revolution Systems, LLC.All rights reserved.
Table of Contents1. Introduction
4Which Django version should I use? .................5Installing Python “right” .....................................6Installing Django ................................................7“Projects”...........................................................8First steps ..........................................................
2. Apps, models, and the admin2“App” .................................................................3“Model”..............................................................
12Modeling in SQL ..............................................13Why Django models in Python ........................14Models in Python.............................................15Defining Models...............................................17All about syncdb..............................................18Model metadata...............................................19Playing with models at the shell ......................20Playing with models at the shell ......................23Slidebar: what's a slug? ..................................24Django’s admin interface.................................25Activating the admin ........................................
3. Introduction to views2Views..................................................................3URLs ..................................................................4URL design ........................................................5URLs in Django ..................................................6Regex crash course ...........................................9Dissecting a request ..........................................
11django.shortcuts.render...................................12django.shortcuts.get_object_or_404 ...............13Templates ........................................................14What’s a template? ..........................................15Where do templates go?..................................16Variables ..........................................................17The magic dot ..................................................18Filters ...............................................................19Filters ...............................................................20Tags .................................................................21Tags .................................................................22Template inheritance........................................23“base template” ...............................................24“child template” ...............................................26Inheritance tips.................................................
Django Training
Section 1: Introduction to Django
1
“”
Django is a high-level Python web framework that encourages rapid
development and clean, pragmatic design.
2
Documentationhttp://django.me/design
http://www.djangobook.com/en/2.0/chapter01/
3
Which Django version should I use?
4
• If possible, use the latest (Django 1.4).•At the very least, upgrade to the latest minor
release (1.3.1).•“All the cool stuff’s on dev” (and it’s quite stable).
Installing Python “right”
•Django — the ecosystem and deployment in particular — work best if you have a “modern” Python kit.
• Installation guides:OSX: http://bit.ly/python-osxWindows: http://bit.ly/python-windowsLinux: http://bit.ly/python-linux
5
Installing Django
6
•pip#install#Django is the one true way.(if that doesn’t work, learn about pip: http://pip.rtfd.org/)
•easy_install#Django is acceptable… for now.
•Dev install: pip#install#git+https://github.com/django/django.git
•Preferably in a virtualenv.http://virtualenv.rtfd.org/
“Projects”
7
•A collection of settings for a single instance of Django.
•Usually, one project == one site.For example: djangoproject.com is one project; people.djangoproject.com is another; docs.djangoproject.com is a third.
First steps•Create a project:
mkdir#<mysite>
django8admin.py#startproject#<projectname>0<mysite>
•Run the dev server:cd#<mysite>
python#manage.py#runserver
•Set up your database (<projectname>/settings.py)• Initial syncdb:
python#manage.py#syncdb
8
http://django.me/about-settings
http://django.me/settings
http://django.me/manage.py
Documentation
9
Exercise 1“it worked!”
10
Django Training
Introduction to apps, models, and the admin
1
“App”
2
A reusable collection of data and code
making up a logical unit.
“Model”
3
•The definitive source of data about your data.•Where your “business logic” lives.•The “M” in MVC (Model-View-Controller).
(sort of)
•Django’s ORM (Object-Relational Mapper).(kinda)
•Modeling data is hard, and even harder to explain succinctly. We’ll work through an example:
4
Blog
9
Blog
Author
Photo
Gallery
Comment Tag
EntryProject
10
Blog
Author
Photo
Gallery
Comment Tag
EntryApps
11
Blog
Author
Photo
Gallery
Comment Tag
EntryModels
CREATE&TABLE&"entries_entry"&(&&&&"id"&integer&NOT&NULL&PRIMARY&KEY,&&&&"author_id"&integer&NOT&NULL,&&&&"pub_date"&datetime&NOT&NULL,&&&&"headline"&varchar(200)&NOT&NULL,&&&&"slug"&varchar(50)&NOT&NULL&UNIQUE,&&&&"summary"&text&NOT&NULL,&&&&"body"&text&NOT&NULL)
12
Modeling in SQL
•SQL is tough.•SQL knows no version control.•DRY.•Python is fun!
Why Django models in Python
13
from&django.db&import&models
class&Author(models.Model):&&&&first_name&=&models.CharField(max_length=200)&&&&last_name&=&models.CharField(max_length=200)&&&&bio&=&models.TextField(blank=True)
14
Models in Python
Defining Models
15
• Create an “app”:python&manage.py&startapp&<appname>
• “Install” your app in settings.py:INSTALLED_APPS&=&(
&&&&"django.contrib.auth",
&&&&...
&&&&"<appname>"
)
• Define the model in <appname>/models.py.• Install the app in the database:
python&manage.py&syncdb
Exercise 1
16
All about syncdb
17
•Examines all INSTALLED_APPS, looking for models that are defined but not in the database. Those models are created (using SQL generated by manage.py&sqlall).
•Not very smart: won’t update existing models; won’t remove removed models.
• In development, you can use manage.py&reset to drop an app and start over, but this causes data loss!
•In the real world, you’ll need a schema migration tool (South; covered later in the class).
Model metadata
18
• Models are more than just fields; you can use them to define some useful metadata. For example:
• __unicode__ converts models to strings:class&Author(models.Model):
&&&&...
""""def"__unicode__(self):
""""""""return"self.first_name"+"'"'"+"self.last_name
• Inner Meta class can provide more options, like “human” names and control over database tables:
class&Person(models.Model):
&&&&...
""""class"Meta(object):
""""""""verbose_name_plural"=""people"
""""""""db_table"=""people_table"
Playing with models at the shell
•Django takes a bit of bootstrapping, so to play with your models interactively, use the shell command:
python&manage.py&shell
•This is just the Python shell, but with Django all set up and “scoped” into your project.
19
Playing with models at the shell>>>&from"authors.models"import"Author
>>>&Author.objects.all()[]
>>>&Author.objects.create(first_name='Miguel',"last_name='de"Cervantes')<Author:&Miguel&de&Cervantes>
>>>&Author.objects.all()[<Author:&Miguel&de&Cervantes>]
>>>&a"="Author.objects.all()[0]>>>&a.last_nameu'de&Cervantes'
>>>&a.last_name"=""Smith">>>&a.save()>>>&Author.objects.all()[<Author:&Miguel&Smith>]
20
http://ljworld.com/news/2011/sep/30/bankHamericaHstartHchargingHdebitHcardHfees/
http://pypi.python.org/pypi/Django/1.3.1
http://amazon.com/KindleHTouchHWiHFiHInkHDisplay/dp/B005890G8Y/
Slidebar: what's a slug?
23
Django’s admin interface
24
•“A Web-based interface, limited to trusted site administrators, that enables the adding, editing and deletion of site content.”
•Not exactly a CMS, but the starting point for one, perhaps.
Activating the admin•Un-comment a line in <project>/settings.py,
three lines in <project>/urls.py.
•Run manage.py&syncdb.•Create an admin definition in <app>/admin.py:
from&django.contrib&import&adminfrom&.models&import&Author
class&AuthorAdmin(admin.ModelAdmin):&&&&pass
admin.site.register(Author,&AuthorAdmin)
25
from&django.contrib&import&adminfrom&yabl.authors.models&import&Author
admin.site.register(Author)
26
INSTALLED_APPS&=&(&&&&'django.contrib.auth',&&&&'django.contrib.contenttypes',&&&&'django.contrib.sessions',&&&&'django.contrib.sites',""""'django.contrib.admin',
&&&&'yabl.authors',&&&&'yabl.entries',)
27
$&python"manage.py"syncdbCreating&table&django_admin_logInstalling&index&for&admin.LogEntry&model
28
from&django.conf.urls.defaults&import&*
#&Uncomment&the&next&two&lines&to&enable&the&admin:from"django.contrib"import"admin
admin.autodiscover()
urlpatterns"="patterns('',
&&&&#&Example:&&&&#&(r'^yabl/',&include('yabl.foo.urls')),
&&&&#&Uncomment&the&admin/doc&line&below&and&add&'django.contrib.admindocs'&&&&&#&to&INSTALLED_APPS&to&enable&admin&documentation:&&&&#&(r'^admin/doc/',&include('django.contrib.admindocs.urls')),
&&&&#&Uncomment&the&next&line&to&enable&the&admin:""""(r'^admin/',"include(admin.site.urls)),
)
29
30
33
from&django.contrib&import&adminfrom&yabl.authors.models&import&Author
class"AuthorAdmin(admin.ModelAdmin):
""""pass
admin.site.register(Author,"AuthorAdmin)
34
Django Training
Introduction to URLs, views, and templates
1
Views
2
•A “type” of web page in your application: a homepage, an index of blog posts, an individual blog post, etc.
•Not exactly the “V” part of MVC: views contain all the logic for a given page, but do not specify the visual presentation of that page.
•Most of your time writing Django apps will be spent writing views, so Django gets out of your way here.
•This is where the fun begins!
URLs
3
•Wait, I thought we were talking about views?•Django makes designing URLs an explicit part of
application design; URLs are part of the UI of your web application.
URL design
4
•Bad URLs:page.php Why do I need to know you’re using PHP?
script.cgi?pageid=144 What’s at id=145?
StoryPage.aspx Hello, a security hole!
0,2097,1-1-30-72-407-4752,00.html wat
•Good URLs:/entries//entries/hello-world/
•See also: “Cool URIs don’t change”http://www.w3.org/Provider/Style/URI.html
URLs in Django•Each project has a URLconf (e.g. yabl/urls.py).•Serves as a sort of “table of contents” for your site.• Incoming URLs are matched against a regular
expression, and then dispatched to a view function.
urlpatterns*=*patterns('',
****...
****url(*r'^authors/(\d+)/$'*,*'authors.views.author_detail'*),
****...
)
5
regex view function
Regex crash coursea The letter “a”.a+ One or more “a”s.b? Zero or one “b”s.c{1,3} One, two, or three “c”s.. Any single character.[abc] Either an “a”, “b”, or “c”.[A6Z] Any character between “A” and “Z”.[A6Za6z069]? Zero or one letters “A-Z”, “a-z”, or “0-9”.(\d{3,4}) A group containing three or four digits.(\w*) A group containing zero or more word characters (letters/digits).[^/]+ One or more characters until (and not including) a forward slash.^(joe|bob) A string starting with “joe” or “bob”.(?P<id>\d+) A group named “id” containing one or more digits.article/$ A string ending with “article/”
6
•GETQ/authors/1/
•ROOT_URLCONF
•yabl.urls
•(r'^authors/$',Q'author_list')QQQQQQQQQQ(no match)
•(r'^authors/(\d+)/',Q'author_detail')QQQ(match!)
•author_detail(request,Q'1')
Dissecting a request
9
Exercise 2
10
fromQdjango.shortcutsQimportQrenderfrom.modelsQimportQAuthor
defQauthor_list(request):QQQQreturnQrender(request,QQQQQQQQQ"authors/index.html",QQQQQQQQQ{"authors"Q:QAuthor.objects.all()}QQQQ)
11
django.shortcuts.render
fromQdjangoQimportQtemplatefromQdjango.httpQimportQHttpResponsefrom.modelsQimportQAuthor
defQauthor_list(request):QQQQtQ=Qtemplate.loader.get_template("authors/index.html")QQQQcQ=Qtemplate.Context({"authors"Q:QAuthor.objects.all()})QQQQhtmlQ=Qt.render(c)QQQQreturnQHttpResponse(html)
fromQdjango.shortcutsQimportQrender,Qget_object_or_404fromQ.modelsQimportQAuthor
defQauthor_detail(request,Qauthor_id):QQQQauthorQ=Qget_object_or_404(Author,Qid=author_id)QQQQreturnQrender(request,Q'author_detail.html',Q{'author':Qauthor})
12
django.shortcuts.get_object_or_404
fromQdjango.shortcutsQimportQrenderfromQdjango.httpQimportQHttp404fromQ.modelsQimportQAuthor
defQauthor_detail(request,Qauthor_id):QQQQtry:QQQQQQQQauthorQ=QAuthor.objects.get(id=author_id)QQQQexceptQAuthor.DoesNotExist:QQQQQQQQraiseQHttp404()QQQQreturnQrender(request,Q'author_detail.html',Q{'author':Qauthor})
Templates
13
•A view describes what’s on a page; a template describes how it looks.
•Django’s not really MVC: it’s MTV (Model-View-Template); this more closely matches the real division of roles in a typical web project.
•Django’s template language is designed primarily for front-end developers; It’s not a real programming language, but instead designed to strike a balance between power and ease of use.
•Django’s templates are optional; they can easily be replaced (or not used at all).
<!DOCTYPEQHTMLQPUBLICQ"6//W3C//DTDQHTMLQ4.01//EN"><htmlQlang="en"><head><title>Authors</title></head><body>
<h1>AuthorsQ({{Qauthors|lengthQ}}Qtotal)</h1><ul>
{%QforQaQinQauthorsQ%}<li>
<aQhref="{{Qa.idQ}}/">{{Qa.nameQ}}</a></li>
{%QendforQ%}</ul>
</body></html>
14
What’s a template?
Where do templates go?
15
• In an app’s templates directory.
• In directories specified by settings.TEMPLATE_DIRS.
TEMPLATE_DIRSQ=Q[
QQQQ'/Users/jacob/Revsys/Training/mysite.com/templates/',
]
<!DOCTYPEQHTMLQPUBLICQ"6//W3C//DTDQHTMLQ4.01//EN"><htmlQlang="en"><head><title>Authors</title></head><body>
<h1>AuthorsQ({{Qauthors|lengthQ}}Qtotal)</h1><ul>
{%QforQaQinQauthorsQ%}<li>
<aQhref="{{"a.id"}}/">{{"a.name"}}</a></li>
{%QendforQ%}</ul>
</body></html>
16
Variables
•{{Qa.nameQ}} could mean:•a["name"]
•a.name
•a.name()
The magic dot
17
<!DOCTYPEQHTMLQPUBLICQ"6//W3C//DTDQHTMLQ4.01//EN"><htmlQlang="en"><head><title>Authors</title></head><body>
<h1>AuthorsQ({{"authors|length"}}Qtotal)</h1><ul>
{%QforQaQinQauthorsQ%}<li>
<aQhref="{{Qa.idQ}}/">{{Qa.nameQ}}</a></li>
{%QendforQ%}</ul>
</body></html>
18
Filters
Filters• Data comes in one side and out the other.
(think Unix pipes.)
• Some filters take no arguments:
{{Qauthors|lengthQ}}
• Some filters take arguments:
{{Qentry.body|truncatewords:"30"Q}}
• Filters can be chained:
{{Qentry.body|truncatewords:"30"|upperQ}}
• Built-in filters: http://django.me/filters19
<!DOCTYPEQHTMLQPUBLICQ"6//W3C//DTDQHTMLQ4.01//EN"><htmlQlang="en"><head><title>Authors</title></head><body>
<h1>AuthorsQ({{Qauthors|lengthQ}}Qtotal)</h1><ul>
{%"for"a"in"authors"%}<li>
<aQhref="{{Qa.idQ}}/">{{Qa.nameQ}}</a></li>
{%"endfor"%}</ul>
</body></html>
20
Tags
Tags• Do... more complicated things.• Control flow:
{%QforQxQinQcsQ%}Q...Q{%QendforQ%}
{%QifQyQ>Q10Q%}Q...Q{%QendifQ%}
• Mangle data:
{%QwithQx.y.zQasQzQ%}Q...Q{%QendwithQ%}
{%QregroupQpeopleQbyQgenderQasQgender_listQ%}
• Etc:
{%QnowQ"Y6m6d"Q%}
{%QspacelessQ%}Q...Q{%QendspacelessQ%}
• Built-in tags: http://django.me/tags21
Template inheritance
22
<!DOCTYPEQHTMLQPUBLICQ"6//W3C//DTDQHTMLQ4.01//EN"><htmlQlang="en"><head>
<title>{%"block"title"%}YABL{%"endblock"%}
</title></head><body>
<divQid="content">{%"block"content"%}{%"endblock"%}
</div><divQid="footer">
{%"block"footer"%}Copyright"blah..{%"endblock"%}</div>
</body></html>
23
“base template”
{%"extends""base.html""%}
{%"block"title"%}AuthorsQ|Q{{Qblock.superQ}}
{%QendblockQ%}
{%"block"content"%}<h1>AuthorsQ({{Qauthors|lengthQ}}Qtotal)</h1><ul>
{%QforQaQinQauthorsQ%}<li>
<aQhref="{{Qa.idQ}}/">{{Qa.nameQ}}</a></li>
{%QendforQ%}</ul>
{%QendblockQ%}
24
“child template”
25
section_index.html
{% extends "base_generic.html" %}
{% block title %}
{{ section.title }}
{% endblock %}
{% block content %}
<h2>{{ section.title }}</h2>
{% for story in story_list %}
<h3>{{ story.headline }}</h3>
<p>{{ story.tease }}
{% endfor %}
{% endblock %}
base_generic.html
{% extends "base.html" %}
{% block title %}
LJWorld.com
{% endblock %}
{% block rail %}
<ul>
<li>Home</li>
<li>Local news</li>
...
</ul>
{% endblock %}
base.html
<html>
<head>
<title>
{% block title %}{% endblock %}
</title>
</head>
<body>
<div id="rail">
{% block rail %}{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
➀ ➁
➂
➃
sports/base.html base.htmlsports/section.html
{%QextendsQ"sports/base.html"Q%}
Inheritance tips•{%QextendsQ%} must be the first thing in your
template.
•More {%QblockQ%}s are better.
• If you’re duplicating content, you’re missing a block.
• If you need it, you there’s {%QincludeQ%}… but usually you don’t need it.
•Use {{Qblock.superQ}} to get at the parent’s content.
26