Django - [Errno 111] Connection refused
Asked Answered
I

8

64

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!

Isoclinal answered 27/4, 2011 at 9:50 Comment(0)
S
116

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.

Sansculotte answered 27/4, 2011 at 10:2 Comment(1)
Updated link: kindly refer to the below link for sending mail docs.djangoproject.com/en/2.1/topics/emailWaugh
B
33

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

Bidden answered 12/11, 2014 at 2:36 Comment(2)
docs link is dead now.Copula
docs.djangoproject.com/en/4.0/topics/emailBidden
M
13

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'
Masakomasan answered 16/2, 2012 at 14:42 Comment(0)
K
7

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/

Kinshasa answered 21/10, 2011 at 15:32 Comment(0)
P
5

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
Pit answered 14/6, 2012 at 8:37 Comment(0)
D
4

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: [email protected]
rcpt to: [email protected]
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.

Detection answered 12/6, 2015 at 9:56 Comment(0)
A
1

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!

Ambulant answered 27/5, 2012 at 19:3 Comment(0)
K
0

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

Krystynakshatriya answered 28/10, 2013 at 14:9 Comment(1)
Note that link-only answers are discouraged, SO answers should be the end-point of a search for a solution (vs. yet another stopover of references, which tend to get stale over time). Please consider adding a stand-alone synopsis here, keeping the link as a reference.Ballesteros

© 2022 - 2024 — McMap. All rights reserved.