Pergunta

Eu gostaria de criar um aplicativo Django reutilizável que lida com atualizações de status dos usuários. Muito parecido com o "Feed de notícias" do Facebook.

Os casos de uso incluem, por exemplo:

  • Um professor pode criar uma tarefa devido a uma data específica e todo aluno pode ver no feed de notícias que a tarefa foi criada, com uma breve descrição, a data em que é devido e um link para ver a descrição completa.
  • Ele também pode fazer upload de um novo PDF que ele acha interessante para seus alunos. No feed de notícias, as informações sobre isso devem ser exibidas, por exemplo, a descrição do PDF, um link para download e um link para visualizá -lo.
  • Um link para um vídeo do YouTube pode ser postado e no feed de notícias é exibia uma pequena miniatura E, com um clique, O vídeo é incorporado usando JavaScript e o usuário pode assistir imediatamente.

Uma preocupação é como lidar com diferentes tipos de atualizações e exibir o "snippet html" correto para isso. O outro, que é mais importante, é como projetar os modelos desse "caminho django".

Sobre o primeiro, eu conseguia pensar em duas maneiras de fazê -lo:

  1. Usando herança do modelo;
  2. Usando relações genéricas.

Eu procurei antes de postar aqui, mas não encontrei nada. Eu verifiquei o Pinax para ver se eles o implementaram, mas não o fazem. Então, estou aqui procurando mais sugestões sobre como lidar com isso de uma maneira agradável e não hacky.

Desde já, obrigado,

Foi útil?

Solução

Eu posso pensar de duas maneiras:

Primeiro, talvez você possa fazer Feeds para seus modelos Assigments, PdfFiles, e Youtube link, e use a biblioteca Feedparser Para incorporá -lo em suas visualizações de notícias, essa é a maneira mais fácil, porque você pode definir nos modelos, o código para cada tipo de nova atividade.

A segunda coisa que consigo pensar é fazer uma aula Activity:

class Activity(models.Model):
    date = models.DateTimeField(auto_now_add = True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

E através do sinais Faça uma nova instância de atividade toda vez que tiver um novo Assigment ou PDF Upload ou link do YouTube, e para cada classe faz um método como render_to_html, dessa maneira, na sua opinião, você pode fazer um excesso de atividades e chamar o método render_to_html

Outras dicas

O Python é realmente um ótimo idioma para a construção de fluxos de atividades e feeds de notícias. Tommaso e eu escrevemos o pacote de estrutura de fluxo.https://github.com/tschellenbach/stream-frameworkAtualmente, é a solução Python mais usada para construir feeds de notícias. Também estamos oferecendo uma solução hospedada em https://getstream.io. O cliente Django é de longe o mais fácil de começar:https://github.com/getstream/stream-django e Python pode ser encontrado aqui (https://github.com/getstream/stream-python)

A parte de modelagem funciona assim

{% load stream_django %}

{% for activity in activities %}
    {% render_activity activity %}
{% endfor %}

Isso renderizará um modelo localizado em atividades/tweet.html com a atividade como contexto. Por exemplo

{{ activity.actor.username }} said "{{ activity.object.body }} {{ activity.created_at|timesince }} ago"

Os documentos completos estão aqui:https://github.com/getstream/stream-django#templating

A estrutura do fluxo permite criar qualquer tipo de feed de notícias usando Redis ou Cassandra. É construído para dimensionar e cria os feeds de notícias individuais usando um processo de fanout.

Além da estrutura do fluxo (que eu obviamente prefiro), existem muitas outras soluções por aí. Uma lista completa está disponível nos pacotes Django:https://www.djangopackages.com/grids/g/activities/

Observe que, com os feeds de notícias, existem alguns problemas de escala a serem lembrados. Em geral, existem três abordagens comuns:

Estratégias de desnormalização

PuxarA maioria dos usuários começa dessa maneira. Ao abrir a página de feeds, você simplesmente consulta os feeds de todos os usuários que segue. Se os usuários forem armazenados na memória, isso continuará funcionando por algum tempo. Eventualmente, é muito difícil continuar usando a estratégia, mas você costuma precisar consultar a maioria dos nós que armazenam os feeds do seu usuário.

EmpurreA abordagem de push escreve sua atividade para todos os seus seguidores. É claro que isso significa que você está desperdiçando uma tonelada de recursos, mas o resultado final é um feed pré -computado por usuário. Essa abordagem (embora inicialmente não muito eficiente) escala bem.

CombinaçãoAlguns sistemas otimizados usam uma combinação dessas duas abordagens. Veja também o artigo do Yahoo sobre este tópico.

Opções de armazenamento

Em termos de armazenamento de todos esses dados, as opções mais comuns são Redis, Cassandra e MongoDB. Vamos comparar rapidamente isso:

RedisRedis é extremamente fácil de configurar e manter. No entanto, apenas armazena dados na memória. Isso significa que você terá que otimizar como serializa dados e talvez fallback no banco de dados para obter dados consultados com menos frequência. Outro problema é que não é trivial adicionar máquinas ao seu cluster Redis.

MongoDBO Mongo DB é usado principalmente por alguns projetos de rubi e também está disponível como um back -end para o bombeador.io por e14N. Pessoalmente, nunca o executei em produção, então não posso avaliar adequadamente essa opção. No entanto, existem muitos posts de blogs abrangendo problemas com o desempenho, a escalabilidade e a manutenção do Mongo.

CassandraFashiolista, Instagram e Spotify estão todos usando Cassandra. Nossa solução hospedada também usa Cassandra como back -end. É extremamente econômico operar e você pode adicionar mais nós com facilidade. O único problema é que é difícil configurar e manter.

Artigos

Além disso, dê uma olhada neste post de alta escalabilidade onde explicamos algumas das decisões de design envolvidas:http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-raffic-feeds.html

Para saber mais sobre o design de ração, recomendo a leitura de alguns dos artigos nos quais baseamos se alimentar:

Parece que você usa uma solução de caixa de areia para resolver você.Mas eu não entra, como pode ser, porque você não pode criar modelo web como sandbox.Eu acho que você criou outro projeto que contém um novo recurso.Se estiver transe, você deve selecionar este projeto e definir sandboxed solução propriedade para false na janela Propriedades.

As relações genéricas seriam o caminho a seguir aqui. Apenas certifique -se de resolver o modelo em vez de ingressar na tabela de atualização.

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