SlideShare une entreprise Scribd logo
1  sur  175
Framework web para perfeccionistas
com prazos
O que vamos aprender hoje?
Ok. Mas quem é você?
Abheek
Gilson
Desenvolvedor há 5 anos
Visual Basic, Java e ASP
Python há 1 ano e meio
O que é
Django é um framework
web de alto nível que foca
no desenvolvimento
rápido, limpo e design
pragmático.
Django é um framework
web de alto nível que foca
no desenvolvimento
rápido, limpo e design
pragmático.
Django é um framework
web de alto nível que foca
no desenvolvimento
rápido, limpo e design
pragmático.
Documentação
http://django.me/design
História do Django
Adrian Holovaty
@adrianholovaty
Simon Willison
@simonw
Lawrence Journal
Jacob Kaplan Moss
@jacobian
Características
Mapeamento Objeto
Relacional ORM
Geração de Formulários
Forms e ModelForms
Interface Administrativa
Django Admin
Sistema de Templates
Internacionalização e
Localização
i18n e i10n
Desenvolvimento em
Camadas
MVC vs MTV
Model
Template
View
Desenvolvimento guiado à
Testes
TDD
URLs Flexíveis
Reusabilidade
Don't Repeat Yourself
Baterias Incluídas
Auth

Sites

Messages

Sitemap

Cache

Syndication (Feed)

Staticfiles

Markup

Logging

GeoDjango (Postgis)

Localflavors

Security
Quem usa?
Sistema de votações da
Engitec
engipolls
Sistema de Votações

●

●

O participante poderá votar nas palestras e
minicursos do evento, e deixar o seu
comentário;
Não é preciso login;
Sistema de Votações
●

A forma de votação será com três alternativas:
–
–

Legal;

–

●

Muito bom;
Ruim.

Gerenciar o resultado das votações.
Preparando o Ambiente
Ferramentas
Python 2.7
Django 1.4
Distribute
Pip & Virtualenv
dj-database-url
Unipath
Distribute

$ wget http://pythondistribute.org/distribute_setup.py
$ sudo python distribute_setup.py
Pip & Virtualenv

$ sudo easy_install pip virtualenv
Criando o ambiente

$ virtualenv --distribute --unzip-setuptools
engipolls
Ativando o ambiente

$ cd engipolls
$ source bin/activate
Unipath

$ pip install unipath==0.2.1
Django

$ pip install django==1.4.1
Criando Projeto

$ django-admin.py startproject src
engipolls/
src/
manage.py
src/
__init__.py
settings.py
urls.py
Organizando Projeto
$ cd engipolls
$ mv src/manage.py .
$ mv src/src/* src
$ rmdir src/src
engipolls/
manage.py
src/
__init__.py
settings.py
urls.py
Criando caminhos relativos

# src/settings.py
from unipath import Path
PROJECT_DIR = Path(__file__).parent
Configurando Banco de
Dados
dj-database-url

$ pip install dj-database-url==0.2.1
Banco de Dados
import dj_database_url
DATABASES = {
'default': dj_database_url.config(
default='sqlite:///' +
PROJECT_DIR.child('engipolls.db'))
}
syncdb

$ python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
You just installed Django's auth system, which
means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'gilson'): admin
E-mail address: contato@gilsondev.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Criando a aplicação
$ python manage.py startapp talks
$ mv talks src/
src/settings.py
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin
documentation:
# 'django.contrib.admindocs',
'src.talks',
talks/tests.py
# -*- coding: utf8 -*from django.test import TestCase
class TalkUrlTest(TestCase):
def test_get_talk_form(self):
'''Retorna status 200 da lista de
palestras'''
response = self.client.get('/')
self.assertEquals(response.status_code,
200)
E
===========================================================
===========
ERROR: test_get_talk_form (src.talks.tests.TalkUrlTest)
Retorna status 200 da lista de palestras
--------------------------------------------------------------------...
template, origin = find_template(template_name)
File
"/home/gilson/Projects/engipolls/local/lib/python2.7/sitepackages/django/template/loader.py", line 138, in
find_template
raise TemplateDoesNotExist(name)
TemplateDoesNotExist: 404.html
-----------------------------------------------------------
Templates: 404 e 500.html

$ mkdir src/templates
$ touch src/templates/{404,500}.html
src/setttings.py

TEMPLATE_DIRS = (
PROJECT_DIR.child('templates'),
)
Creating test database for alias 'default'...
F
===========================================================
===========
FAIL: test_get_talk_form (src.talks.tests.TalkUrlTest)
Retorna status 200 da lista de palestras
--------------------------------------------------------------------...
File
"/home/gilson/Projects/engipolls/src/talks/tests.py", line
10, in test_get_talk_form
self.assertEquals(response.status_code, 200)
AssertionError: 404 != 200
---------------------------------------------------------------------
Rotas
page.php
script.cgi?pageid=144
StoryPage.aspx
0,2097,1-1-30-72-707-4027,00.html
/products/new/
/products/1/details/
/about/
src/urls.py

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'src.talks.views.home', name='home'),
)
$ python manage.py test talks
Creating test database for alias 'default'...
E
===========================================================
===========
ERROR: test_get_talk_form (src.talks.tests.TalkUrlTest)
Retorna status 200 da lista de palestras
--------------------------------------------------------------------...
ViewDoesNotExist: Could not import src.talks.views.home.
View does not exist in module src.talks.views.
--------------------------------------------------------------------Ran 1 test in 0.026s
Fluxo HTTP
●

●

GET
/

●

ROOT_URLCONF

●

src.urls

●

url(r'^$',

●

home(request)

'src.talks.views.home')
Documentação
http://django.me/urls
Views
talks/views.py
# -*- coding: utf8 -*from django.http import HttpResponse
def home(request):
return HttpResponse()
$ python manage.py tests talks
Creating test database for alias 'default'...
.
--------------------------------------------------------------------Ran 1 test in 0.014s
Refatorando
# -*- coding: utf8 -*-

talks/tests.py

from django.test import TestCase
from django.core.urlresolvers import reverse

class TalkUrlTest(TestCase):
def test_get_talk_form(self):
'''Retorna status 200 da lista de
palestras'''
response =
self.client.get(reverse('home'))
self.assertEquals(response.status_code,
$ python manage.py test talks
Creating test database for alias 'default'...
.
--------------------------------------------------------------------Ran 1 test in 0.014s
# -*- coding: utf8 -*-

talks/tests.py

from django.test import TestCase
from django.core.urlresolvers import reverse
class TalkUrlTest(TestCase):
def setUp(self):
self.resp = self.client.get(reverse('home'))
def test_get_talk_form(self):
'''Retorna status 200 da lista de
palestras'''
self.assertEquals(self.resp.status_code,
200)
$ python manage.py test talks
Creating test database for alias 'default'...
.
--------------------------------------------------------------------Ran 1 test in 0.014s
talks/tests.py
# -*- coding: utf8 -*from django.test import TestCase
from django.core.urlresolvers import reverse
class TalkUrlTest(TestCase):
# ...
def test_template(self):
'''Renderiza template para enviar na resposta'''
self.assertTemplateUsed(self.resp,
'talks/talks_list.html')
.F
===========================================================
===========
FAIL: test_template (src.talks.tests.TalkUrlTest)
Usa o template talks/talks_list.html
--------------------------------------------------------------------...
File
"/home/gilson/Projects/engipolls/local/lib/python2.7/sitepackages/django/test/testcases.py", line 741, in
assertTemplateUsed
self.fail(msg_prefix + "No templates used to render the
response")
AssertionError: No templates used to render the response
-----------------------------------------------------------
# -*- coding: utf8 -*from django.http import HttpResponse
from django.template import loader, Context

def home(request):
t =
loader.get_template('talks/talks_list.html')
c = Context()
content = t.render(c)
return HttpResponse(content)
Creating test database for alias 'default'...
EE
===========================================================
===========
ERROR: test_get_talk_form (src.talks.tests.TalkUrlTest)
Retorna status 200 da lista de palestras
---------------------------------------------------------------------...
TemplateDoesNotExist: talks/talks_list.html
===========================================================
===========
ERROR: test_template (src.talks.tests.TalkUrlTest)
Renderiza template para enviar na resposta
--------------------------------------------------------------------...
TemplateDoesNotExist: talks/talks_list.html
-----------------------------------------------------------
Django Templates
Carregando templates
src/settings.py
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader'
,
#
)

'django.template.loaders.eggs.Loader',
app_directories.Loader

# crie a pasta templates e subpasta talks na
aplicação
$ mkdir -p src/talks/templates/talks
$ touch
src/talks/templates/talks/talks_list.html
$ python manage.py test talks
Creating test database for alias 'default'...
..
--------------------------------------------------------------------Ran 2 tests in 0.025s
Django Models
O que é Models?
Exemplo de Model

class Talk(models.Model):
name = models.CharField(max_length=100)
resume = models.TextField()
at = models.DateTimeField(auto_now_add=True)
talker = models.TextField(max_length=80)
Agora é só fazer
Agora é só fazer
mas criar o teste, é claro!
import datetime
# …
from .models import Talk
class TalkModelTest(TestCase):
def setUp(self):
self.talk = Talk.objects.create(
name=u”O que é Python?”,
resume=u”Palestra sobre Python”,
at=datetime.datetime.now(),
talker=”Guido Van Rossum”
)
def test_create(self):
'''Registra a palestra corretamente'''
self.assertEquals(self.talk.pk, 1)
$ python manage.py test talks
Traceback (most recent call last):
...
File
"/home/gilson/Projects/engipolls/src/talks/tests.py", line
7, in <module>
from .models import Talk
ImportError: cannot import name Talk
talks/models.py

class Talk(models.Model):
name = models.CharField(max_length=100)
resume = models.TextField()
at = models.DateTimeField(auto_now_add=True)
talker = models.TextField(max_length=80)
$ python manage.py test talks
Creating test database for alias 'default'...
...
--------------------------------------------------------------------Ran 3 tests in 0.027s
# -*- coding: utf8 -*import datetime
# …
from .models import Talk
class TalkModelTest(TestCase):
# ...
def test_unicode(self):
'''É usado para a representação do objeto'''
self.assertEquals(
u'Palestra: O que é Python?',
unicode(self.talk))
Creating test database for alias 'default'...
.F..
===========================================================
===========
FAIL: test_unicode (src.talks.tests.TalkModelTest)
É usado para retornar a representação do objeto
--------------------------------------------------------------------...
AssertionError: u'Palestra: O que xe9 Python?' != u'Talk
object'
- Palestra: O que xe9 Python?
+ Talk object
--------------------------------------------------------------------Ran 4 tests in 0.047s
talks/models.py
class Talk(models.Model):
name = models.CharField(max_length=100)
resume = models.TextField()
at = models.DateTimeField(auto_now_add=True)
talker = models.TextField(max_length=80)
def __unicode__(self):
return “Palestra: %s” % (self.name,)
$ python manage.py test talks
Creating test database for alias 'default'...
....
--------------------------------------------------------------------Ran 4 tests in 0.030s
Django Models
Meta options
talks/models.py
class Talk(models.Model):
# ...
class Meta:
verbose_name = u”Palestra”
db_table = “talks”
ordering = ['at,']
def __unicode__(self):
return “Palestra: %s” % (self.name,)
Minicurso
●

Dados para cadastro:
–

Nome do minicurso;

–

Resumo;

–

Hora do minicurso;

–

Palestrante.
Palestra == Minicurso
talks/tests.py
class TalkModelTest(TestCase):
def setUp(self):
self.talk = Talk.objects.create(
name=u”O que é Python?”,
resume=u”Palestra sobre Python”,
at=datetime.datetime.now(),
talker=”Guido Van Rossum”,
type_talk='P'
)
def test_create(self):
'''Registra a palestra corretamente'''
self.assertEquals(self.talk.pk, 1)
=============================================================
=========
ERROR: test_create (src.talks.tests.TalkModelTest)
Registra a palestra corretamente
--------------------------------------------------------------------...
TypeError: 'type_talk' is an invalid keyword argument for
this function
=============================================================
=========
ERROR: test_unicode (src.talks.tests.TalkModelTest)
É usado para retornar a representação do objeto
--------------------------------------------------------------------...
TypeError: 'type_talk' is an invalid keyword argument for
class Talk(models.Model):

talks/models.py

TALK_CHOICES = (
('P', u'Palestra'),
('M', u'Minicurso'),
)
# ...
type_talk = models.CharField(max_length=1,
choices=TALK_CHOICES)
# ...
def __unicode__(self):
if self.type_talk == 'P':
return “Palestra: %s” % (self.name,)
elif self.type_talk == 'M':
$ python manage.py test talks
Creating test database for alias 'default'...
....
--------------------------------------------------------------------Ran 4 tests in 0.033s
Atualizando banco
$ python manage.py syncdb
Creating tables ...
Creating table talks_talk
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Votação
●

Dados para cadastro:
–

Palestra/Minicurso;

–

Tipo de votação (Muito bom, legal e ruim);

–

Comentários;
talks/models.py
class Poll(models.Model):
POLL_CHOICES = (
(u'B', u'Muito Bom'),
(u'L', u'Legal'),
(u'R', u'Ruim'),
)
talk = models.ForeignKey('Talk', max_length=100)
poll = models.CharField(max_length=1,
choices=POLL_CHOICES)
comments = models.TextField(max_length=180,
blank=True)
def __unicode__(self):
Documentação
http://django.me/models
http://django.me/metaoptions
Querysets
Demonstração
Painel Administrativo
Django Admin
src/settings.py
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
)
src/urls.py
# ...
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# ...
url(r'^admin/', include(admin.site.urls)),
)
Atualizando banco
$ python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
Inserindo talk no Admin
talks/admin.py
# -*- coding: utf8 -*from django.contrib import admin
from .models import Talk
admin.site.register(Talk)
$ python manage.py runserver
Validating models...
0 errors found
Django version 1.4.1, using settings
'src.settings'
Development server is running at
http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Internacionalização
i18n
src/settings.py

TIME_ZONE = 'America/Sao_Paulo'
LANGUAGE_CODE = 'pt-br'
talks/models.py
# …
from django.utils.translation import ugettext as _
class Talk(models.Model):
TALK_CHOICES = (
('P', _(u'Palestra')),
('M', _(u'Minicurso')),
)
# ...
talks/models.py

# …
class Talk(models.Model):

name = models.CharField(_(u'Nome da Sessão'),
max_length=100)
resume = models.TextField(_(u'Resumo'))
at = models.DateTimeField(_(u'Data da sessão'),
auto_now_add=True)
talker = models.TextField(_(u'Palestrante'),
max_length=80)
type_talk = models.CharField(_(u'Tipo da Sessão'),
max_length=1,
choices=TALK_CHOICES)
Django Admin
Filtros
talks/admin.py
# -*- coding: utf8 -*from django.contrib import admin
from .models import Talk
class TalkAdmin(admin.ModelAdmin):
list_filter = ['at', 'type_talk']
admin.site.register(Talk, TalkAdmin)
Django Admin
Pesquisa
talks/admin.py
# -*- coding: utf8 -*from django.contrib import admin
from .models import Talk
class TalkAdmin(admin.ModelAdmin):
list_filter = ['at', 'type_talk']
search_fields = ('name',)
admin.site.register(Talk, TalkAdmin)
Django Admin
List Display
talks/admin.py
# -*- coding: utf8 -*from django.contrib import admin
from .models import Talk
class TalkAdmin(admin.ModelAdmin):
list_display = ('name', 'at', 'type_talk',)
list_filter = ['at', 'type_talk']
search_fields = ('name',)
admin.site.register(Talk, TalkAdmin)
Documentação
http://django.me/admin
talks/views.py
# -*- coding: utf8 -*from django.shortcuts import render
def home(request):
return render(request, 'talks/talks_list.html',
{})
$ python manage.py test talks
Creating test database for alias 'default'...
....
--------------------------------------------------------------------Ran 4 tests in 0.033s
talks/views.py
# -*- coding: utf8 -*from django.shortcuts import render
from .models import Talk
def home(request):
talks = Talk.objects.all()
return render(request, 'talks/talks_list.html',
{
'talks': talks,
})
<!DOCTYPE HTML>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Engipolls</title>
</head>
<body>
<h1>Lista de Palestras e Minicursos</h1>
{% for talk in talks %}
<h3>{{ talk.name }}</h3>
<p>{{ talk.resume }}</p>
<p>Horário: {{ talk.at|date:"d/M/Y" }}</p>
{% endfor %}
</body>
</html>
src/templates/base.html
<!DOCTYPE HTML>

<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Engipolls</title>
</head>
<body>
{% block content %}{% endblock content %}
</body>
</html>
talks_list.html
{% extends “base.html” %}
{% block content %}
<h1>Lista de Palestras e Minicursos</h1>
{% for talk in talks %}
<h3>{{ talk.name }}</h3>
<p>{{ talk.resume }}</p>
<p>Horário: {{ talk.at|date:"d/M/Y" }}</p>
{% endfor %}
{% endblock content %}
talks_list.html
{% for talk in talks %}
<h3>{{ talk.name }}</h3>
<p>{{ talk.resume }}</p>
<p>
Horário: {{ talk.at|date:"d/M/Y" }}
<a href=”#”>Votar agora</a>
</p>
<!-- (…) -->
Formulários
Django Forms
Criando arquivo

$ touch src/talks/forms.py
Formulários
Exemplo
talks/forms.py
# -*- coding: utf8 -*from django import forms

class TalkForm(forms.Form):
TALK_CHOICES = (
('P', _(u'Palestra')),
('M', _(u'Minicurso')),
)
name = forms.CharField(label=u'Nome da Sessão')
resume = forms.CharField(label=u'Resumo', widget=forms.Textarea)
at = forms.DateTimeField(label=u'Data da Sessão')
talker = forms.CharField(label=u'Palestrante')
type_talk = forms.ChoiceField(label=u'Tipo de Sessão', choices=TALK_CHOICES)
talks/forms.py
# -*- coding: utf8 -*from django import forms
from .models import Talk
class TalkForm(forms.Form):
TALK_CHOICES = (
('P', _(u'Palestra')),
('M', _(u'Minicurso')),
)
name = forms.CharField(label=u'Nome da Sessão')
resume = forms.CharField(label=u'Resumo', widget=forms.Textarea)
at = forms.DateTimeField(label=u'Data da Sessão')
class Meta:
model = Talk
Formulários
Criando PollForm
talks/forms.py
# -*- coding: utf8 -*from django import forms
from .models import Poll
class PollForm(forms.Form):
class Meta:
model = Poll
talks/urls.py
urlpatterns = patterns('',
# ...
url(r'^votacao/(?P<talk_id>[d]+)/$',
'src.talks.views.poll_form',
name='poll_form'),
)
talks/views.py
# -*- coding: utf8 -*from django import forms
from .forms import PollForm
def poll_form(request, talk_id):
return render(request, 'talks/polls_form.html', {
'form': PollForm(),
})
templates/talks/polls_form.ht
ml
{% extends “base.html” %}
{% block content %}
<form action="." method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Salvar Votação" />
</form>
{% endblock content %}
talks/forms.py
# -*- coding: utf8 -*from django import forms
from .models import Poll
class PollForm(forms.Form):
class Meta:
model = Poll
exclude = ('talk',)
talks/views.py
# …
from django.shortcuts import get_object_or_404
from .models import Talk
def poll_form(request, talk_id):
talk = get_object_or_404(Talk, pk=talk_id)
if request.method == 'POST':
form = PollForm(request.POST)
if form.is_valid():
poll = form.save(commit=False)
poll.talk = talk
poll.save()
return render(request, 'talks/polls_form.html', {
'form': PollForm(),
})
talks/views.py
# …
from django.shortcuts import redirect
if form.is_valid():
poll = form.save(commit=False)
poll.talk = talk
poll.save()
return redirect('/votacoes/sucesso')
return render(request, 'talks/polls_form.html', {
'form': PollForm(),
})
talks_list.html
{% for talk in talks %}
<h3>{{ talk.name }}</h3>
<p>{{ talk.resume }}</p>
<p>
Horário: {{ talk.at|date:"d/M/Y" }}
<a href=”{% url poll_form %}”>Votar
agora</a>
</p>
<!-- (…) -->
talks/urls.py
urlpatterns = patterns('',
# ...
url(r'^votacoes/sucesso/$',
'src.talks.views.success',
name='success'),
)
talks/views.py

# …
def success(request):
return render(request,
'talks/polls_success.html', {})
templates/talks/polls_success
.html
{% extends “base.html” %}
{% block content %}
<h2>Sua votação foi efetuada com sucesso!</h2>
<p>Continue com a votação <a href=”{% url home
%}”>aqui</a></p>
{% endblock content %}
Dicas Finais
http://welcometothedjango.com.br
Desenvolvimento Ágil com Python e
Django
http://docs.djangoproject.com
https://github.com/nathanborror/django-basic-ap
Obrigado!
contato@gilsondev.com
@gilsonfilho
blog.gilsondev.com
http://github.com/gilsondev

Contenu connexe

Tendances

Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson
 
UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018
UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018
UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018
Tobias Schneck
 
Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks
Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalksSelenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks
Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks
Lohika_Odessa_TechTalks
 
Django tutorial 2009
Django tutorial 2009Django tutorial 2009
Django tutorial 2009
Ferenc Szalai
 

Tendances (20)

Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Unit and functional testing with Siesta
Unit and functional testing with SiestaUnit and functional testing with Siesta
Unit and functional testing with Siesta
 
Workshop quality assurance for php projects - phpdublin
Workshop quality assurance for php projects - phpdublinWorkshop quality assurance for php projects - phpdublin
Workshop quality assurance for php projects - phpdublin
 
Token Testing Slides
Token  Testing SlidesToken  Testing Slides
Token Testing Slides
 
UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018
UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018
UI-Testing - Selenium? Rich-Clients? Containers? @APEX connect 2018
 
Testing ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NETTesting ASP.NET - Progressive.NET
Testing ASP.NET - Progressive.NET
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
 
Nashville Symfony Functional Testing
Nashville Symfony Functional TestingNashville Symfony Functional Testing
Nashville Symfony Functional Testing
 
Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to Protractor
 
Jasmine BDD for Javascript
Jasmine BDD for JavascriptJasmine BDD for Javascript
Jasmine BDD for Javascript
 
Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks
Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalksSelenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks
Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks
 
Mozilla Web QA - Evolution of our Python WebDriver framework
Mozilla Web QA - Evolution of our Python WebDriver frameworkMozilla Web QA - Evolution of our Python WebDriver framework
Mozilla Web QA - Evolution of our Python WebDriver framework
 
Protractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applicationsProtractor framework – how to make stable e2e tests for Angular applications
Protractor framework – how to make stable e2e tests for Angular applications
 
Django tutorial 2009
Django tutorial 2009Django tutorial 2009
Django tutorial 2009
 
Django Testing
Django TestingDjango Testing
Django Testing
 
Better Bullshit Driven Development [SeleniumCamp 2017]
Better Bullshit Driven Development [SeleniumCamp 2017]Better Bullshit Driven Development [SeleniumCamp 2017]
Better Bullshit Driven Development [SeleniumCamp 2017]
 
HtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObjectHtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObject
 
Testing Javascript with Jasmine
Testing Javascript with JasmineTesting Javascript with Jasmine
Testing Javascript with Jasmine
 
A few good JavaScript development tools
A few good JavaScript development toolsA few good JavaScript development tools
A few good JavaScript development tools
 

Similaire à Engitec - Minicurso de Django

django_introduction20141030
django_introduction20141030django_introduction20141030
django_introduction20141030
Kevin Wu
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App Engine
Yared Ayalew
 
Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)
Jacob Kaplan-Moss
 
Making the most of your Test Suite
Making the most of your Test SuiteMaking the most of your Test Suite
Making the most of your Test Suite
ericholscher
 

Similaire à Engitec - Minicurso de Django (20)

Django tricks (2)
Django tricks (2)Django tricks (2)
Django tricks (2)
 
Django for mobile applications
Django for mobile applicationsDjango for mobile applications
Django for mobile applications
 
Django web framework
Django web frameworkDjango web framework
Django web framework
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
 
django_introduction20141030
django_introduction20141030django_introduction20141030
django_introduction20141030
 
Django for Beginners
Django for BeginnersDjango for Beginners
Django for Beginners
 
Performance and Scalability Testing with Python and Multi-Mechanize
Performance and Scalability Testing with Python and Multi-MechanizePerformance and Scalability Testing with Python and Multi-Mechanize
Performance and Scalability Testing with Python and Multi-Mechanize
 
Django
DjangoDjango
Django
 
Mini Curso de Django
Mini Curso de DjangoMini Curso de Django
Mini Curso de Django
 
GDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App EngineGDG Addis - An Introduction to Django and App Engine
GDG Addis - An Introduction to Django and App Engine
 
Hands on django part 1
Hands on django part 1Hands on django part 1
Hands on django part 1
 
Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)Introduction To Django (Strange Loop 2011)
Introduction To Django (Strange Loop 2011)
 
Node.js vs Play Framework (with Japanese subtitles)
Node.js vs Play Framework (with Japanese subtitles)Node.js vs Play Framework (with Japanese subtitles)
Node.js vs Play Framework (with Japanese subtitles)
 
Mini Curso Django Ii Congresso Academico Ces
Mini Curso Django Ii Congresso Academico CesMini Curso Django Ii Congresso Academico Ces
Mini Curso Django Ii Congresso Academico Ces
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJS
 
web2py:Web development like a boss
web2py:Web development like a bossweb2py:Web development like a boss
web2py:Web development like a boss
 
Web development with django - Basics Presentation
Web development with django - Basics PresentationWeb development with django - Basics Presentation
Web development with django - Basics Presentation
 
Making the most of your Test Suite
Making the most of your Test SuiteMaking the most of your Test Suite
Making the most of your Test Suite
 
Continuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukContinuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin Stachniuk
 

Dernier

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Dernier (20)

What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
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
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 

Engitec - Minicurso de Django