SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
Django Class-BasedViews
CoMo Rich Web, October 2010
Agenda
• Python 101
• RegularViews
• GenericViews
• Class-BasedViews
Python 101
# defining a function
def say_hello(subject):
print 'Hello, %s' % subject
# calling a function
say_hello('World')
# defining a function
def say_hello(subject):
print 'Hello, %s' % subject
# calling a function
say_hello('World')
# defining a class
class HelloSayer(object):
def __init__(self, name):
self.name = name
def say_hello(self):
print 'Hello, %s' % self.name
# creating an object instance
i = HelloSayer('World')
i.say_hello()
First-Class Everything
• first-class functions
• can be stored in variables
• can be passed into other functions
• can be returned from functions
• first-class classes
• ditto all the above
f = say_hello
f('Everybody')
cls = MyClass
j = cls('Everybody')
j.say_hello()
Text
class FakeFunction(object):
def __init__(self):
print 'Constructing...'
def __call__(self):
print 'You called?'
f = FakeFunction() # Constructing...
f() # You called?
result = x()
# is `x()` calling a function?
# creating an object?
# or calling a method on an object?
DjangoViews
• a view is a function that takes (at minimum)
an HttpRequest and returns an
HttpResponse
• views usually live in the file views.py
• URLs are routed to views using patterns in
the file urls.py
View Basics
# __init__.py intentionally left blank
# models.py intentionally left blank
# views.py
from django.http import HttpResponse
def homepage(request):
return HttpResponse('<html><body><h1>Welcome to website</h1></body></html>')
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'myapp.views.homepage'),
)
# views.py
def user_profile(request, username):
# do useful stuff here...
return HttpResponse('''<html><body>
<h1>Profile for user %s</h1>
</body></html>''' % username)
# urls.py
urlpatterns = patterns('',
(r'^user/(w+)/profile$', 'myapp.views.user_profile'),
)
GenericViews
Paving the Cow Paths
• “CRUD” apps have well-known patterns
• dynamic typing allows Django to provide
common view patterns as reusable
functions
# hypothetical URL: /users?page=3
def user_list(request):
page = int(request.GET.get('page', '1')) # sloppy parsing
users = User.objects.all()
per_page = 20
num_pages = math.ceil(len(users) / per_page) # buggy math
if page <= 0 or page > num_pages:
raise Http404()
start_index = (page - 1) * per_page # buggy math
end_index = page * per_page # buggy math
users_on_page = users[start_index:end_index]
context = {
'users': users_on_page,
'page': page,
'num_pages': num_pages
# next or prev pages?
}
return render_to_response('myapp/user_list.html', context)
from django.views.generic import list_detail
# hypothetical URL: /users?page=3
def user_list(request):
return list_detail.object_list(request,
queryset=User.objects.all(),
paginate_by=20)
from django.views.generic import list_detail
# hypothetical URL: /users?staff=y
def user_list(request):
if request.GET.get('staff', 'n').lower() == 'y':
qs = Users.objects.filter(staff=True)
else:
qs = Users.objects.all()
return list_detail.object_list(request,
queryset=qs,
paginate_by=20)
Going off the Beaten Path
• at some point you’ll want to customize the
generic views even more
• wrapping only gets you so far
• what about deeper behavior changes?
• e.g,“delete” should actually flag as
“inactive”
Class-BasedViews
Benefits
• control not just parameters but behavior
• more code reuse
# completely made-up example
from django.views.generic.list_detail import ObjectListView
class UserListView(ObjectListView):
def get_queryset(self):
if self.request.GET.get('staff', 'n').lower() == 'y':
return Users.objects.filter(staff=True)
else:
return Users.objects.all()
# meanwhile, in urls.py...
(r'^users$', 'myapp.views.UserListView')
# completely made-up example
from django.views.generic.create_update import DeleteObjectView
class DeleteUserView(DeleteObjectView):
def perform_deletion(self, user):
user.is_active = False
user.save()
Not a Silver Bullet
• still only allows customization the original
author thought of
• can introduce multithreading issues
• “official” Django views aren’t finished yet
Questions?
Thanks for listening!

Más contenido relacionado

La actualidad más candente

PHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an AnalysisPHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an Analysis
Positive Hack Days
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
smueller_sandsmedia
 

La actualidad más candente (20)

Perl6 operators and metaoperators
Perl6   operators and metaoperatorsPerl6   operators and metaoperators
Perl6 operators and metaoperators
 
PHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an AnalysisPHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an Analysis
 
Swift勉強会第3回 〜UIを作ろう②〜
Swift勉強会第3回 〜UIを作ろう②〜Swift勉強会第3回 〜UIを作ろう②〜
Swift勉強会第3回 〜UIを作ろう②〜
 
Let's write secure Drupal code! - 13.09.2018 @ Drupal Europe, Darmstadt, Germany
Let's write secure Drupal code! - 13.09.2018 @ Drupal Europe, Darmstadt, GermanyLet's write secure Drupal code! - 13.09.2018 @ Drupal Europe, Darmstadt, Germany
Let's write secure Drupal code! - 13.09.2018 @ Drupal Europe, Darmstadt, Germany
 
Mootools selectors
Mootools selectorsMootools selectors
Mootools selectors
 
6. hello popescu 2
6. hello popescu 26. hello popescu 2
6. hello popescu 2
 
Ruby 2: some new things
Ruby 2: some new thingsRuby 2: some new things
Ruby 2: some new things
 
PythonでJWT生成からボット作成、投稿までやってみた
PythonでJWT生成からボット作成、投稿までやってみたPythonでJWT生成からボット作成、投稿までやってみた
PythonでJWT生成からボット作成、投稿までやってみた
 
Drupal Field API. Practical usage
Drupal Field API. Practical usageDrupal Field API. Practical usage
Drupal Field API. Practical usage
 
Python Novice to Ninja
Python Novice to NinjaPython Novice to Ninja
Python Novice to Ninja
 
Demystifying Object-Oriented Programming - Lone Star PHP
Demystifying Object-Oriented Programming - Lone Star PHPDemystifying Object-Oriented Programming - Lone Star PHP
Demystifying Object-Oriented Programming - Lone Star PHP
 
Growing jQuery
Growing jQueryGrowing jQuery
Growing jQuery
 
PageObject
PageObject PageObject
PageObject
 
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
Absolute Beginners Guide to Puppet Through Types - PuppetConf 2014
 
Demystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHPDemystifying Object-Oriented Programming - Midwest PHP
Demystifying Object-Oriented Programming - Midwest PHP
 
PyLecture1 -Python Basics-
PyLecture1 -Python Basics-PyLecture1 -Python Basics-
PyLecture1 -Python Basics-
 
Class 8 - Database Programming
Class 8 - Database ProgrammingClass 8 - Database Programming
Class 8 - Database Programming
 
テストデータどうしてますか?
テストデータどうしてますか?テストデータどうしてますか?
テストデータどうしてますか?
 
international PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secretsinternational PHP2011_Bastian Feder_jQuery's Secrets
international PHP2011_Bastian Feder_jQuery's Secrets
 
23. CodeIgniter sessions
23. CodeIgniter sessions23. CodeIgniter sessions
23. CodeIgniter sessions
 

Similar a Django class based views

Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby DeveloperVenturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Jon Kruger
 
Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
Edgar Suarez
 
PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2
Graham Dumpleton
 

Similar a Django class based views (20)

PyUIA 0.3
PyUIA 0.3PyUIA 0.3
PyUIA 0.3
 
Writing automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjectsWriting automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjects
 
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby DeveloperVenturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
Venturing Into The Wild: A .NET Developer's Experience As A Ruby Developer
 
Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
 
Python Development (MongoSF)
Python Development (MongoSF)Python Development (MongoSF)
Python Development (MongoSF)
 
Django Heresies
Django HeresiesDjango Heresies
Django Heresies
 
SOLID Ruby, SOLID Rails
SOLID Ruby, SOLID RailsSOLID Ruby, SOLID Rails
SOLID Ruby, SOLID Rails
 
Django - sql alchemy - jquery
Django - sql alchemy - jqueryDjango - sql alchemy - jquery
Django - sql alchemy - jquery
 
Advanced Python, Part 1
Advanced Python, Part 1Advanced Python, Part 1
Advanced Python, Part 1
 
Lo nuevo de Django 1.7 y 1.8
Lo nuevo de Django 1.7 y 1.8Lo nuevo de Django 1.7 y 1.8
Lo nuevo de Django 1.7 y 1.8
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2PyCon US 2012 - State of WSGI 2
PyCon US 2012 - State of WSGI 2
 
Django Good Practices
Django Good PracticesDjango Good Practices
Django Good Practices
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Object.__class__.__dict__ - python object model and friends - with examples
Object.__class__.__dict__ - python object model and friends - with examplesObject.__class__.__dict__ - python object model and friends - with examples
Object.__class__.__dict__ - python object model and friends - with examples
 
Postobjektové programovanie v Ruby
Postobjektové programovanie v RubyPostobjektové programovanie v Ruby
Postobjektové programovanie v Ruby
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”
 
Drupaljam xl 2019 presentation multilingualism makes better programmers
Drupaljam xl 2019 presentation   multilingualism makes better programmersDrupaljam xl 2019 presentation   multilingualism makes better programmers
Drupaljam xl 2019 presentation multilingualism makes better programmers
 
Modularity and Layered Data Model
Modularity and Layered Data ModelModularity and Layered Data Model
Modularity and Layered Data Model
 

Último

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Django class based views

  • 2. Agenda • Python 101 • RegularViews • GenericViews • Class-BasedViews
  • 4. # defining a function def say_hello(subject): print 'Hello, %s' % subject # calling a function say_hello('World')
  • 5. # defining a function def say_hello(subject): print 'Hello, %s' % subject # calling a function say_hello('World') # defining a class class HelloSayer(object): def __init__(self, name): self.name = name def say_hello(self): print 'Hello, %s' % self.name # creating an object instance i = HelloSayer('World') i.say_hello()
  • 6. First-Class Everything • first-class functions • can be stored in variables • can be passed into other functions • can be returned from functions • first-class classes • ditto all the above
  • 7. f = say_hello f('Everybody') cls = MyClass j = cls('Everybody') j.say_hello() Text
  • 8. class FakeFunction(object): def __init__(self): print 'Constructing...' def __call__(self): print 'You called?' f = FakeFunction() # Constructing... f() # You called?
  • 9. result = x() # is `x()` calling a function? # creating an object? # or calling a method on an object?
  • 11. • a view is a function that takes (at minimum) an HttpRequest and returns an HttpResponse • views usually live in the file views.py • URLs are routed to views using patterns in the file urls.py View Basics
  • 12. # __init__.py intentionally left blank # models.py intentionally left blank # views.py from django.http import HttpResponse def homepage(request): return HttpResponse('<html><body><h1>Welcome to website</h1></body></html>') # urls.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^$', 'myapp.views.homepage'), )
  • 13. # views.py def user_profile(request, username): # do useful stuff here... return HttpResponse('''<html><body> <h1>Profile for user %s</h1> </body></html>''' % username) # urls.py urlpatterns = patterns('', (r'^user/(w+)/profile$', 'myapp.views.user_profile'), )
  • 15. Paving the Cow Paths • “CRUD” apps have well-known patterns • dynamic typing allows Django to provide common view patterns as reusable functions
  • 16. # hypothetical URL: /users?page=3 def user_list(request): page = int(request.GET.get('page', '1')) # sloppy parsing users = User.objects.all() per_page = 20 num_pages = math.ceil(len(users) / per_page) # buggy math if page <= 0 or page > num_pages: raise Http404() start_index = (page - 1) * per_page # buggy math end_index = page * per_page # buggy math users_on_page = users[start_index:end_index] context = { 'users': users_on_page, 'page': page, 'num_pages': num_pages # next or prev pages? } return render_to_response('myapp/user_list.html', context)
  • 17. from django.views.generic import list_detail # hypothetical URL: /users?page=3 def user_list(request): return list_detail.object_list(request, queryset=User.objects.all(), paginate_by=20)
  • 18. from django.views.generic import list_detail # hypothetical URL: /users?staff=y def user_list(request): if request.GET.get('staff', 'n').lower() == 'y': qs = Users.objects.filter(staff=True) else: qs = Users.objects.all() return list_detail.object_list(request, queryset=qs, paginate_by=20)
  • 19. Going off the Beaten Path • at some point you’ll want to customize the generic views even more • wrapping only gets you so far • what about deeper behavior changes? • e.g,“delete” should actually flag as “inactive”
  • 21. Benefits • control not just parameters but behavior • more code reuse
  • 22. # completely made-up example from django.views.generic.list_detail import ObjectListView class UserListView(ObjectListView): def get_queryset(self): if self.request.GET.get('staff', 'n').lower() == 'y': return Users.objects.filter(staff=True) else: return Users.objects.all() # meanwhile, in urls.py... (r'^users$', 'myapp.views.UserListView')
  • 23. # completely made-up example from django.views.generic.create_update import DeleteObjectView class DeleteUserView(DeleteObjectView): def perform_deletion(self, user): user.is_active = False user.save()
  • 24. Not a Silver Bullet • still only allows customization the original author thought of • can introduce multithreading issues • “official” Django views aren’t finished yet