Джанго - [Errno 111] Соединение отказано - PullRequest
47 голосов
/ 27 апреля 2011

при публикации комментария не сохраняются, вылетает (ошибка: [Errno 111] Соединение отклонено), почему?

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 = "no-reply@mydomain.com"  
            recipient_list = ["myemail@mydomain.com"]  
            send_mail("New comment added", message, from_addr, recipient_list)  

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

Администратор

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

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

спасибо!

Ответы [ 8 ]

98 голосов
/ 27 апреля 2011

Похоже, вы пытаетесь отправить письмо (send_mail()), и ваши настройки почты в вашем settings.py неверны.

Вы должны проверить документы на отправку писем .


В целях отладки вы можете настроить локальный smtpserver с помощью этой команды:

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

и соответственно настройте параметры почты:

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025

Это задокументировано здесь: Проверка отправки электронной почты

В качестве альтернативы запуску выделенного сервера отладки выможет использовать console.EmailBackend, который был недавно добавлен в Django.

23 голосов
/ 12 ноября 2014

Для разработки и тестирования:

В Django 1.6+ мы можем просто добавить эту строку в settings.py

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

Это отобразит почту на консоли для простой проверки.

Примечание: Почта не будет отправлена ​​указанному получателю в Msg.Its только для разработки и тестирования.

Для этого вам необходимо настроить SMTP-сервер, указанный в Документе.

Для справки: Документация Django для отправки электронной почты

10 голосов
/ 16 февраля 2012

Установите пакет postfix на свой сервер, и он работает.Если это Ubuntu, попробуйте:

sudo apt-get install postfix

В ваших настройках введите:

EMAIL_HOST = 'localhost'
7 голосов
/ 21 октября 2011

Недавно мы отошли от почтового сервера отладки Python, чтобы использовать программу под названием Mailcatcher.Mailcatcher запускается как демон для перехвата всех ваших тестовых почтовых сообщений на порт 1025 и интегрируется с веб-сервером, чтобы вы могли затем просматривать перехваченные электронные письма из браузера.Преимущества

  • при необходимости вы можете просматривать тестовые электронные письма в формате HTML
  • централизованное управление всеми тестовыми электронными письмами - они остаются до тех пор, пока вы их не очистите
  • просматривать тестовые электронные письма отлюбой браузер, вместо прокрутки через окно терминала

Вы можете прочитать больше и скачать его здесь: http://rubygems.org/gems/mailcatcher

Если вам не нравится Ruby, мой коллегаперенес функциональность Mailcatcher на node.js - посмотрите MailDev здесь: http://djfarrelly.github.io/MailDev/

5 голосов
/ 14 июня 2012

дополнительно поможет следующее:

поместите следующие минимальные настройки в файл settings.py или local_settings.py на вашем сервере.

EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

Вместо использования smtp.gmail.com, который накладывает много ограничений, вы можете иметь свой собственный почтовый сервер.

вы можете сделать это, установив свой собственный почтовый сервер:

sudo apt-get install sendmail
3 голосов
/ 12 июня 2015

Я тоже сталкиваюсь с этой ошибкой.Вместо того, чтобы использовать gmail, я решил настроить свой собственный почтовый сервер, используя postfix. См. Мои причины здесь.

Чтобы настроить postfix в Ubuntu 12.04:

sudo apt-get install postfix

Затем скопируйте файл конфигурации в / etc / postfix /:

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

Добавьте следующие строки в main.cf :

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

Перезагрузите файл конфигурации:

/etc/init.d/postfix reload

Чтобы проверить, есть ли постфиксработает:

telnet localhost 25

Затем введите следующую строку за строкой:

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)

Если это работает, вы должны увидеть что-то вроде этого:

250 2.0.0 Ok: queued as CC732427AE

Далее,поместите следующую строку в settings.py вашего Django:

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 <server@whatever.com>'

Чтобы проверить, может ли Django отправлять электронную почту через postfix, откройте оболочку Django:

./manage.py shell

>>> from django.core.mail import send_mail
>>> send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

CheckВаш спам Входящие, и вы должны увидеть адрес электронной почты выше.

1 голос
/ 27 мая 2012

установка postfix сделала это для меня.

Здесь, похоже, не было ответа, который был бы соответствующим образом проголосован, поэтому эта страница может быть немного запутанной. Примечание в документации: https://docs.djangoproject.com/en/1.3/ref/settings/#std:setting-EMAIL_HOST

параметры settings.py имеют значения по умолчанию.

Когда я установил postfix, это решило проблему, по крайней мере локально.

Надеюсь, это поможет другой растерянной душе!

0 голосов
/ 28 октября 2013

EMailDump полезен и полезен локальный сервер smtp, простая установка, разработано на python https://github.com/ThiefMaster/maildump

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...