Python Can';t在Django 1.9中发送电子邮件

Python Can';t在Django 1.9中发送电子邮件,python,django,forms,email,post,Python,Django,Forms,Email,Post,我已经用Django制作了一个联系表单,但是我无法让我的send\u email方法发挥作用 我的表单模板如下所示: <form action="/contact/auth" method="post"> {% csrf_token %} <br><br> <input type=text class="formfields" placeholder="Name" n

我已经用Django制作了一个联系表单,但是我无法让我的
send\u 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>
url(r'^contact123/auth/', views.send_email, name='post_url'),
它调用my
views.py
文件中的
send\u email
方法:

url(r'^contact/', views.ContactView.as_view(), name='contact'),
url(r'^contact/auth/', views.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\u email
方法,但它似乎没有被调用

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


问题在于模式。您正在调用的
contact/auth
与模式
url(r'^contact/auth/',views.send_email)不匹配,因为后面有斜杠。您必须使用
联系/auth/
。此外,仅为获取信息,所有post调用都必须有尾随斜杠。这就是405响应返回的原因。

正如Django提到的

Django按顺序运行每个URL模式,并在与请求的URL匹配的第一个模式处停止

调用
/contact/auth/
首先与
/contact
匹配,并且您没有在
联系人视图中提供
post
功能,这就是您获得405的原因。所以有两种方法可以解决:

1. 只需将
/contact/auth/
更改为
/contact123/auth/
(注意后面的斜杠)

我建议你这样写:

        <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>
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'),


这两种方法中的任何一种都很好,正如我测试的那样。

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