Dear Steve, Thank you for saving hours and hours of my team's time.
On Feb 17, 5:10 am, stevedegrace <degr...@gmail.com> wrote: > Figured it out myself... you have to set dispatch_uid for the connect > methods. See modification below to the last three lines of my example > above. It's still annoying that the overhead of module import is > apparently being incurred twice, but at least things work the way you > expect. Aside from this bit of weirdness, the signalling framework is > awesome, but it does seem to reveal an unfortunate characteristic of > Django itself. > > comment_will_be_posted.connect(pre_comment, Comment, > dispatch_uid='comments.pre_comment') > comment_was_posted.connect(post_comment, Comment, > dispatch_uid='comments.post_comment') > comment_was_flagged.connect(flag_comment, Comment, > dispatch_uid='comments.flag_comment') > > On Feb 15, 8:46 pm, stevedegrace <degr...@gmail.com> wrote: > > > I realise going through Google that this has been hashed over before, > > but nevertheless, I want to know if there is any new thought on this. > > Ever since I removed project references from imports in my code, I > > have noticed a new problem whereby many functions connected to signals > > are being called twice. I don't know if that caused the problem, but > > it seems likely because everything I've been reading tracks the > > problem down to imports. > > > A good example is in my __init__.py for my comments application, which > > is basically just a bunch of customizations to the Django comments > > application. That one has no imports of any of my models in it. It is > > posted below. > > > This is a real pain. Is there any way to make it not do this, short of > > going through my code and making all my imports through the project > > again? Maybe that wouldn't even help. I tried making selected imports, > > e.g., through the list of installed apps in settings.py import through > > the project name again but that didn't fix it, so I don't see an easy > > hack. > > > The same thing is happening whether I'm using manage.py runserver at > > home or Apache2/mod_wsgi2 on Webfaction. On Webfaction I have no > > choice but to have both the project directory and the directory > > containing it on my path or I get Apache 500 errors, the only way I > > can make my application load is to have both on the path. > > > This is really awful behaviour - it's probably the ugliest wart (maybe > > the only significant one, but still) I have ever found in Django, and > > it sucks because my applications are using signals a lot. I hope > > there's a way around it. > > > Stephen > > > from django.contrib.comments.signals import comment_will_be_posted, > > comment_was_posted, comment_was_flagged > > from django.contrib.comments.models import Comment > > from django.contrib.sites.models import Site > > from django.template import Context, loader > > from django.core.mail import send_mail > > from django.conf import settings > > > def pre_comment(sender, comment, request, **kwargs): > > if not request.user.is_authenticated: > > comment.is_removed = True > > > def post_comment(sender, comment, request, **kwargs): > > if comment.is_removed: > > comment.delete() > > else: > > request.session['flash'].append('Thank you for your > > comments.') > > request.session.modified = True > > site = Site.objects.get_current() > > template = loader.get_template('comments/comment_email.html') > > context = Context({ > > 'comment': comment, > > 'protocol': 'https' if request.is_secure() else > > 'http', > > 'site': site, > > }) > > send_mail("A comment was posted at %s" % site.name, > > template.render(context), getattr(settings, > > 'DEFAULT_FROM_EMAIL', None), > > getattr(settings, 'MODERATOR_EMAILS', None)) > > > def flag_comment(sender, comment, flag, created, request, **kwargs): > > site = Site.objects.get_current() > > template = loader.get_template('comments/comment_flag_email.html') > > context = Context({ > > 'comment': comment, > > 'flagged_by': request.user, > > 'protocol': 'https' if request.is_secure() else 'http', > > 'site': site, > > }) > > send_mail("A comment was flagged by %s" % request.user.username, > > template.render(context), getattr(settings, > > 'DEFAULT_FROM_EMAIL', None), > > getattr(settings, 'MODERATOR_EMAILS', None)) > > > comment_will_be_posted.connect(pre_comment, Comment) > > comment_was_posted.connect(post_comment, Comment) > > comment_was_flagged.connect(flag_comment, Comment) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---