Django - [Errno 111] Connection refused

Django

Django Problem Overview


when I post a comment, do not save, crashes (error: [Errno 111] Connection refused), why?

views.py

import time
from calendar import month_name

from django.http import HttpResponseRedirect, HttpResponse  
from django.shortcuts import get_object_or_404, render_to_response  
from django.contrib.auth.decorators import login_required  
from django.core.context_processors import csrf  
from django.core.paginator import Paginator, InvalidPage, EmptyPage  
from django.core.urlresolvers import reverse  
  
from dbe.blog.models import *  
from django.forms import ModelForm  


class CommentForm(ModelForm):  
    class Meta:  
        model = Comment  
        exclude = ["post"]  


def post(request, pk):  
    post = Post.objects.get(pk=pk)  
    comments = Comment.objects.filter(post=post)  
    d = dict(post=post, comments=comments, form=CommentForm(), user=request.user)  
    d.update(csrf(request))  
    return render_to_response("post.html", d)  

def delete_comment(request, post_pk, pk=None):  
    if request.user.is_staff:  
        if not pk: pklst = request.POST.getlist("delete")  
        else: pklst = [pk]  

        for pk in pklst:  
            Comment.objects.get(pk=pk).delete()  
        return HttpResponseRedirect(reverse("dbe.blog.views.post", args=[post_pk]))  

def add_comment(request, pk):  
    p = request.POST  

    if p.has_key("body") and p["body"]:  
        author = "Anonymous"  
        if p["author"]: author = p["author"]  
        comment = Comment(post=Post.objects.get(pk=pk))  

        cf = CommentForm(p, instance=comment)  
        cf.fields["author"].required = False  
        comment = cf.save(commit=False)  
  
        comment.author = author  
        notify = True  
        if request.user.username == "ak": notify = False  
        comment.save(notify=notify)  
    return HttpResponseRedirect(reverse("dbe.blog.views.post", args=[pk]))  
   
def mkmonth_lst():  
    if not Post.objects.count(): return []  
  
    # set up vars  
    year, month = time.localtime()[:2]  
    first = Post.objects.order_by("created")[0]  
    fyear = first.created.year  
    fmonth = first.created.month  
    months = []  
  
    for y in range(year, fyear-1, -1):  
        start, end = 12, 0  
        if y == year: start = month  
        if y == fyear: end = fmonth-1  

        for m in range(start, end, -1):  
            months.append((y, m, month_name[m]))  
    return months  
  
def month(request, year, month):  
    posts = Post.objects.filter(created__year=year, created__month=month)  
    return render_to_response("list.html", dict(post_list=posts, user=request.user,  
                                                months=mkmonth_lst(), archive=True))  

def main(request):  
    posts = Post.objects.all().order_by("-created")  
    paginator = Paginator(posts, 10)  
    try: page = int(request.GET.get("page", '1'))  
    except ValueError: page = 1  
  
    try:  
        posts = paginator.page(page)  
    except (InvalidPage, EmptyPage):  
        posts = paginator.page(paginator.num_pages)  

    return render_to_response("list.html", dict(posts=posts, user=request.user,  
                                                post_list=posts.object_list,   months=mkmonth_lst()))

models.py

from django.db import models  
from django.contrib.auth.models import User  
from django.contrib import admin  
from django.core.mail import send_mail  


class Post(models.Model):  
    title = models.CharField(max_length=60)  
    body = models.TextField()  
    created = models.DateTimeField(auto_now_add=True)  
  
    def __unicode__(self):  
        return self.title  
  

class Comment(models.Model):  
    created = models.DateTimeField(auto_now_add=True)  
    author = models.CharField(max_length=60)  
    body = models.TextField()  
    post = models.ForeignKey(Post)  

    def __unicode__(self):  
        return unicode("%s: %s" % (self.post, self.body[:60]))  
  
    def save(self, *args, **kwargs):  
       if "notify" in kwargs and kwargs["notify"] == True:  
       message = "Comment was was added to '%s' by '%s': \n\n%s" % (self.post,   self.author,  
                                                                         self.body)  
            from_addr = "[email protected]"  
            recipient_list = ["[email protected]"]  
            send_mail("New comment added", message, from_addr, recipient_list)  

        if "notify" in kwargs: del kwargs["notify"]  
        super(Comment, self).save(*args, **kwargs)

Admin

class PostAdmin(admin.ModelAdmin):  
    search_fields = ["title"]  
    display_fields = ["title", "created"]  

class CommentAdmin(admin.ModelAdmin):  
    display_fields = ["post", "author", "created"] 

thanks!

Django Solutions


Solution 1 - Django

Looks like you are trying to send a mail (send_mail()) and your mail settings in your settings.py are not correct.

You should check the docs for sending emails.


For debugging purposes you could setup a local smtpserver with this command:

python -m smtpd -n -c DebuggingServer localhost:1025

and adjust your mail settings accordingly:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

This is documented here: Testing e-mail sending

As an alternative to starting a dedicated debugging server you could use the console.EmailBackend which was added to Django recently.

Solution 2 - Django

For Development and Testing:

In Django 1.6+ we can just add this line in settings.py

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

This will display the mail on the console for Easy Verification.

Note: Mail will not be sent to the specified recipient in Msg.Its just for Development and Testing.

For that you need to configure SMTP server which is given in the Doc.

For Reference: Django Documentation for Sending Email

Solution 3 - Django

Install postfix package on your server and it works. If is ubuntu, try it:

sudo apt-get install postfix

In your settings, put:

EMAIL_HOST = 'localhost'

Solution 4 - Django

We recently moved away from the Python debugging email server to use a program called Mailcatcher. Mailcatcher runs as a daemon to intercept all of your test email messages to port 1025, and is integrated with a web server so that you can then view the intercepted emails from a browser. Advantages

  • you can view test emails as HTML if needed
  • central management of all test emails -- they stay around until you clear them
  • view test emails from any browser, instead of scrolling through terminal window

You can read more and download it here: http://rubygems.org/gems/mailcatcher

If you don't like Ruby, a co-worker of mine has ported the functionality of Mailcatcher to node.js -- check out MailDev here: http://djfarrelly.github.io/MailDev/

Solution 5 - Django

additionally the following will help:

put the following minimal settings in the settings.py or local_settings.py file on your server.

EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

instead of using smtp.gmail.com which imposes lot many limitations, you can have your own mail server.

you can do it by installing your own mailserver:

sudo apt-get install sendmail

Solution 6 - Django

I also run into this error. Instead of using gmail, I decided to setup my own mailserver using postfix. See my reasons here.

To setup postfix on Ubuntu 12.04:

sudo apt-get install postfix

Then, copy the config file to /etc/postfix/:

cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

Add the following lines to main.cf:

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mydestination = localhost

Reload the config file:

/etc/init.d/postfix reload

To test and see if postfix is working:

telnet localhost 25

Then enter the following line by line:

mail from: whatever@whatever.com
rcpt to: your_real_email_addr@blah.com
data (press enter)
type whatever content you feel like to type
. (put an extra period on the last line and then press enter again)

If it works, you should see something like this:

250 2.0.0 Ok: queued as CC732427AE

Next, put the following line in your Django's settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'Server <[email protected]>'

To test if Django can send email via postfix, open Django shell:

./manage.py shell

>>> from django.core.mail import send_mail
>>> send_mail('Subject here', 'Here is the message.', '[email protected]',
    ['[email protected]'], fail_silently=False)

Check your spam inbox and you should see the email above shown.

Solution 7 - Django

installing postfix did it for me.

There seemed to be no answer here that was suitably upvoted, so this page can be a bit confusing. Notice in the documentation: https://docs.djangoproject.com/en/1.3/ref/settings/#std:setting-EMAIL_HOST

the parameters settings.py have default values.

When I installed postfix it fixed the problem, locally at least.

Hope this helps another confused soul!

Solution 8 - Django

EMailDump is usable and useful local server smtp, easy installation, this developed in python https://github.com/ThiefMaster/maildump

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmaxView Question on Stackoverflow
Solution 1 - DjangoarieView Answer on Stackoverflow
Solution 2 - DjangoAjay GuptaView Answer on Stackoverflow
Solution 3 - DjangoRael MaxView Answer on Stackoverflow
Solution 4 - DjangoMark ChackerianView Answer on Stackoverflow
Solution 5 - Djangouser993563View Answer on Stackoverflow
Solution 6 - DjangoChengView Answer on Stackoverflow
Solution 7 - DjangodlitwakView Answer on Stackoverflow
Solution 8 - DjangoalejandrooropezaView Answer on Stackoverflow