Django Framework Web para Perfeccionistas Curso de Python - Sexta Aula Bruno Gama Catão - brunogamacatao@gmail.com
O que é Django ? • É um framework web focado em alta produtividade; • Principais recursos: • Mapeador objeto-relacional; • Interface administrativa automática; • Design elegante de URLs; • Sistema de templates; • Sitema de cache; • Internacionalização.
Sites que usam Django • Washington Post; • Lawrence; • Toronto Life; • Lista de sites que usam Django: • http://www.djangosites.org
Instalando • Site oficial: http://www.djangoproject.com • URL para download: • http://www.djangoproject.com/download/ • Descompacte o arquivo; • No diretório criado digite: • [Windows]: python setup.py install • [Linux/MacOs]: sudo python setup.py install
Conceitos básicos PROJETO Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação
Criando um projeto • No diretório onde você for criar seus projetos digite: • django-admin.py startproject meusite • Django criou para você os seguintes arquivos: meusite/ __init__.py manage.py settings.py urls.py
Criando um projeto • No diretório onde Lembre-se,nocriar seussão sempre você foros comandos digitados prompt ou terminal ! projetos digite: • django-admin.py startproject meusite • Django criou para você os seguintes arquivos: meusite/ __init__.py manage.py settings.py urls.py
Criando um projeto com PyDev • Selecione a opção de menu: • File→New→Project ... • Escolha: • Pydev→Pydev Django Project; • No project name escreva: meusite; • Clique em “Finish”.
Projeto criado
Entrando em detalhes • __init__.py: Arquivo vazio que diz que ao Python que o diretório meusite é um módulo; • manage.py: Arquivo contendo uma série de utilitários de linha de comando; • settings.py: Configurações gerais do projeto; • urls.py: Configurações das URLs do projeto.
Configurando um banco de dados • Todo projeto criado com Django está associado a um banco de dados; • Abra o arquivo settings.py
Definindo que banco de dados usar • Procure as seguintes linhas no arquivo settings.py: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # ... 'NAME': '', # ... 'USER': '', # ... 'PASSWORD': '', # ... 'HOST': '', # ... 'PORT': '', # ... } }
Definindo que banco de dados usar • Modifique para ficar assim: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'meusite.db', 'USER': '', # ... 'PASSWORD': '', # ... 'HOST': '', # ... 'PORT': '', # ... } }
Sincronizando o projeto com o banco de dados • Sempre que você fizer qualquer modificação relativa ao banco de dados do seu projeto, você deve sincronizar o projeto com o banco de dados; • Clique com o botão direito do mouse sobre o projeto e selecione: • Django→Sync DB
Criando o super usuário do projeto • Todo projeto em Django tem um super usuário; • Na primeira vez que você for sincronizar o projeto com o banco de dados, Django irá te perguntar se quer criar este super usuário: Digite ‘yes’, em seguida o nome do usuário, e-mail e a senha duas vezes.
Criando uma aplicação • Como já dissemos anteriormente, um projeto possui uma ou mais aplicações; • Nossa primeira aplicação será um site de notícias; • Para criar uma aplicação, clique com o botão direito do mouse sobre o projeto e selecione: • Django→Create application; • Digite noticias; • Clique “OK”.
Definindo as entidades • Edite o arquivo noticias/models.py: from django.db import models class Jornalista(models.Model): nome = models.CharField(max_length=100) class Categoria(models.Model): nome = models.CharField(max_length=100) class Noticia(models.Model): jornalista = models.ForeignKey(Jornalista) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=200) texto = models.TextField() data_publicacao = models.DateTimeField()
Aplicações instaladas • Para definir que aplicações estão instaladas em um projeto você deve editar o arquivo settings.py; • Localize as seguintes linhas: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', # Uncomment the next line to enable the admin: # 'django.contrib.admin', )
Aplicações instaladas • Para instalar o módulo de administração automática descomente a última linha: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.admin', )
Adicionando URLs • É necessário adicionar uma URL para a aplicação de administração automática; • Para isto modifique o arquivo meusite/urls.py: from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() Descomente urlpatterns = patterns('', # Example: # (r'^meusite/', include('meusite.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)), Descomente )
Sincronize o banco de dados • Clique com o botão direito do mouse sobre o projeto e selecione: • Django→Sync DB
Testando • Para testar se tudo correu bem, no prompt de comando (terminal) vá até o diretório onde está o arquivo manage.py do seu projeto e digite: • python manage.py runserver • Abra seguinte endereço no seu navegador: • http://localhost:8000/admin/
Digite o nome e senha do seu super usuário.
Onde estão as minhas entidades ?
Tornando entidades administráveis • Adicione no pacote meusite/noticias o módulo admin.py com o conteúdo: from meusite.noticias.models import * from django.contrib import admin admin.site.register(Jornalista) admin.site.register(Noticia) admin.site.register(Categoria)
Registrando a aplicação • Para instalar a aplicação de notícias modifique as INSTALLED_APPS do arquivo meusite/settings.py: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.admin', 'meusite.noticias' )
Reinicie o servidor • No terminal pressione CONTROL+C para parar o servidor; • Inicie novamente digitando: • python manage.py runserver • Abra seguinte endereço no seu navegador: • http://localhost:8000/admin/
Adicione algumas categorias, jornalistas e notícias. Popule o seu banco de dados. Habitue-se com Django.
As entidades apareceram !!! Adicione algumas categorias, jornalistas e notícias. Popule o seu banco de dados. Habitue-se com Django.
Algo não está muito bem :( • Veja as categorias que eu adicionei:
Algo não está muito bem :( • Veja as categorias que eu adicionei: Tem como eu visualizar isso melhor ?
Método __unicode__ • Abra o arquivo meusite/noticias/models.py: from django.db import models class Jornalista(models.Model): nome = models.CharField(max_length=100) def __unicode__(self): return self.nome class Categoria(models.Model): nome = models.CharField(max_length=100) def __unicode__(self): return self.nome class Noticia(models.Model): jornalista = models.ForeignKey(Jornalista) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=200) texto = models.TextField() data_publicacao = models.DateTimeField() def __unicode__(self): return self.titulo
Resultado
Resultado
Criando as suas páginas • Cada aplicação tem um módulo views.py; • Aí estão todas as funções por exibir as páginas deste módulo; • Cada aplicação deve ter um módulo urls.py que fará o mapeamento das urls para as funções do módulo views.py.
Hello World • Edite o arquivo meusite/noticias/views.py: from django.http import HttpResponse def index(request): return HttpResponse("Hello World !") • Crie um módulo urls.py no pacote meusite/ noticias: from django.conf.urls.defaults import * urlpatterns = patterns('meusite.noticias.views', (r'^$', 'index'), )
Configuração das URLs • Abra o arquivo meusite/urls.py: from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', (r'^admin/', include(admin.site.urls)), (r'^noticias/', include('meusite.noticias.urls')), )
Testando • Abra o seguinte endereço em seu navegador: • http://localhost:8000/noticias/
Utilizando templates • Não é muito prático (e bonito) colocar o código HTML diretamente dentro de módulos Python; • Podemos editar as páginas HTML externamente e utilizá-las a partir do nosso código.
Utilizando templates • Crie um diretório templates na raiz do seu projeto; • Crie um diretório noticias dentro do diretório templates; • Edite o arquivo meusite/settings.py, localize a linha que contém TEMPLATE_DIRS.
TEMPLARE_DIRS • Clique com o botão direito do mouse sobre o diretório templates; • Copie a localização do diretório (Location):
Arquivo settings.py • Altere a declaração da variável TEMPLATE_DIRS: TEMPLATE_DIRS = ( '/Users/brunocatao/Documents/workspace/meusite/templates' )
Atenção • O mundo da informática (linguagens, ferramentas, compiladores, etc) não foi feito para os acentos :( • Portanto, é importante você estar atendo ao encoding que você está usando; • Quando abrir o seu arquivo HTML para edição defina o encoding: • Selecione o menu Edit→Set Encoding... • Selecione Other: UTF-8.
Crie o seu template • Crie um arquivo chamado index.html no diretório templates/noticias: <html> <head> <title>Últimas Notícias</title> </head> <body> <h1>Veja as nossas últimas notícias:</h1> <ul> {% for noticia in noticias %} <li><b>{{noticia.categoria}}</b>: {{noticia.titulo}}</li> {% endfor %} </ul> </body> </html>
Exibindo as notícias • Modifique o seu arquivo meusite/noticias/views.py: from django.http import HttpResponse from django.shortcuts import render_to_response, get_object_or_404 from meusite.noticias.models import * def index(request): noticias = Noticia.objects.all().order_by('-data_publicacao') return render_to_response('noticias/index.html', {'noticias': noticias})
Exibindo o detalhe das notícias • Modifique o template index.html: <html> <head> <title>Últimas Notícias</title> </head> <body> <h1>Veja as nossas últimas notícias:</h1> <ul> {% for noticia in noticias %} <li><a href="/noticias/noticia/{{noticia.id}}"> <b>{{noticia.categoria}}</b>: {{noticia.titulo}}</a></li> {% endfor %} </ul> </body> </html>
Crie um template para os detalhes • Crie um arquivo (detalhe.html) na pasta templates/ noticias/detalhe.html: <html> <head> <title>{{noticia.titulo}}</title> </head> <body> <p>{{noticia.categoria}}: {{noticia.jornalista}}</p> <h1>{{noticia.titulo}}</h1> <h2>{{noticia.texto}}</h2> </body> </html>
Criando a função para exibir o detalhe • Modifique o seu arquivo meusite/noticias/views.py, adicione a seguinte função: def detalhe(request, noticia_id): noticia = get_object_or_404(Noticia, pk=noticia_id) return render_to_response('noticias/detalhe.html', {'noticia': noticia})
Associando a URL à função criada • Modifique o arquivo meusite/noticias/urls.py: from django.conf.urls.defaults import * urlpatterns = patterns('meusite.noticias.views', (r'^$', 'index'), (r'^noticia/(?P<noticia_id>d+)/$', 'detalhe'), )
Testando • Abra o seguinte endereço em seu navegador: • http://localhost:8000/noticias/
Limitando o número de notícias • Podemos limitar o número de notícias exibidas. Por exemplo, vamos modificar a função index do módulo views.py: from django.http import HttpResponse from django.shortcuts import render_to_response, get_object_or_404 from meusite.noticias.models import * def index(request): noticias = Noticia.objects.all().order_by('-data_publicacao')[:10] return render_to_response('noticias/index.html', {'noticias': noticias})
Testando • Adicione pelo menos 11 notícias e teste a sua aplicação; • Experimente mudar os templates; • Abra o seguinte endereço em seu navegador: • http://localhost:8000/noticias/

Python 06

  • 1.
    Django Framework Web para Perfeccionistas Curso de Python - Sexta Aula Bruno Gama Catão - brunogamacatao@gmail.com
  • 2.
    O que éDjango ? • É um framework web focado em alta produtividade; • Principais recursos: • Mapeador objeto-relacional; • Interface administrativa automática; • Design elegante de URLs; • Sistema de templates; • Sitema de cache; • Internacionalização.
  • 3.
    Sites que usamDjango • Washington Post; • Lawrence; • Toronto Life; • Lista de sites que usam Django: • http://www.djangosites.org
  • 4.
    Instalando • Site oficial: http://www.djangoproject.com • URL para download: • http://www.djangoproject.com/download/ • Descompacte o arquivo; • No diretório criado digite: • [Windows]: python setup.py install • [Linux/MacOs]: sudo python setup.py install
  • 5.
    Conceitos básicos PROJETO Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação Aplicação
  • 6.
    Criando um projeto •No diretório onde você for criar seus projetos digite: • django-admin.py startproject meusite • Django criou para você os seguintes arquivos: meusite/ __init__.py manage.py settings.py urls.py
  • 7.
    Criando um projeto •No diretório onde Lembre-se,nocriar seussão sempre você foros comandos digitados prompt ou terminal ! projetos digite: • django-admin.py startproject meusite • Django criou para você os seguintes arquivos: meusite/ __init__.py manage.py settings.py urls.py
  • 8.
    Criando um projeto com PyDev • Selecione a opção de menu: • File→New→Project ... • Escolha: • Pydev→Pydev Django Project; • No project name escreva: meusite; • Clique em “Finish”.
  • 9.
  • 10.
    Entrando em detalhes •__init__.py: Arquivo vazio que diz que ao Python que o diretório meusite é um módulo; • manage.py: Arquivo contendo uma série de utilitários de linha de comando; • settings.py: Configurações gerais do projeto; • urls.py: Configurações das URLs do projeto.
  • 11.
    Configurando um banco de dados • Todo projeto criado com Django está associado a um banco de dados; • Abra o arquivo settings.py
  • 12.
    Definindo que banco de dados usar • Procure as seguintes linhas no arquivo settings.py: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # ... 'NAME': '', # ... 'USER': '', # ... 'PASSWORD': '', # ... 'HOST': '', # ... 'PORT': '', # ... } }
  • 13.
    Definindo que banco de dados usar • Modifique para ficar assim: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'meusite.db', 'USER': '', # ... 'PASSWORD': '', # ... 'HOST': '', # ... 'PORT': '', # ... } }
  • 14.
    Sincronizando o projeto com o banco de dados • Sempre que você fizer qualquer modificação relativa ao banco de dados do seu projeto, você deve sincronizar o projeto com o banco de dados; • Clique com o botão direito do mouse sobre o projeto e selecione: • Django→Sync DB
  • 15.
    Criando o superusuário do projeto • Todo projeto em Django tem um super usuário; • Na primeira vez que você for sincronizar o projeto com o banco de dados, Django irá te perguntar se quer criar este super usuário: Digite ‘yes’, em seguida o nome do usuário, e-mail e a senha duas vezes.
  • 16.
    Criando uma aplicação •Como já dissemos anteriormente, um projeto possui uma ou mais aplicações; • Nossa primeira aplicação será um site de notícias; • Para criar uma aplicação, clique com o botão direito do mouse sobre o projeto e selecione: • Django→Create application; • Digite noticias; • Clique “OK”.
  • 17.
    Definindo as entidades •Edite o arquivo noticias/models.py: from django.db import models class Jornalista(models.Model): nome = models.CharField(max_length=100) class Categoria(models.Model): nome = models.CharField(max_length=100) class Noticia(models.Model): jornalista = models.ForeignKey(Jornalista) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=200) texto = models.TextField() data_publicacao = models.DateTimeField()
  • 18.
    Aplicações instaladas • Paradefinir que aplicações estão instaladas em um projeto você deve editar o arquivo settings.py; • Localize as seguintes linhas: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', # Uncomment the next line to enable the admin: # 'django.contrib.admin', )
  • 19.
    Aplicações instaladas • Parainstalar o módulo de administração automática descomente a última linha: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.admin', )
  • 20.
    Adicionando URLs • Énecessário adicionar uma URL para a aplicação de administração automática; • Para isto modifique o arquivo meusite/urls.py: from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() Descomente urlpatterns = patterns('', # Example: # (r'^meusite/', include('meusite.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)), Descomente )
  • 21.
    Sincronize o banco de dados • Clique com o botão direito do mouse sobre o projeto e selecione: • Django→Sync DB
  • 22.
    Testando • Para testarse tudo correu bem, no prompt de comando (terminal) vá até o diretório onde está o arquivo manage.py do seu projeto e digite: • python manage.py runserver • Abra seguinte endereço no seu navegador: • http://localhost:8000/admin/
  • 24.
    Digite o nomee senha do seu super usuário.
  • 26.
    Onde estão asminhas entidades ?
  • 27.
    Tornando entidades administráveis • Adicione no pacote meusite/noticias o módulo admin.py com o conteúdo: from meusite.noticias.models import * from django.contrib import admin admin.site.register(Jornalista) admin.site.register(Noticia) admin.site.register(Categoria)
  • 28.
    Registrando a aplicação •Para instalar a aplicação de notícias modifique as INSTALLED_APPS do arquivo meusite/settings.py: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.admin', 'meusite.noticias' )
  • 29.
    Reinicie o servidor •No terminal pressione CONTROL+C para parar o servidor; • Inicie novamente digitando: • python manage.py runserver • Abra seguinte endereço no seu navegador: • http://localhost:8000/admin/
  • 30.
    Adicione algumas categorias,jornalistas e notícias. Popule o seu banco de dados. Habitue-se com Django.
  • 31.
    As entidades apareceram!!! Adicione algumas categorias, jornalistas e notícias. Popule o seu banco de dados. Habitue-se com Django.
  • 32.
    Algo não estámuito bem :( • Veja as categorias que eu adicionei:
  • 33.
    Algo não estámuito bem :( • Veja as categorias que eu adicionei: Tem como eu visualizar isso melhor ?
  • 34.
    Método __unicode__ • Abrao arquivo meusite/noticias/models.py: from django.db import models class Jornalista(models.Model): nome = models.CharField(max_length=100) def __unicode__(self): return self.nome class Categoria(models.Model): nome = models.CharField(max_length=100) def __unicode__(self): return self.nome class Noticia(models.Model): jornalista = models.ForeignKey(Jornalista) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=200) texto = models.TextField() data_publicacao = models.DateTimeField() def __unicode__(self): return self.titulo
  • 35.
  • 36.
  • 37.
    Criando as suaspáginas • Cada aplicação tem um módulo views.py; • Aí estão todas as funções por exibir as páginas deste módulo; • Cada aplicação deve ter um módulo urls.py que fará o mapeamento das urls para as funções do módulo views.py.
  • 38.
    Hello World • Editeo arquivo meusite/noticias/views.py: from django.http import HttpResponse def index(request): return HttpResponse("Hello World !") • Crie um módulo urls.py no pacote meusite/ noticias: from django.conf.urls.defaults import * urlpatterns = patterns('meusite.noticias.views', (r'^$', 'index'), )
  • 39.
    Configuração das URLs • Abra o arquivo meusite/urls.py: from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', (r'^admin/', include(admin.site.urls)), (r'^noticias/', include('meusite.noticias.urls')), )
  • 40.
    Testando • Abra oseguinte endereço em seu navegador: • http://localhost:8000/noticias/
  • 41.
    Utilizando templates • Nãoé muito prático (e bonito) colocar o código HTML diretamente dentro de módulos Python; • Podemos editar as páginas HTML externamente e utilizá-las a partir do nosso código.
  • 42.
    Utilizando templates • Crieum diretório templates na raiz do seu projeto; • Crie um diretório noticias dentro do diretório templates; • Edite o arquivo meusite/settings.py, localize a linha que contém TEMPLATE_DIRS.
  • 43.
    TEMPLARE_DIRS • Clique como botão direito do mouse sobre o diretório templates; • Copie a localização do diretório (Location):
  • 44.
    Arquivo settings.py • Alterea declaração da variável TEMPLATE_DIRS: TEMPLATE_DIRS = ( '/Users/brunocatao/Documents/workspace/meusite/templates' )
  • 45.
    Atenção • O mundoda informática (linguagens, ferramentas, compiladores, etc) não foi feito para os acentos :( • Portanto, é importante você estar atendo ao encoding que você está usando; • Quando abrir o seu arquivo HTML para edição defina o encoding: • Selecione o menu Edit→Set Encoding... • Selecione Other: UTF-8.
  • 46.
    Crie o seutemplate • Crie um arquivo chamado index.html no diretório templates/noticias: <html> <head> <title>Últimas Notícias</title> </head> <body> <h1>Veja as nossas últimas notícias:</h1> <ul> {% for noticia in noticias %} <li><b>{{noticia.categoria}}</b>: {{noticia.titulo}}</li> {% endfor %} </ul> </body> </html>
  • 47.
    Exibindo as notícias • Modifique o seu arquivo meusite/noticias/views.py: from django.http import HttpResponse from django.shortcuts import render_to_response, get_object_or_404 from meusite.noticias.models import * def index(request): noticias = Noticia.objects.all().order_by('-data_publicacao') return render_to_response('noticias/index.html', {'noticias': noticias})
  • 48.
    Exibindo o detalhedas notícias • Modifique o template index.html: <html> <head> <title>Últimas Notícias</title> </head> <body> <h1>Veja as nossas últimas notícias:</h1> <ul> {% for noticia in noticias %} <li><a href="/noticias/noticia/{{noticia.id}}"> <b>{{noticia.categoria}}</b>: {{noticia.titulo}}</a></li> {% endfor %} </ul> </body> </html>
  • 49.
    Crie um templatepara os detalhes • Crie um arquivo (detalhe.html) na pasta templates/ noticias/detalhe.html: <html> <head> <title>{{noticia.titulo}}</title> </head> <body> <p>{{noticia.categoria}}: {{noticia.jornalista}}</p> <h1>{{noticia.titulo}}</h1> <h2>{{noticia.texto}}</h2> </body> </html>
  • 50.
    Criando a funçãopara exibir o detalhe • Modifique o seu arquivo meusite/noticias/views.py, adicione a seguinte função: def detalhe(request, noticia_id): noticia = get_object_or_404(Noticia, pk=noticia_id) return render_to_response('noticias/detalhe.html', {'noticia': noticia})
  • 51.
    Associando a URLà função criada • Modifique o arquivo meusite/noticias/urls.py: from django.conf.urls.defaults import * urlpatterns = patterns('meusite.noticias.views', (r'^$', 'index'), (r'^noticia/(?P<noticia_id>d+)/$', 'detalhe'), )
  • 52.
    Testando • Abra oseguinte endereço em seu navegador: • http://localhost:8000/noticias/
  • 53.
    Limitando o númerode notícias • Podemos limitar o número de notícias exibidas. Por exemplo, vamos modificar a função index do módulo views.py: from django.http import HttpResponse from django.shortcuts import render_to_response, get_object_or_404 from meusite.noticias.models import * def index(request): noticias = Noticia.objects.all().order_by('-data_publicacao')[:10] return render_to_response('noticias/index.html', {'noticias': noticias})
  • 54.
    Testando • Adicione pelomenos 11 notícias e teste a sua aplicação; • Experimente mudar os templates; • Abra o seguinte endereço em seu navegador: • http://localhost:8000/noticias/