Browse Source

Updated presentations for Python and Django

master
Julio Biason 9 years ago
parent
commit
0b9a78ff34
  1. 161
      django.html
  2. 152
      python.html

161
django.html

@ -58,6 +58,7 @@
</ul> </ul>
</section> </section>
<section>
<section> <section>
<h2>Projeto</h2> <h2>Projeto</h2>
@ -125,7 +126,9 @@
└── views.py └── views.py
</code></pre> </code></pre>
</section> </section>
</section>
<section>
<section> <section>
<h2> <h2>
<small>Projeto &gt; App &gt;</small> <small>Projeto &gt; App &gt;</small>
@ -245,7 +248,9 @@ urlpatterns = [
<p>... só que o Django ainda não sabe que ela existe.</p> <p>... só que o Django ainda não sabe que ela existe.</p>
</section> </section>
</section>
<section>
<section> <section>
<h2> <h2>
<small>Projeto &gt;</small> <small>Projeto &gt;</small>
@ -296,6 +301,7 @@ urlpatterns = [
<li>Retorna o template renderizado para o usuário.</li> <li>Retorna o template renderizado para o usuário.</li>
</ul> </ul>
</section> </section>
</section>
<section> <section>
<img src="_images/goodgood-but-we-must-go-deeper.jpg" alt="Go deeper"/> <img src="_images/goodgood-but-we-must-go-deeper.jpg" alt="Go deeper"/>
@ -335,6 +341,7 @@ order.save()
</code></pre> </code></pre>
</section> </section>
<section>
<section> <section>
<h2>Queries</h2> <h2>Queries</h2>
@ -356,9 +363,157 @@ all_fruits = Order.objects.filter(products__name__like='fruit')
<h2>Queries</h2> <h2>Queries</h2>
<p><code>get</code> só pode retornar <strong>um</strong> elemento.</p> <p><code>get</code> só pode retornar <strong>um</strong> elemento.</p>
<p><code>pk</code> é uma variável mágica que aponta para o campo marcado <p><code>pk</code> é uma variável mágica que aponta
como <code>primary_key=True</code>; se não houver um <code>primary_key</code>, para o campo marcado como
o Django cria um <code>IntegerField(auto_increment=True)</code>.</p> <code>primary_key=True</code>; se não houver um
<code>primary_key</code>, o Django cria um
<code>IntegerField(auto_increment=True)</code>.</p>
</section>
<section>
<h2>Reverse Queries</h2>
<p>Quando é criada uma relação, o Django cria também uma
relação reversa entre os models.</p>
<pre><code class="hljs">
order = Order.objects.get(pk=1)
print order.products.all()
</code></pre>
<pre><code class="hljs">
print Products.order_set.all()
</code></pre>
<p>O nome da relacionamento reverso pode ser alterado com
<code>related_name</code>.</p>
</section>
</section>
<section>
<section>
<h2>Fixtures</h2>
<p>Fixtures são arquivos JSON que o Django consegue usar
para preencher o banco de dados.</p>
<pre><code class="hljs">
[
{
"pk": 1,
"model": "Products",
"fields": {
"name": "fruit"
}
}
]
</code></pre>
</section>
<section>
<h2>Fixtures em Testes</h2>
<p>Fixtures em testes se aplicam a suíte inteira.</p>
<p>Para definir que um teste usa fixtures, é usada a
variável <code>fixtures</code> da classe.</p>
<pre><code class="hljs">
class ProductTest(StaticLiveServerTestCase):
fixtures = ['products.json']
</code></pre>
</section>
<section>
<h2>Fixtures em Produção</h2>
<p>Para criação das tabelas de banco de dados, usa-se
<code>python manage.py syncdb</code>.</p>
<p>Se houverem fixtures a serem carregadas, essas serão
injetadas no banco de dados durante o
<code>syncdb</code>.</p>
</section>
</section>
<section>
<section>
<h2>Signals</h2>
<p>Signals (sinais) são eventos gerados dentro do Django
para chamar funções de usuário em algumas
condições (normalmente relacionadas com models).</p>
<pre><code class="hljs">
from django.db.models.signals import pre_save
from django.dispatch import receiver
from models import Product
@receiver(post_save, sender=Product)
def after_saving_product(sender, instance, created, raw, using, update_fields):
# ...
</code></pre>
</section>
<section>
<h2>Signals</h2>
<ul>
<li>sender = o model sendo afetado.</li>
<li>instance = registro sendo alterado.</li>
<li>created = se é um novo registro ou não.</li>
<li>raw = registro salvo exatamente como indicado (fixtures).</li>
<li>using = alías do database sendo usado.</li>
<li>update_fields = campos sendo salvos no
<code>save()</code> (None se forem todos).</li>
</ul>
</section>
</section>
<section>
<section>
<h2>Templatetags</h2>
<p>Funções especiais para templates para apresentação de valores.</p>
</section>
<section>
<h2>
<small>Projeto &gt; App &gt;</small>
templatetags/
</h2>
<p>Dentro do diretório <code>templatetags</code> do App
ficam os módulos com os tags.</p>
<p>(Lembrar de colocar o arquivo <code>__init__.py</code> para que
o Python detecte o diretório como um módulo).</p>
</section>
<section>
<h2>
<small>Projeto &gt; App &gt; templatetags/</small>
filters.py
</h2>
<pre><code class="hljs">
def free(value):
if value == 0:
return _('Free')
return value
</code></pre>
</section>
<section>
<h2>
<small>Projeto &gt; App &gt; templates/</small>
product_info.html
</h2>
<pre><code class="hljs">
{{ product.price|free }}
</code></pre>
</section>
</section> </section>
</div> </div>
</div> </div>

152
python.html

@ -6,36 +6,34 @@
<title>Python</title> <title>Python</title>
<meta name="author" content="Julio Biason"> <meta name="description" content="A framework for easily creating beautiful presentations using HTML">
<meta name="author" content="Hakim El Hattab">
<meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
<link rel="stylesheet" href="_external/reveal.min.css"> <link rel="stylesheet" href="reveal.js/css/reveal.css">
<link rel="stylesheet" href="_external/default.css" id="theme"> <link rel="stylesheet" href="reveal.js/css/theme/night.css" id="theme">
<link rel='stylesheet' href='_external/hightlight-default.min.css'>
<!-- For syntax highlighting --> <!-- Code syntax highlighting -->
<!-- <link rel="stylesheet" href="_external/zenburn.css"> --> <link rel="stylesheet" href="reveal.js/lib/css/zenburn.css">
<link rel='stylesheet' href='_external/obsidian.css'>
<!-- If the query includes 'print-pdf', include the PDF print sheet --> <!-- Printing and PDF exports -->
<script> <script>
if( window.location.search.match( /print-pdf/gi ) ) {
var link = document.createElement( 'link' ); var link = document.createElement( 'link' );
link.rel = 'stylesheet'; link.rel = 'stylesheet';
link.type = 'text/css'; link.type = 'text/css';
link.href = '_external/pdf.css'; link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link ); document.getElementsByTagName( 'head' )[0].appendChild( link );
}
</script> </script>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="reveal.js/lib/js/html5shiv.js"></script> <script src="lib/js/html5shiv.js"></script>
<![endif]--> <![endif]-->
<!-- personal styles -->
<style> <style>
.semi-opaque { .semi-opaque {
background-color: rgba(0, 0, 0, 0.7); background-color: rgba(0, 0, 0, 0.7);
@ -49,7 +47,6 @@
</head> </head>
<body> <body>
<div class="reveal"> <div class="reveal">
<div class="slides"> <div class="slides">
<section data-background='_images/zen-of-python-poster-a3.png' class='semi-opaque'> <section data-background='_images/zen-of-python-poster-a3.png' class='semi-opaque'>
@ -160,18 +157,24 @@
usam CamelCase.</h5> usam CamelCase.</h5>
<p>Correto:</p> <p>Correto:</p>
<p><pre><code data-trim>
<pre><code class="hljs">
MinhaClasse MinhaClasse
minha_funcao() minha_funcao()
</code></pre></p> </code></pre>
<p>Errado:</p> <p>Errado:</p>
<p><pre><code data-trim>
<pre><code class="hljs">
minhaClasse minhaClasse
minhaFuncao() minhaFuncao()
</code></pre></p> </code></pre>
<pre><code class="hljs fragment">
CONSTANTES
</code></pre>
</section> </section>
<section> <section>
@ -202,18 +205,18 @@
<p>Correto:</p> <p>Correto:</p>
<p><pre><code data-trim> <pre><code class="hljs">
(1 + 2) (1 + 2)
array[1] array[1]
</code></pre></p> </code></pre>
<p>Errado:</p> <p>Errado:</p>
<p><pre><code data-trim> <pre><code class="hljs">
(1+2) (1+2)
( 1 + 2 ) ( 1 + 2 )
array [ 1 ] array [ 1 ]
</code></pre></p> </code></pre>
</section> </section>
<section> <section>
@ -221,14 +224,15 @@
<p>Correto:</p> <p>Correto:</p>
<p><pre><code data-trim> <pre><code class="hljs">
funcao(param=1) funcao(param=1)
</code></pre></p> </code></pre>
<p>Errado:</p> <p>Errado:</p>
<p><pre><code data-trim>
<pre><code class="hljs">
funcao(param = 1) funcao(param = 1)
</code></pre></p> </code></pre>
</section> </section>
<section> <section>
@ -250,7 +254,7 @@
</section> </section>
<section> <section>
<p><pre><code data-trim> <pre><code data-trim class='hljs'>
$ python $ python
Python 2.7.5 (default, Jun 25 2014, 10:19:55) Python 2.7.5 (default, Jun 25 2014, 10:19:55)
@ -517,10 +521,6 @@ True
<section> <section>
<p>Um objeto "iterável" é aquele que pode ter elementos <p>Um objeto "iterável" é aquele que pode ter elementos
acessados usando <code>[</code> e <code>]</code>.</p> acessados usando <code>[</code> e <code>]</code>.</p>
<p class='fragment'>(Na verdade, o objeto tem que ter um <i>generator</i>;
para acesar elementos diretamente, o objeto tem que implementar a função
<code>__getitem__</code>.)</p>
</section> </section>
<section> <section>
@ -720,7 +720,7 @@ iterável[start:end:step]
<section> <section>
<p><code>this</code>/<code>self</code> não é uma variável <p><code>this</code>/<code>self</code> não é uma variável
implícita da classe: Ela tem que constar <i>sempre</i> implícita da classe: Ela tem que constar <i>sempre</i>
na definiçào do método.</p> na definição do método.</p>
</section> </section>
<section> <section>
@ -728,10 +728,9 @@ iterável[start:end:step]
<p>Não existe função para o destrutor.</p> <p>Não existe função para o destrutor.</p>
<p class='fragment'>Existem ainda outras funções (como o <p class='fragment'>Existem ainda outras funções
<code>__getitem__</code> comentado anteriormente), mas <i>mágicas</i>, mas não vamos falar sobre elas
não vamos falar sobre elas nesse momento.</p> nesse momento.</p> </section>
</section>
<section> <section>
<p><pre><code data-trim> <p><pre><code data-trim>
@ -809,12 +808,14 @@ Julio
<section> <section>
<p>Propriedades podem ser injetadas a qualquer momento.</p> <p>Propriedades podem ser injetadas a qualquer momento.</p>
<pre><code class="hljs">
&gt;&gt;&gt; class A(object): &gt;&gt;&gt; class A(object):
&gt;&gt;&gt; def __init__(self): &gt;&gt;&gt; def __init__(self):
&gt;&gt;&gt; self.value = 10 &gt;&gt;&gt; self.value = 10
&gt;&gt;&gt; &gt;&gt;&gt;
&gt;&gt;&gt; a = A() &gt;&gt;&gt; a = A()
&gt;&gt;&gt; a.name = 'Julio' &gt;&gt;&gt; a.name = 'Julio'
</code></pre>
</section> </section>
</section> </section>
@ -951,29 +952,6 @@ Julio
<p>Saída de uma chamada desta função fica a cargo do leitor.</p> <p>Saída de uma chamada desta função fica a cargo do leitor.</p>
</section> </section>
<section>
<img src='_images/boring.gif'>
<p>BORING!</p>
</section>
<section>
<p>A parte legal dos stars não é usar para criar funções que aceitam
qualquer parâmetro (embora isso seja legal em alguns casos).</p>
<p>A parte legal é fazer chamadas de funções com dicionários.</p>
</section>
<section>
<p><pre><code data-trim>
&gt;&gt;&gt; def funcao(a, b, c):
&gt;&gt;&gt; return (a + b) / c
&gt;&gt;&gt;
&gt;&gt;&gt; params = {'b': 2, 'c': 3, 'a':10}
&gt;&gt;&gt; funcao(**params)
</code></pre></p>
</section>
</section> </section>
<section> <section>
@ -1084,6 +1062,34 @@ Julio
<p>Não precisa alterar nenhuma chamada de <code>retrieve</code>.</p> <p>Não precisa alterar nenhuma chamada de <code>retrieve</code>.</p>
</section> </section>
<section>
<p>Lembre-se: O resultado de uma função decorator é uma função.</p>
</section>
<section>
<h5>Decorators com classes</h5>
<pre><code class="hljs">
&gt;&gt;&gt; class CheckConn(object):
&gt;&gt;&gt; def __init__(self, func):
&gt;&gt;&gt; self.func = func
&gt;&gt;&gt;
&gt;&gt;&gt; def __call__(self, *args, **kwargs):
&gt;&gt;&gt; if 'connection' in kwargs:
&gt;&gt;&gt; connection = kwargs['connection']
&gt;&gt;&gt; else:
&gt;&gt;&gt; connection = args[0]
&gt;&gt;&gt;
&gt;&gt;&gt; if not connection.is_connected:
&gt;&gt;&gt; connection.retry()
&gt;&gt;&gt; self.func(*args, **kwargs)
&gt;&gt;&gt; @CheckCon
&gt;&gt;&gt; def retrieve(connection):
&gt;&gt;&gt; # retrieve
</code></pre>
</section>
</section> </section>
<section data-background='_images/thats-all-folks.jpg'> <section data-background='_images/thats-all-folks.jpg'>
@ -1092,11 +1098,11 @@ Julio
</div> </div>
</div> </div>
<script src="_external/head.min.js"></script> <script src="reveal.js/lib/js/head.min.js"></script>
<script src="_external/reveal.min.js"></script> <script src="reveal.js/js/reveal.js"></script>
<script> <script>
// Full list of configuration options available here: // Full list of configuration options available at:
// https://github.com/hakimel/reveal.js#configuration // https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({ Reveal.initialize({
controls: true, controls: true,
@ -1104,21 +1110,19 @@ Julio
history: true, history: true,
center: true, center: true,
theme: 'night', transition: 'slide', // none/fade/slide/convex/concave/zoom
transition: 'linear',
// Optional libraries used to extend on reveal.js // Optional reveal.js plugins
dependencies: [ dependencies: [
{ src: '_external/classList.js', condition: function() { return !document.body.classList; } }, { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: '_external/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '_external/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '_external/highlight.min.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, { src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.configure({languages: ['python']}); hljs.initHighlightingOnLoad(); } },
{ src: '_external/zoom.js', async: true, condition: function() { return !!document.body.classList; } }, { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
{ src: '_external/notes.js', async: true, condition: function() { return !!document.body.classList; } } { src: 'reveal.js/plugin/notes/notes.js', async: true }
] ]
}); });
</script> </script>
</body> </body>
</html> </html>

Loading…
Cancel
Save