Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Hunting For Treasure In Django
Search
Seb
May 28, 2015
Technology
0
170
Hunting For Treasure In Django
Seb
May 28, 2015
Tweet
Share
More Decks by Seb
See All by Seb
Double Click - Continue Building Better CLIs
elbaschid
0
400
I Can Be A Speaker, So Can You
elbaschid
0
250
Click - PyCaribbean 2017 - Puerto Rico
elbaschid
0
390
Conferencing - Engineering Meeting
elbaschid
1
41
Show & Tell - PyCon US 2016 Summary
elbaschid
1
95
Click: A Pleasure To Write, A Pleasure To Use
elbaschid
0
570
Hunting for Treasure in Django
elbaschid
1
600
Moby & The Beanstalk
elbaschid
1
460
Docker In Production - A War Story
elbaschid
1
300
Other Decks in Technology
See All in Technology
元旅行会社の情シス部員が教えるおすすめなre:Inventへの行き方 / What is the most efficient way to re:Invent
naospon
2
330
Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
akexorcist
0
120
B2B SaaS × AI機能開発 〜テナント分離のパターン解説〜 / B2B SaaS x AI function development - Explanation of tenant separation pattern
oztick139
2
220
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
150
BLADE: An Attempt to Automate Penetration Testing Using Autonomous AI Agents
bbrbbq
0
290
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
350
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
150
スクラムチームを立ち上げる〜チーム開発で得られたもの・得られなかったもの〜
ohnoeight
2
350
The Role of Developer Relations in AI Product Success.
giftojabu1
0
120
SREによる隣接領域への越境とその先の信頼性
shonansurvivors
2
510
第1回 国土交通省 データコンペ参加者向け勉強会③- Snowflake x estie編 -
estie
0
120
Featured
See All Featured
A Tale of Four Properties
chriscoyier
156
23k
Become a Pro
speakerdeck
PRO
25
5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
GitHub's CSS Performance
jonrohan
1030
460k
Optimizing for Happiness
mojombo
376
70k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
KATA
mclloyd
29
14k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Transcript
Hunting for Treasure in Django Sebastian Vetter @elbaschid
Who Am I?
Sebastian • Django & Python Developer • Backend Engineer @
Mobify • github/twitter: elbaschid
What's The Treasure?
Awesome Django Features • Forms, • Views, • Models, •
the ORM, or • other commonly used APIs.
But They Are Boring
Real Treasure
What Does That Mean? • Useful pieces of Django code.
• Considered public API. • Documentation is available (sort of). • Mainly used within Django itself.
My Hunting Strategy • Digging through the Django source. •
Hanging out with Funkybob. • Learning from other great people.
What I'll Do • Show a few "hidden" treasures. •
Explain what they do. • Look at examples.
cached_property
Where is it useful? • Time or compute heavy properties
on a class. • Synchronous calls to remote servers. • Used more than once, e.g. code & template.
What does it do? • It's a decorator. • Caches
the return value. • Lives as long as the instance.
It looks like this class MyObject(object): @cached_property def compute_heavy_method(self): ...
return result
Imagine A Color API class Color(object): def __init__(self, hex): self.hex
= hex def _request_colour_name(self, hex): print "Requesting #{}".format(hex) rsp = requests.get(API_ENDPOINT.format(hex)) return rsp.json()[0].get("title") @property def name(self): return self._request_colour_name(self.hex)
Here's the problem • Using the name attribute will call
the API • Every time!
Here's the problem >>> c = Color('ffffff') >>> c.name Requesting
#ffffff white >>> c.name Requesting #ffffff white
Possible solution @property def name(self): if self._name is None: self._name
= self._request_colour_name(self.hex) return self._name
Or you can use cached_property from django.utils.functional import cached_property @cached_property
def name(self): return self._request_colour_name(self.hex)
Using the cached property >>> c = Color('ffffff') >>> c.name
Requesting #ffffff white >>> c.name white
Isn't That Great
All you Need To Know from django.utils.functional import cached_property •
Only cached for the lifetime of the instance. • Be careful with querysets. • Django docs • Source
import_string
Where is it useful? • Make a class or function
configurable. • Allow loading class/function from string.
What does it do? • Takes dotted path to a
class or function. • Loads it. • Returns the class or function object.
It looks like this from django.utils.module_loading import import_string get_func =
import_string('requests.get') print get_func # <function requests.api.get> get_func('https://google.ca') # <Response [200]>
# settings.py UPLOAD_VALIDATION_PIPELINE = [ 'my_project.uploads.validators.is_tarball', 'my_project.uploads.validators.has_readme_file', 'my_project.uploads.validators.has_no_!']
All you Need To Know from django.utils.module_loading import import_string •
Imports a class or function from a dotted path. • Django docs • Source
lazy and lazy_property
Where is it useful? • Accessing settings at parse time,
e.g. class attributes. • Translating strings outside of a view. • Translations in the settings module.
Here's a problem class UserSignupView(CreateView): ... success_url = reverse('signup-confirmed')
How can we fix it? from django.utils.functional import lazy class
UserSignupView(CreateView): ... success_url = lazy(reverse('signup-confirmed'), unicode)
Lazy Django • The Settings object is lazy. • Several
helpers have lazy siblings: • reverse_lazy • ugettext_lazy • Not sure what lazy_property is useful for.
All you Need To Know from django.utils.functional import lazy from
django.utils.functional import SimpleLazyObject • Imports a class or function from a dotted path. • Django docs • Source
RequestFactory
Where Is It Useful? • Testing request related code. •
Mocking will be too much work. • Using the test client doesn't make sense.
Create GET Request from django.test import RequestFactory request = RequestFactory().get('/some/path')
# with a query string query_params = {"token": "secret-token"} request = RequestFactory().get('/some/path', data=query_params)
Create POST Request from django.test import RequestFactory post_params = {'username':'testuser',
'password':'supersecret'} request = RequestFactory().post('/login', data=post_params)
All you Need To Know from django.test import RequestFactory •
Creates a fake request for given URL. • Can handle all HTTP methods. • Will save you some mocking work. • Django docs • Source
The Treasure Is Yours
Thanks! Questions? • www.roadsi.de • @elbaschid • github.com/elbaschid Slides: https://speakerdeck.com/elbaschid