Django - [Errno 111] Соединение отказано
когда я отправляю комментарий, не сохраняю, сбой (ошибка: [Errno 111] Connection отказано), почему?
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)
Администратор
class PostAdmin(admin.ModelAdmin):
search_fields = ["title"]
display_fields = ["title", "created"]
class CommentAdmin(admin.ModelAdmin):
display_fields = ["post", "author", "created"]
спасибо!
Ответы
Ответ 1
Похоже, вы пытаетесь отправить почту (send_mail()
), а ваши настройки почты в вашем settings.py
неверны.
Вы должны проверить документы для отправки писем.
Для целей отладки вы можете настроить локальный smtpserver с помощью этой команды:
python -m smtpd -n -c DebuggingServer localhost:1025
и соответствующим образом настройте параметры почты:
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
Это описано здесь: Тестирование отправки электронной почты
В качестве альтернативы запуску выделенного сервера отладки вы можете использовать console.EmailBackend
, который был недавно добавлен в Django.
Ответ 2
Для разработки и тестирования:
В Django 1.6+ мы можем просто добавить эту строку в settings.py
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
Это отобразит почту на консоли для простой проверки.
Примечание:
Почта не будет отправлена указанному получателю в Msg.Its только для разработки и тестирования.
Для этого вам нужно настроить SMTP-сервер, который указан в Doc.
Справка: Документация Django для отправки электронной почты
Ответ 3
Установите пакет postfix на свой сервер, и он работает. Если есть ubuntu, попробуйте:
sudo apt-get install postfix
В ваших настройках поставьте:
EMAIL_HOST = 'localhost'
Ответ 4
Недавно мы отошли от почтового сервера отладки Python, чтобы использовать программу Mailcatcher. Mailcatcher запускается как демон для перехвата всех тестовых сообщений электронной почты на порт 1025 и интегрирован с веб-сервером, чтобы вы могли просматривать перехваченные письма из браузера. Преимущества
- вы можете просматривать тестовые письма в формате HTML при необходимости
- центральное управление всеми тестовыми электронными письмами - они остаются вокруг, пока вы не очистите их.
- просматривать тестовые письма из любого браузера, вместо прокрутки через окно терминала
Вы можете прочитать больше и скачать его здесь:
http://rubygems.org/gems/mailcatcher
Если вам не нравится Ruby, мой коллега портировал функциональность Mailcatcher на node.js - проверьте MailDev здесь: http://djfarrelly.github.io/MailDev/
Ответ 5
дополнительно следующее:
введите следующие минимальные настройки в файл settings.py или local_settings.py на свой сервер.
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
вместо использования smtp.gmail.com, который накладывает множество ограничений, вы можете иметь свой собственный почтовый сервер.
вы можете сделать это, установив свой собственный почтовый сервер:
sudo apt-get install sendmail
Ответ 6
Я также столкнулся с этой ошибкой. Вместо использования gmail я решил настроить собственный почтовый сервер с помощью постфикса. См. мои причины здесь.
Чтобы установить постфикс на 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: [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)
Если это работает, вы должны увидеть что-то вроде этого:
250 2.0.0 Ok: queued as CC732427AE
Затем поместите следующую строку в свой Django 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]>'
Чтобы проверить, может ли Django отправлять электронную почту через постфикс, откройте оболочку Django:
./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)
Проверьте папку спам, и вы должны увидеть вышеприведенное электронное письмо.
Ответ 7
установка postfix сделала это для меня.
Казалось, что здесь нет ответа, который был бы соответствующим образом одобрен, поэтому эта страница может быть немного запутанной. Обратите внимание на документацию: https://docs.djangoproject.com/en/1.3/ref/settings/#std:setting-EMAIL_HOST
параметры settings.py имеют значения по умолчанию.
Когда я установил postfix, он исправил проблему, по крайней мере, локально.
Надеюсь, это поможет другой смущенной душе!
Ответ 8
EMailDump - полезный и полезный локальный сервер smtp, простая установка, разработанная в python
https://github.com/ThiefMaster/maildump