【问题标题】:Django auth error in processing password_reset form处理 password_reset 表单时的 Django 身份验证错误
【发布时间】:2016-01-01 20:24:44
【问题描述】:

在我的项目中,我需要允许用户重置和更改其密码。在 base.html 模板中,我有:

<div class='login-first-row'>
  <form action="{% url 'login' %}" method='POST' role='form'>
     {% csrf_token %}
        <div class='form-group'>
          <label for='username'>Username</label>
          <input class='form-control' id='username' name='username' placeholder='username' type='text'>
        </div>
        <div class='form-group'>
          <label for='password'>Password</label>
          <input class='form-control' id='password' name='password' placeholder='Password' type='password'>
        </div>
        <button class='btn btn-success' type='submit'>Go!</button>
        <p>
          If you forgot your password
          <a href="{% url 'password_reset' %}">Click here</a>
        </p>
      </form>
    </div>

用户可以通过点击链接href="{% url 'password_reset' %}"访问password_reset_form.html。 我的password_reset_form.html

 {% extends "base.html" %}
 {% block content %}

  <div class='container l-wrap'>
    <div class='row'>
      <div class='span12'>
        <div class='container'>
          <div class='row'>
            <div class='span12'>
              <div class='login-page'>


                <p> Reset password </p>

                    <form action="" method="post">{% csrf_token %}
                        {{ form.email.errors }}
                        <p>
                            <label for="id_email"> Email address</label> 
                            {{ form.email }} 
                            <input type="submit" value="Reset my password" />
                        </p>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
 {% endblock %}

问题是当我发布电子邮件地址时,我收到以下错误:

 IOError at /accounts/password_reset/
 [Errno 32] Broken pipe
 Request Method:    POST
 Request URL:   http://192.168.33.10:8000/accounts/password_reset/
 Django Version:    1.7.8
 Exception Type:    IOError
 Exception Value:   
 [Errno 32] Broken pipe
 Exception Location:    /vagrant/.virtualenv/local/lib/python2.7/site-packages/django/core/mail/backends/console.py in write_message, line 23
  Python Executable:    /vagrant/.virtualenv/bin/python
 Python Version:    2.7.3
 Python Path:   
 ['/vagrant',
 '/vagrant/.virtualenv/local/lib/python2.7/site-packages/distribute-0.6.24-py2.7.egg',
 '/vagrant/.virtualenv/src/yadu/src',
 '/vagrant/.virtualenv/src/python-social-auth-master',
 '/vagrant/.virtualenv/src/django-timedeltafield',
 '/vagrant/.virtualenv/local/lib/python2.7/site-packages/xhtml2pdf-0.0.6-py2.7.egg',
 '/vagrant/.virtualenv/local/lib/python2.7/site-packages/PyPDF2-1.25.1-py2.7.egg',
 '/vagrant/.virtualenv/local/lib/python2.7/site-packages/html5lib-1.0b8-py2.7.egg',
 '/vagrant/.virtualenv/lib/python2.7',
 '/vagrant/.virtualenv/lib/python2.7/plat-linux2',
 '/vagrant/.virtualenv/lib/python2.7/lib-tk',
 '/vagrant/.virtualenv/lib/python2.7/lib-old',
 '/vagrant/.virtualenv/lib/python2.7/lib-dynload',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/vagrant/.virtualenv/local/lib/python2.7/site-packages',
 '/vagrant']

根据文档,当我从 password_reset_form 模板提交表单时,应该调用“django.contrib.auth.views.password_reset”视图。我用一些“打印”调试并验证这没有发生。我不明白我的发帖请求的去向。

myapp/urls.py

 urlpatterns = patterns('',
 url(r'^$', index, name='index'),
url(r'^email-sent/$', mail_sent),
url('', include('social.apps.django_app.urls', namespace='social')),
url(r'^admin/', include(custom_admin.urls)),    
url(r'^accounts/', include('django.contrib.auth.urls')),
[...]
)

myapp/setting.py

INSTALLED_APPS = (
'suit',
'suit_redactor',
'django.contrib.sites',
'django.contrib.flatpages',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

# FIXME: remove
'django.contrib.webdesign',

'django_extensions',

'pipeline',
'ajaximage',
'easy_maps',
'embed_video',
'yadu',

'import_export',
'social.apps.django_app.default',
'core.app',
'paypal.standard.ipn',
'payment',
'deal',
'help',# FIXME: move the flatpages part into application of its own
'django.contrib.admin',    

)

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
'yadu.middleware.Debug',
'social.apps.django_app.middleware.SocialAuthExceptionMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request",
)

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

    Exception Location: /vagrant/.virtualenv/local/lib/python2.7/site-packages/django/core/mail/backends/console.py in write_message, line 23

    看起来 django 无法与您的电子邮件后端通信。检查您的设置,然后尝试使用./manage.py shell 发送消息。

    【讨论】:

    • 对不起,但实际上我是新手,我正在修复别人写的项目。你可以再详细一点吗?从你的回答中,我明白 django 不能 send_mail(),对吧?
    • 您可能没有设置电子邮件后端。您需要 settings.py 指向一个服务器,该服务器可能是也可能不是 localhost。你也可以使用像 sendgrid 这样的服务,它有自己的后端。文档:docs.djangoproject.com/en/1.8/topics/email
    • 其实我的 EMAIL_BACKEND 设置为 'django.core.mail.backends.console.EmailBackend'。在 './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)'。我得到了'MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: Subject here From: from@example.com To: to@example.com Date: Mon, 05 Oct 2015 14:17:46 -0000 Message-ID: 这是消息。'
    • 关于控制台后端的文档说“控制台后端不会发送真正的电子邮件,而是将发送到标准输出的电子邮件写入。”所以,我会调查 SMTP 后端。您必须添加/更改设置以使其指向邮件服务器。如果您安装 postfix,您可以使用 localhost,但电子邮件服务器设置是它自己的野兽。听起来不像是个骗子,但 sendgrid 是一个很好、简单但不是免费的解决方案。
    猜你喜欢
    • 2017-08-06
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2019-03-27
    • 2016-06-12
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多