Solucionado (ver solução)
Solucionado
(ver solução)
28
respostas

Dúvida no Ex. 1 da Aula 6 - Convidando perfis

Consegue me auxiliar a encontrar o erro?

ImportError at /
No module named views
Request Method:    GET
Request URL:    http://localhost:8000/
Django Version:    1.8.4
Exception Type:    ImportError
Exception Value:    
No module named views
Exception Location:    /usr/lib/python2.7/importlib/__init__.py in import_module, line 37
Python Executable:    /usr/bin/python
Python Version:    2.7.6
Python Path:    
['/home/fabricio/Documentos/python/connectedin',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time:    Thu, 22 Oct 2015 10:06:46 +0000

TRACEBACK

Environment:


Request Method: GET
Request URL: http://localhost:8000/

Django Version: 1.8.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'perfis')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  119.                 resolver_match = resolver.resolve(request.path_info)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve
  368.                     sub_match = pattern.resolve(new_path)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve
  368.                     sub_match = pattern.resolve(new_path)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve
  240.             return ResolverMatch(self.callback, args, kwargs, self.name)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in callback
  247.         self._callback = get_callable(self._callback_str)
File "/usr/local/lib/python2.7/dist-packages/django/utils/lru_cache.py" in wrapper
  101.                     result = user_function(*args, **kwds)
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in get_callable
  106.         mod = import_module(mod_name)
File "/usr/lib/python2.7/importlib/__init__.py" in import_module
  37.     __import__(name)

Exception Type: ImportError at /
Exception Value: No module named views
28 respostas

Qual passo você tentou executar? Quando da erro? Cole seu código envolvido com a tarefa.

De cara ele já diz o problema

No module named views

Verifique o import e o nome do arquivo.

views.py

    from django.http import HttpResponse

    from perfis.models import Perfil

    from django.shortcuts import redirect

    def convidar(request, perfil_id):

        perfil_a_convidar = Perfil.objects.get(id=perfil_id)
        perfil_logado = get_perfil_logado(request)
        perfil_logado.convidar(perfil_a_convidar)

        # realizando redirecionamento
        return redirect('index')

    def get_perfil_logado(request):
        return Perfil.objects.get(id=1)"

################################################
models.py

    from django.http import HttpResponse
    from perfis.models import Perfil

    from django.shortcuts import redirect

    def convidar(request, perfil_id):

        perfil_a_convidar = Perfil.objects.get(id=perfil_id)
        perfil_logado = get_perfil_logado(request)
        perfil_logado.convidar(perfil_a_convidar)

    # realizando redirecionamento
        return redirect('index')

    def get_perfil_logado(request):
        return Perfil.objects.get(id=1)


urls.py

    from django.conf.urls import patterns, url
    from perfis import views
    urlpatterns = patterns('',
        url(r'^$', 'views.index', name='index'),
        url(r'^perfis/(?P<perfil_id>\d+)$', 'views.exibir', name='exibir'),
        url(r'^perfis/(?P<perfil_id>\d+)/convidar$', 'views.convidar',              name='convidar')
    )
# connectedin/perfis/urls.py

from django.conf.urls import patterns, url
from perfis import views

urlpatterns = patterns('',
            url(r'^$', 'views.index', name='index'),
            url(r'^perfis/(?P<perfil_id>\d+)$', 'views.exibir', name='exibir'),
        url(r'^perfis/(?P<perfil_id>\d+)/convidar$', 'views.convidar', name='convidar')

)

Verificou o import e o arquivo? O erro é esse.

Exception Type: ImportError

Sim, eu li o erro ...

Então, olhando seu código:

# connectedin/perfis/urls.py

from django.conf.urls import patterns, url
from perfis import views

urlpatterns = patterns('',
            url(r'^$', 'views.index', name='index'),
            url(r'^perfis/(?P<perfil_id>\d+)$', 'views.exibir', name='exibir'),
        url(r'^perfis/(?P<perfil_id>\d+)/convidar$', 'views.convidar', name='convidar')

)

Parece estar tudo OK, porém ele não está conseguindo importar o módulo views. Isso acontece caso você tenha criado o arquivo views.py em outra pasta. Isso não posso verificar por você, então, dá uma olhadinha no passo que esse arquivo é criado. Tudo bem? Talvez você tenha colocado o arquivo em outro diretório.

Aguardo seu feedback.

obs: pelo o que entendi, você não conseguiu achar o problema com minha dica inicial, quando por assim, pode dizer que ainda não entendeu. Eu começo da explicaçào mais simples e vou indo para a mais complexa :)

Não faço idéia do que pode ser, o arquivo está no mesmo diretório que models e urls.py.

root@localhost:~/Documentos/python/connectedin/perfis# ls -ltr
total 48
-rwxrwxrwx 1 fabricio fabricio   60 Mar 24  2015 tests.py
-rwxrwxrwx 1 fabricio fabricio    0 Mar 24  2015 __init__.py
-rwxrwxrwx 1 fabricio fabricio   63 Mar 24  2015 admin.py
-rw-r--r-- 1 root     root      150 Set 29 10:41 __init__.pyc
-rw-r--r-- 1 root     root      207 Set 29 10:41 admin.pyc
drwxrwxrwx 2 fabricio fabricio 4096 Out 22 07:19 templates
drwxrwxrwx 2 fabricio fabricio 4096 Out 22 07:56 migrations
-rw-r--r-- 1 root     root      918 Out 22 10:34 views.pyc
-rwxrwxrwx 1 fabricio fabricio  513 Out 22 11:07 models.py
-rw-r--r-- 1 root     root      986 Out 22 11:07 models.pyc
-rw-r--r-- 1 root     root      540 Out 22 11:09 urls.pyc
-rwxrwxrwx 1 fabricio fabricio  625 Out 22 11:11 urls.py
-rwxrwxrwx 1 fabricio fabricio  465 Out 22 11:13 views.py
root@localhost:~/Documentos/python/connectedin/perfis# pwd
/home/fabricio/Documentos/python/connectedin/perfis

esqueci da formatação

O urls.py que você editou esta em qual diretório? O que você editou....

Está em ~/Documentos/python/connectedin/perfis, junto com os outros arquivos: models.py e views.py

Você se confundiu ai nos arquivos, o seu arquivo # connectedin/perfis/urls.py não é para ter esse conteúdo. Parece que você copiou os arquivo de um lado para outro, não faço a menor ideia porque você deixou ele assim.

Vou resumir a solução baixo:

Bom, resumindo problema, você está fazendo um import desnecessário:

# connectedin/perfis/urls.py

from django.conf.urls import patterns, url
from perfis import views ## tem que remover, não é para estar aqui!

urlpatterns = patterns('',
            url(r'^$', 'views.index', name='index'),
            url(r'^perfis/(?P<perfil_id>\d+)$', 'views.exibir', name='exibir'),
        url(r'^perfis/(?P<perfil_id>\d+)/convidar$', 'views.convidar', name='convidar')

)

Mas se você quiser importar, seria asssim:

# connectedin/perfis/urls.py

from django.conf.urls import patterns, url
from perfis import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^perfis/(?P<perfil_id>\d+)$', views.exibir, name='exibir'),
    url(r'^perfis/(?P<perfil_id>\d+)/convidar$', views.convidar, name='convidar'),
)

O arquivo views.py deve estar dentro de connectedin/perfis/views.py.

Verifique também o arquivo connectedin/connectedin/settings.py. Você adicionou a aplicação perfis lá?

O que acho estranho é que você chegou até o capítulo 6 e só começou a dar problema agora. Vamos descobrir.

connectedin/connectedin/settings.py -- OK

Mesmo removendo

from perfis import views ## tem que remover, não é para estar aqui!

Erro persiste.

Já estou quase fazendo download dos arquivos mas aí perde a graça hehehehe.

Então, recapitulando,

# connectedin/perfis/urls.py

from django.conf.urls import patterns, url
from perfis import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^perfis/(?P<perfil_id>\d+)$', views.exibir, name='exibir'),
    url(r'^perfis/(?P<perfil_id>\d+)/convidar$', views.convidar, name='convidar')
)

O importe só vai funcionar se existir o arquivo connectedin/perfis/views.py.

Você diz que existe e ainda me mostrou o log, bizarro isso, não? Então, detona esse arquivo views.py e crie um novo do zero para vermos no que vai dar.

O arquivo views.py final deve ser:

from django.shortcuts import render
from django.http import HttpResponse
from perfis.models import Perfil
from django.shortcuts import redirect

def index(request):
    return render(request, 'index.html', { 'perfis' : Perfil.objects.all()})

def exibir(request, perfil_id):

    perfil = Perfil.objects.get(id=perfil_id)
    return render(request, 'perfil.html', { "perfil" : perfil })

def convidar(request, perfil_id):

    perfil_a_convidar = Perfil.objects.get(id=perfil_id)
    perfil_logado = get_perfil_logado(request)
    perfil_logado.convidar(perfil_a_convidar)

    return redirect('index');

def get_perfil_logado(request):
    return Perfil.objects.get(id=1)

Não faz download dos arquivos, apenas apague o views.py e programe-o novamente. Pode ser algum trecho aí de permissão de arquivo no seu linux. Como uso OSX não sei como o linux se comporta.

Põe bizzarro nisso !!!! Exotérico uhauhahua

solução!

Para tudo! Você está usando o Django 1.8.4! A versão homologada do treinamento e que peço para instalar é a versão 1.7.4. Se essa versão 1.8.4 tem bugs vai atrapalhar sua vida e a minha :) Agora não sei se é um problema com seus arquivos ou se é um problema com essa versão do Django!

Se você não resolver, sugiro refazer do zero com o Django 1.7.4, uma das versões mais sólidas do Django.

Ok, vou instalar a versão. Obrigado.

Resumindo: não faço ideia do problema, seus arquivos estão lá para Django não estão. Ou é problema de SO (permissão) ou é problema nessa versão do Django mais atualizada que você baixou.

Sugestões: instalar a versão do Django que uso no treinamento que eu tenho certeza que esteja funcionando. Segunda sugestão: você baixar o capítulo 7 e rodar para ver se funciona. Se funcionar, isso descarta a hipótese que é um problema no Django, entende? Então, sem perder seu projeto você baixa o capítulo 7 e roda. Se funcionar, é algo bizarro com seus arquivos. Então, se puder pegar do capítulo 5 e fazer novamente do capítulo 6 não vai te prejudicar.

Aguardo seu feedback.

Compacta seu projeto e me envia: flavio.almeida@caelum.com.br. Ainda hoje dou uma olhada para saber se é alguma coisa com permissão de arquivo ou crash etc.

Aguardo seu projeto....

Acho que é a versão pois baixei o zip 06 e substitui os meus arquivos e continua com o mesmo erro ...

Vou instalar a versão homologada e lhe aviso.

Obrigado!

Acho que os dois problemas ocorreram:

  • Algum problema com meus arquivos, não faço ideia do que seja;
  • Versão do Django;

Mesmo com a nova versão e meus arquivos não funcionou, e, com arquivos baixados do Alura e a versão que eu possuía do Django também não funcionou.

Após instalar a versão recomendada E baixar os arquivos, está ok!

Obrigado!

Aproveito para questionar:

Qual a versão utilizada pelo mercado para desenvolvimento com Django? Seria a mesma recomendada para o treinamento?

Abraço

A versão mais usada ainda é a 1.6, porém você pode aprender a 1.7 que está de boa. A versão 1.8 é recente, então demora ainda a ser adotada. Em teoria, seu código deveria funcionar na versão 1.8, claro, se essa versão não quebrou nada com as versões anteriores. Assim que eu pude respirar, vou dar uma olhada para ver o que tem na versão 1.8 que está zicando nosso projeto.

Bom estudo! Sugiro até que você comece do zero. O que acha? E não deixe de postar dúvidas, claro, sempre postando código e explicando direitinho.

Tive o mesmo problema: é só não colocar aspas ("") dentro da url ou seja:

assim:

url(r'^perfis/(?P\d+)$', views.exibir, name='perfil'),

e não assim: url(r'^perfis/(?P\d+)$', 'perfis.views.exibir', name="perfil"),

Isso mesmo Luiz Carlos, inclusive tem nos comentários do arquivos urls.py, é só ler um pouco.