2015-05-19 5 views
16

urls.py के प्रासंगिक भाग:Django पासवर्ड के साथ 1.7.8 ईमेल भेजने नहीं परियोजना के लिए रीसेट

from django.conf.urls import include, url, patterns 
urlpatterns = patterns('', 

    # other ones ... 

    url(r'^accounts/password/reset/$', 
    'django.contrib.auth.views.password_reset', 
{'post_reset_redirect' : '/accounts/password/reset/done/'}), 

    url(r'^accounts/password/reset/done/$', 
    'django.contrib.auth.views.password_reset_done'), 

    url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', 
    'django.contrib.auth.views.password_reset_confirm', 
{'post_reset_redirect' : '/accounts/password/done/'}), 

    url(r'^accounts/password/done/$', 
    'django.contrib.auth.views.password_reset_complete'), 

) 

और अनुरोध के द्वारा, यहाँ पासवर्ड रीसेट फ़ॉर्म है:

{% extends "site_base.html" %} 

{% block title %}Reset Password{% endblock %} 

{% block content %} 
<p>Please specify your email address to receive instructions for resetting it.</p> 

<form action="" method="post"> 
    <div style="display:none"> 
     <input type="hidden" value="{{ csrf_token }}" name="csrfmiddlewaretoken"> 
    </div> 
    {{ form.email.errors }} 
    <p><label for="id_email">E-mail address:</label> {{ form.email }} <input type="submit" value="Reset password" /></p> 
</form> 
{% endblock %} 

लेकिन जब भी मैं करने के लिए नेविगेट /accounts/password/reset/ पेज और ईमेल में भरने और प्रवेश पेज तुरंत /accounts/password/reset/done/ को रीडायरेक्ट और किसी ईमेल को भेजने के लिए क्लिक करें।

मेरे प्रासंगिक settings.py चर:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 
EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'XXXXXX' 
EMAIL_PORT = 587 

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER 
SERVER_EMAIL = EMAIL_HOST_USER 

और मैं ईमेल काम करता है क्योंकि django-registration-redux के साथ अपने पंजीकरण प्रवाह दोषरहित काम करता है।

कोई भी विचार?

+0

आप हमें अपने को देखने के एक उदाहरण है कि ईमेल भेजने के लिए जिम्मेदार है दिखा सकते हैं? – Tanorix

+0

@tanorix आप 'में urls.py' वहाँ लोगों में बनाया गया है, तो आप उन्हें यहाँ देख सकते हैं इसके बाद के संस्करण के रूप में देख सकते हैं: https://github.com/django/django/blob/master/django/contrib/auth/ views.py # L147 – lollercoaster

+0

[फ़ाइल बैकएंड] को अस्थायी रूप से जाने की कोशिश करें (https://docs.djangoproject.com/en/1.8/topics/email/#file-backend) (या कंसोल बैकएंड आप में कर रहे हैं अपने देव पर्यावरण) - यह दिखाने में मदद करनी चाहिए कि क्या समस्याएं दृश्यों या ईमेल कॉन्फ़िगरेशन में हैं (मुझे पता है कि आप कहते हैं कि ईमेल django-registration-redux में काम कर रहे हैं, लेकिन यह किसी भी तरह का प्रयास करने योग्य हो सकता है)। – Alasdair

उत्तर

13

मैं अपनी स्थिति को पुन: करने की कोशिश की और मैं निम्न परिदृश्यों का सामना करना पड़ा:

  1. मेल केवल सक्रिय उपयोगकर्ताओं के लिए भेजा जाता है। किसी भी उपयोगकर्ता से जुड़े ईमेल को कोई ईमेल नहीं मिलेगा (जाहिर है)।
  2. मैं एक त्रुटि के रूप में मिल गया के email = loader.render_to_string(email_template_name, c) के लिए लाइन 270 में विधि को बचाने: '()' पर/लेखा/पासवर्ड/रीसेट/ तर्क के साथ 'password_reset_confirm' के लिए रिवर्स

NoReverseMatch और कीवर्ड तर्क ' {'टोकन': '42h-4e68c02f920d69a82fbf', 'uidb64': b'Mg '}' नहीं मिला।0 पैटर्न (रों) करने की कोशिश की: []

ऐसा लगता है कि आपके urls.py 'password_reset_confirm' नाम किसी भी यूआरएल शामिल नहीं है।

url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', 
    'django.contrib.auth.views.password_reset_confirm', 
{'post_reset_redirect': '/accounts/password/done/'},), 

करने के लिए:: तो आप अपने यूआरएल बदलना चाहिए

url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', 
    'django.contrib.auth.views.password_reset_confirm', 
{'post_reset_redirect': '/accounts/password/done/'}, name='password_reset_confirm'), 

आप अपने ईमेल कॉन्फ़िगरेशन सेट किया है, तो पूरी तरह से आप कोई समस्या नहीं के साथ ईमेल मिलना चाहिए। यदि अभी भी आप इस मुद्दे का सामना कर रहे हैं, तो कृपया यह जांचने के लिए एक डीबगर का उपयोग करें कि यह कहां अपवाद प्राप्त कर रहा है।

पुनश्च: मैं Django 1.7.8 और टेम्पलेट्स के साथ परीक्षण किया है में रहता है: Python34\Lib\site-packages\django\contrib\admin\templates\registration। यूआरएल और विचारों का उपयोग तब किया जाता है जब आपने प्रश्न में लिखा है।

4

जब आप ^accounts/password/reset/$ पर पोस्ट करते हैं तो django.contrib.auth.views.password_reset फ़ंक्शन चलाया जाता है। यह ईमेल को सत्यापित करने के लिए डिफ़ॉल्ट django.contrib.auth.forms.PasswordResetForm कक्षा का उपयोग करेगा।

आपको नोटिस करना चाहिए कि एक ईमेल केवल प्रदान किए गए ईमेल से मेल खाने वाले सक्रिय उपयोगकर्ताओं को भेजा जाता है, और केवल तभी जब उनके पास उपयोग करने योग्य पासवर्ड हो।

Django प्रबंधन शेल के साथ निम्नलिखित समारोह का उपयोग करने के प्रयास करें:

from django.contrib.auth.models import get_user_model 

def check_password_reset_cond(email): 
    for u in get_user_model().objects.filter(email__iexact=email): 
     assert u.is_active 
     assert u.has_usable_password() 
+0

हां, उन दावों को बिना किसी समस्या के सफल होते हैं। और Djano के नए संस्करणों में आपको 'get_user_model' के बजाय django.contrib.auth.models आयात उपयोगकर्ता' की आवश्यकता है। – lollercoaster

+0

पासवर्ड रीसेट ईमेल के लिए आवश्यक शर्तों को कॉल करने के लिए धन्यवाद - मैं पासवर्ड रीसेट वर्कफ़्लो का परीक्षण लिखने की कोशिश कर रहा था और 'has_usable_password' चेक के बारे में नहीं जानता था। – BSchlinker

+0

हाँ, यदि आप create_user के साथ अपने उपयोगकर्ताओं को बनाते हैं और पासवर्ड सेट नहीं करते हैं, तो वे रीसेट नहीं होंगे। 'Password = User.objects.make_random_password()' –

4

आप अपने templates फ़ोल्डर में ईमेल टेम्पलेट्स है?

registration/password_reset_email.html 
registration/password_reset_subject.txt 
+0

का उपयोग करें हां, मेरे पास उन सभी हैं। – lollercoaster

3

ठीक है, यह संभव है कि फ़ॉर्म साफ तरीके में विफल होने की संभावना है, और आप उस त्रुटि को फँस नहीं रहे हैं। तो आप मेल भेजने के बिना रीडायरेक्ट प्राप्त करते हैं, और क्यों कोई संकेत नहीं है। स्वच्छ() में फेंक दिया गया कोई भी सत्यापन त्रुटि non_field_errors में दिखाई देगी। उन्हें देखने के लिए आपको अपने पृष्ठ में {{form.non_field_errors}} में जोड़ना होगा। इसे आज़माएं:

<form method="post">{% csrf_token %} 
    {{{form.non_field_errors}} 
    {{ form.email.errors }} 
<p><label for="id_email">E-mail address:</label> {{ form.email }} <input type="submit" value="Reset password" /></p> 
</form> 
2

मैं निश्चित रूप से स्पैम फ़ोल्डर की जांच करूंगा। क्योंकि कभी-कभी कुछ ईमेल फ़िल्टर टेक्स्ट ईमेल को बहुत कठोर रूप से लिंक के साथ व्यवहार करते हैं।

मैं सलाह देता हूं कि (कुछ आईडीई के साथ) पायथन डीबगर और पीडीबी (पायथन डीबगर) की मदद से django.contrib.auth.form.PasswordResetForm.save और django.contrib.auth.views.password_reset पर चलने के लिए क्या देखें काम नहीं करता।

0

answer by domtes मेरे लिए यह हल है, लेकिन मुझे लगता है कि संभावित कारण पर कुछ जोर देना चाहता था:

उपयोगकर्ता आप पुनर्स्थापित करने के लिए कोशिश कर रहे हैं है वर्तमान में (रीसेट से पहले) एक अवैध पासवर्ड, जैंगो चुपचाप एक रीसेट ईमेल नहीं भेज देंगे!

मेरे मामले में, मैं गलती से व्यवस्थापक (कस्टम उपयोगकर्ता मॉडल + LastPass) में पासवर्ड क्षेत्र को अधिलेखित कर दिया, और कहा कि एक के बाद एक उपयोगकर्ता बस अब और रीसेट नहीं किया।

संबंधित मुद्दे