2015-04-27 7 views
0

У меня возникли проблемы с токенами CSRF в моем проекте Django. То, что я пытаюсь сделать, это разрешить пользователю отправлять файл на определенный адрес электронной почты, используя форму на моем веб-сайте. Проблема заключается в том, что «токен CSRF отсутствует или неверен». Я пропустил еще несколько вопросов; однако кажется, что мое приложение построено иначе, чем другие. Я все еще очень новичок в веб-разработке, не говоря уже о Django. Я думаю, что это может быть связано с чем-то в взглядах, но, похоже, ни одно из этих решений не является полезным для моих целей. Если у кого есть какие-либо идеи о том, как мы можем поставить в CSRF токен или исправить здесь, вот файлы, которые были изменены для того, чтобы добавить эту функциональность электронной почты:Отправка электронной почты с помощью Django; Недопустимый токен CSRF

#views.py 
from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.core.context_processors import csrf 
from django import forms 
from ReadMyPaper.feedbackEmail.forms import EmailForm 

#Create your views here. 
def send_email(request): 
    if request.method != 'POST': 
     form = EmailForm() 
     return render_to_response('email.html', {'email_form': form}) 

    form = EmailForm(request.POST, request.FILES)  
    if form.is_valid(): 
     subject = form.cleaned_data['subject'] 
     message = form.cleaned_data['message'] 
     email = form.cleaned_data['email'] 
     attach = request.FILES['attach'] 
     try: 
      mail = EmailMessage(subject, message, settings.EMAIL_HOST_USER, [email]) 
      mail.attach(attach.name, attach.read(), attach.content_type) 
      mail.send() 
      #return render_to_response('Email.html', {'message': 'Sent email to %s'%email}) 
      args = {} 
      args.update(csrf(request)) 
      args['form'] = EmailForm() 
      #return render_to_response('email.html' , args) 
      #return render_to_response(
      #'email.html', args 
      #context_instance=RequestContext(request) 
      return render_to_response("email.html", args) 


     except: 
     #  return render_to_response('admin/Error.html', {'message': 'Either the attachment is too big or corrupt'}) 
      return render_to_response('loggedin.html') 

формы ...

from django import forms 

class EmailForm(forms.Form): 
    email = forms.EmailField() 
    subject = forms.CharField(max_length=100) 
    attach = forms.Field(widget = forms.FileInput) 
    message = forms.CharField(widget = forms.Textarea) 

шаблон ...

{% block content %} 
{{message}} 
{% if email_form %} 
<form method="POST" action ="." enctype="multipart/form-data"> 
     {% csrf_token %} 
<br></br> 
{{email_form.as_p}} 

<label>&nbsp;</label><label>&nbsp;</label><label>&nbsp;</label> 
<input type ="submit" name = "send" value = "Send"/> 
</form> 
{% endif %} 
{% endblock content %} 

И файл настройки ...

#settings.py 
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 

# Host for sending e-mail. 
EMAIL_HOST = 'smtp.gmail.com' 

# Port for sending e-mail. 
EMAIL_PORT = 587 

# Optional SMTP authentication information for EMAIL_HOST. 
EMAIL_HOST_USER = ‘[email protected]' 
EMAIL_HOST_PASSWORD = ‘mypassword' 
EMAIL_USE_TLS = True 

Очевидно, что это не настоящий адрес электронной почты и пароль для адреса gmail. У меня есть фактический gmail, который я использую.

ответ

0

render_to_response() Заменить вызовы с render():

from django.shortcuts import render 

return render(request, 'email.html', {'email_form': form}) 

Или передать экземпляр RequestContext к render_to_response():

return render_to_response("email.html", {'email_form': form}, 
          context_instance=RequestContext(request)) 
+0

Спасибо так много! Маркер работал. Я предполагаю, что это потому, что он автоматически использует RequestContext? Это была проблема, которую мы обнаружили, когда мы исследовали это, однако совет по использованию «рендеринга» никогда не возникал. Спасибо за вашу помощь. У нас сейчас небольшая проблема с отправкой электронной почты, но это совершенно новая возможность червей ... спасибо! – cloudyGirrl

+0

Да, если вы не передаете 'RequestContext' в вызов' render() ', он автоматически создает такой экземпляр контекста. – catavaran

Смежные вопросы