【问题标题】:Django - [Errno 111] Connection refusedDjango - [Errno 111] 连接被拒绝
【发布时间】:2011-08-13 17:12:52
【问题描述】:

当我发表评论时,不保存,崩溃(错误:[Errno 111] Connection denied),为什么?

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"] 

谢谢!

【问题讨论】:

    标签: django


    【解决方案1】:

    看起来您正在尝试发送邮件 (send_mail()),而您的 mail settings 中的 settings.py 不正确。

    您应该查看sending emails 的文档。


    出于调试目的,您可以使用以下命令设置本地 smtpserver:

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

    并相应地调整您的邮件设置:

    EMAIL_HOST = 'localhost'
    EMAIL_PORT = 1025
    

    这在此处记录:Testing e-mail sending

    作为启动专用调试服务器的替代方法,您可以使用最近添加到 Django 中的 console.EmailBackend

    【讨论】:

    【解决方案2】:

    我们最近从 Python 调试电子邮件服务器转移到使用名为 Mailcatcher 的程序。 Mailcatcher 作为一个守护进程运行,将所有测试电子邮件截获到端口 1025,并与 Web 服务器集成,以便您可以从浏览器查看截获的电子邮件。优势

    • 如果需要,您可以以 HTML 格式查看测试电子邮件
    • 所有测试电子邮件的集中管理 - 它们一直存在,直到您清除它们
    • 从任何浏览器查看测试电子邮件,而不是通过终端窗口滚动

    您可以在此处阅读更多内容并下载: http://rubygems.org/gems/mailcatcher

    如果您不喜欢 Ruby,我的一位同事已将 Mailcatcher 的功能移植到 node.js 中——在此处查看 MailDev:http://djfarrelly.github.io/MailDev/

    【讨论】:

      【解决方案3】:

      在你的服务器上安装 postfix 包,它就可以工作了。如果是ubuntu,试试看:

      sudo apt-get install postfix
      

      在您的设置中,输入:

      EMAIL_HOST = 'localhost'
      

      【讨论】:

        【解决方案4】:

        安装后缀为我做了。

        这里似乎没有合适的答案,所以这个页面可能有点混乱。文档中的注意事项:https://docs.djangoproject.com/en/1.3/ref/settings/#std:setting-EMAIL_HOST

        参数settings.py有默认值。

        当我安装 postfix 时,它至少在本地解决了问题。

        希望这可以帮助另一个困惑的灵魂!

        【讨论】:

          【解决方案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】:

            EMailDump好用又好用本地服务器smtp,安装方便,这个是用python开发的 https://github.com/ThiefMaster/maildump

            【讨论】:

            • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
            【解决方案7】:

            用于开发和测试:

            在 Django 1.6+ 中,我们可以在 settings.py 中添加这一行

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

            这将在控制台上显示邮件以方便验证。

            注意: 邮件不会发送到 Msg 中指定的收件人。它只是用于开发和测试。

            为此,您需要配置文档中给出的 SMTP 服务器。

            供参考:Django Documentation for Sending Email

            【讨论】:

            • 文档链接现已失效。
            【解决方案8】:

            我也遇到了这个错误。我决定不使用 gmail,而是使用 postfix 设置我自己的邮件服务器。 See my reasons here.

            在 Ubuntu 12.04 上设置后缀:

            sudo apt-get install postfix
            

            然后,将配置文件复制到 /etc/postfix/:

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

            将以下行添加到 ma​​in.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
            

            接下来,将以下行放入 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 <server@whatever.com>'
            

            要测试 Django 是否可以通过 postfix 发送电子邮件,请打开 Django shell:

            ./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)
            

            检查您的垃圾邮件收件箱,您应该会看到上面显示的电子邮件。

            【讨论】:

              猜你喜欢
              • 2018-03-29
              • 2013-04-06
              • 2019-12-13
              • 2020-11-22
              • 2014-09-14
              • 2021-06-08
              • 2021-08-23
              • 2016-11-12
              • 1970-01-01
              相关资源
              最近更新 更多