【问题标题】:Can't send an email in Django 1.9无法在 Django 1.9 中发送电子邮件
【发布时间】:2016-03-07 11:41:10
【问题描述】:

我已经使用 Django 整理了一个联系表单,但我的 send_email 方法无法正常工作。

我的表单模板如下所示:

        <form action="/contact/auth" method="post">
            {% csrf_token %}
            <br><br>
            <input type=text class="formfields" placeholder="Name" name="name">
            <br><br>
            <input type=email class="formfields" placeholder="Email" name="contact_email">
            <br><br>
            <textarea type=text placeholder="Tell Us About Your Project" name="message"></textarea>
            <br><br>
            <input type="hidden" value="" id="num1setup" name="num1setup">
            <input type="hidden" value="" id="num2setup" name="num2setup">
            <div id="sendcontainer">
                <div id="whatis">What is &nbsp</div><div id="num1"></div><div id="plus">&nbsp + &nbsp</div><div id="num2">?</div><br>
                <div id="sumcontainer">
                    <input id="sum" type="sum" name="sum">
                    <br><br>
                </div>
                <input class="submit" type=submit value="Send">
            </div>
        </form>

(我意识到我可能应该使用 Django 表单类来执行此操作,但我正在尝试使用原始 HTML 表单来执行此操作。)

从我的urls.py 文件中调用/contact/auth

url(r'^contact/', views.ContactView.as_view(), name='contact'),
url(r'^contact/auth/', views.send_email),

在我的views.py 文件中调用send_email 方法:

from django.views import generic
from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect

class ContactView(generic.TemplateView):
    template_name = 'contactpage.html'
    print("contactpage")

def send_email(request):
    print("working")
    name = request.POST.get('name')
    contact_email = request.POST.get('contact_email')
    subject = 'Message from: %s' %name
    message = request.POST.get('message')

    if subject and message and contact_email:
        try:
            send_mail(subject, message, contact_email, ['example@example'], fail_silently=False)
        except BadHeaderError:
            return HttpResponse('Invalid header found.')
        return HttpResponseRedirect('/contact/thanks')
    else:
        # In reality we'd use a form class
        # to get proper validation errors.
        return HttpResponse('Make sure all fields are entered and valid.')

这成功重定向到/contact/auth,但之后没有其他任何事情发生。我试过测试 send_email 方法,但它似乎没有被调用。

我还在终端中得到以下输出:

【问题讨论】:

  • 请您提供您正在使用的 Django 版本吗?
  • 我使用的是 1.9 版
  • 好的,那么您的问题如下。在 urls.py 中,您需要 import views 然后才能使用它们。自 Django 1.8 起,不推荐使用字符串作为第二个参数
  • 我已经导入了视图,但你是说 url 应该是这样的? url(r'^contact/auth/', views.send_email),
  • 405 响应码表示该方法不被允许。这意味着该 url 不支持 POST 请求。你能添加你的整个视图代码吗?

标签: python django forms email post


【解决方案1】:

正如 Django doc 提到的,

Django 按顺序遍历每个 URL 模式,并在第一个匹配请求的 URL 时停止。

/contact/auth/ 的调用首先与/contact 匹配,而您在ContactView 中没有提供post 函数,这就是您得到405 的原因。因此有两种方法可以解决此问题:

1

只需将/contact/auth/ 更改为/contact123/auth/(注意尾部斜杠)。

我建议你这样写:

url(r'^contact123/auth/', views.send_email, name='post_url'),

还有这个:

<form action="{% url 'post_url' %}" method="post">
...

这将使您的 url 模式的更改更加容易。

2.

添加尾随$ 像这样url(r'^contact/$', views.ContactView.as_view(), name='contact'),

在我测试时,这两种方法都可以正常工作。

【讨论】:

    【解决方案2】:

    问题在于模式。您正在调用 contact/auth,它与模式 url(r'^contact/auth/', views.send_email), 不匹配,因为尾部斜杠。您必须使用contact/auth/。同样仅供参考,所有邮寄电话都必须有一个斜杠。这就是返回 405 响应的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2021-10-15
      • 2016-09-28
      • 2012-04-26
      • 1970-01-01
      • 2017-06-11
      • 2013-09-22
      相关资源
      最近更新 更多