Pergunta

Então, estou tentando escrever um aplicativo reutilizável do Django que forneça um método para exibir seu feed do Twitter em sua página. Eu sei bem que já existe 20 vezes. É um exercício acadêmico. :)

A estrutura do diretório é bem simples:

myproject
|__  __init__.py
|__  manage.py
|__  settings.py
|__  myapp
     |__  __init__.py
     |__  admin.py
     |__  conf
          |__  __init__.py
          |__  appsettings.py
     |__  feedparser.py
     |__  models.py
     |__  templates
          |__  __init__.py
     |__  templatetags
          |__  __init__.py
          |__  twitterfeed.py
     |__  views.py
|__  templates
          |__  base.html
|__  urls.py

Ao executar o Django Shell, as funções definidas no Twitterfeed.py funcionam perfeitamente. Eu também acredito que tenho as tags de modelo adequadamente nomeadas e registradas.

Como você pode ver, eu uso o excelente Analisador de alimentação universal. Meu problema não está dentro do próprio UFP, mas na incapacidade da UFP ser chamada ao importar a biblioteca de tags de modelo. Quando eu {% load twitterfeed %} Em base.py, recebo o seguinte erro:

'Twitterfeed' não é uma biblioteca de tags válida: não foi possível carregar a biblioteca de modelos de django.templateTags.twitterfeed, nenhum módulo chamado FeedParser

Eu importo FeedParser usando a seguinte declaração:

import re, datetime, time, myapp.feedparser

O melhor que posso dizer, essa mensagem de erro é um pouco enganadora. Eu acho que há um importador acontecendo quando a biblioteca de modelos é carregada, e essa é a interpretação de Django.

Existe alguma maneira de importar feedparser.py no meu aplicativo reutilizável sem exigir que os usuários do aplicativo coloquem o FeedParser em algum lugar no seu PythonPath?

Obrigado!

Foi útil?

Solução

Parece um daqueles problemas de caminho relativo irritante - resolvidos no Python 2.6 e superior (onde você pode importar ..FeedParser etc), mas geralmente um pouco complicado nas versões mais antigas. Uma maneira barata e alegre de consertar isso pode ser apenas para mover o FeedParser.py para o seu diretório TemplateTags, como irmão para o Twitterfeed.py

Outras dicas

Eu resolvo esse tipo de problema (bibliotecas de envio que são dependências para o meu projeto geral) da seguinte maneira. Primeiro, eu crio um diretório "ext" na raiz do meu projeto (no seu caso, isso seria myproject/ext). Em seguida, coloco dependências como o FeedParser no diretório Ext - myproject/ext/feedparser

Finalmente, altero meu script gerencial.py para inserir o diretório EXT/ na frente do sys.path. Isso significa ambos ./manage.py runserver e ./manage.py shell vai pegar o caminho correto:

# manage.py
import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'ext'))
# ... rest of manage.py

Acho que isso funciona muito bem se você não quiser mexer com coisas como o VirtualENVs. Quando você implanta seu projeto, você deve garantir que o caminho também esteja correto - eu geralmente resolvo isso adicionando o mesmo sys.path.insert linha para o início do meu arquivo mod_wsgi app.wsgi.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top