2009-12-31 12 views
5

message_set, yeni mesajlar çerçevesi lehine önerilmemektedir. Eski iyi message_set, çevrimdışı kullanıcılara mesaj bırakmamı sağladı (örneğin, bir cron işinde bazı şeyler yaptığım zaman, bunun hakkında kullanıcıyı bilgilendirmek isteyebilirim). Şimdi yeni çerçeveye bir göz atın ve bir ileti sadece request nesnesine eklenebilir gibi görünüyor.Django - iletileri yeni mesaj çerçevesine kullanarak (çevrimdışı) kullanıcılara bırakma

Hiç bir şey kaçırdım mı yoksa bir user nesnesine mesaj eklemenin işlevselliği nedir?

cevap

9

Hiçbir şey kaçırdığına benzemiyor. user nesnesine ileti ekleme işlevi, Django 1.2'de kullanımdan kaldırılacak ve tamamen 1.4'te kaldırılacaktır (django kimlik doğrulama belgelerinden here). Ve yeni mesajlaşma depolama arka uçlarının hiçbiri, mesajların kalıcı (örneğin, veri tabanı veya dosya depolaması) için önceden yuvarlanmamıştır.

Ancak her şey kaybolmuyor. Yeni ileti depolama arka uç kodunda, bir mesajı saklarken geçerli bir istekte bulunduğunuz konusunda ısrar eden hiçbir şey göremiyorum (örneğin bir iletinin saklanması, örneğin bir cron işi işe yarar). Eğer ben olsaydım, bir veritabanı tablosundaki mesajları saklayan kendi arka ucumu alırdım.

Düzenleme: uygulamak olabilir Bu nasıl

olası bir yaklaşımdır yeni mesajlaşma backends birine bir cıvata gibi çevrimdışı mesaj depolama uygulanması ile ok ise:

  1. tanımlayın bir ileti Modeli

    class UserMessage(models.Model): 
        user = models.ForeignKey('auth.User') 
        message = models.CharField(max_length=200) 
        created = models.DateTimeField(auto_now_add=True) 
    
  2. manuel olarak cron işigelen UserMessages oluşturmak

    def some_func_in_my_cron_job(): 
        ... 
        UserMessage.create(user=some_user, message="Something happened") 
        ... 
    
  3. ayarlarında yeni mesaj motorunda GETin()

    from django.contrib.messages.storage.session import SessionStorage 
    
    class MyStorageEngine(SessionStorage): 
        def _get(self, *args, **kwargs): 
        if hasattr(self.request, "user") and self.request.user.is_authenticated(): 
         offline_messages = UserMessage.objects.filter(user=self.request.user) 
         # and delete the messages from the database 
        else: 
         offline_messages = None 
    
        other_messages = super(MyStorageEngine, self)._get(*args, **kwargs) 
    
        # all_messages = combine offline_messages and other_messages 
    
        return all_messages 
    
  4. açın mevcut motorların yazılmasının, yeni bir mesaj saklama motorunu tanımlayın ve yeniden tanımlamak:

    MESSAGE_STORAGE = 'myproj.custom_message_storage.MyStorageEngine' 
    

Bu yaklaşımla, yeni mesajlaşma API'sini kullanarak veritabanınızın arka ucuna yazmazsınız, ancak okuyabilirsiniz. el ile ayarlanmış mesajlarınız. Bu yardımcı olur umarım.

+0

Cevabınız için teşekkürler. Bir mesaj depolama arka ucu yazmak kolay olmalı. Bununla birlikte, bir kullanıcıya bir mesajın bağlanması ve ardından bu kullanıcının çevrimiçi hale gelmesi durumunda görüntülenmesi karmaşıktır. Baska öneri? – shanyu

+0

Cevaba bir düzenleme olarak olası bir yaklaşım eklendi. – zlovelady

+0

Çok yardımcı. Teşekkürler.. – shanyu

0

docs, 4 farklı depolama motoru olduğunu iddia ediyor. FallbackStorage altyapısı oturuma yazıyor.

+1

Evet, "istek" e ait olan oturuma yazıyor. – shanyu

1

messages_extends sizin settings.py messages_extends.storages.FallbackStorage kullanıyorsa, kullandığınız, kalıcı mesaj oluşturabilirsiniz (kullanıcı x oturuncaya kadar indefinetely gösterecektir):

import messages_extends 
from messages_extends.models import Message 
Message.objects.create(user=target_user, level=messages_extends.INFO_PERSISTENT, message='Hey! You will see me until you click X!') 

Message modelinin tanımı şöyledir:

Diğer depolar muhtemelen mesajı sadece hafızada saklar, böylece elinizde gerçekten bulunmaz.

1

için

İlgili konular