类型为“WSGIRequest”的/emailsignup对象处的TypeError不可JSON序列化

2024-06-09 10:57:33 发布

您现在位置:Python中文网/ 问答频道 /正文

目前正在尝试使用django 2.2和MailChimp制作电子邮件时事通讯。 我从youtube视频中获取了代码,我想我已经卸载了,但后来我遇到了标题中的错误。 我尝试过各种方法,比如在subscribe函数中传递data=data,但没有任何效果。让我担心的是,它在视频中运行得很好,而且因为它不老,我不认为django已经发生了显著的变化。 如有任何帮助/解释,将不胜感激

views.py(并非所有导入)

from django.conf import settings
from .forms import EmailSignupForm
from django.http import HttpResponseRedirect
import json
import requests


MAILCHIMP_API_KEY = settings.MAILCHIMP_API_KEY
MAILCHIMP_DATA_CENTER = settings.MAILCHIMP_DATA_CENTER
MAILCHIMP_EMAIL_LIST_ID  = settings.MAILCHIMP_EMAIL_LIST_ID
api_url = 'https://{dc}.api.mailchimp.com/3.0'.format(dc=MAILCHIMP_DATA_CENTER)
members_endpoint = '{api_url}/lists/{list_id}/members'.format(
    api_url=api_url,
    list_id=MAILCHIMP_EMAIL_LIST_ID
)

def subscribe(email):
    data = {
        "email_address": email,
        "status": "subscribed",
    }
    print(data)
    print(data[])
    r = requests.post(
        members_endpoint,
        auth=("", MAILCHIMP_API_KEY),
        data=json.dumps(data), # I think the error is caused here
    )
    return r.status_code, r.json()


def email_list_signup(request):
    form = EmailSignupForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            email_signup_qs = Signup.objects.filter(email=form.instance.email)
            if email_signup_qs.exists():
                messages.info(request, "You are already subscribed")
            else:
                subscribe(form.instance.email)
                messages.success(request, "You have subscribed successfully!")
                form.save()
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

class HomeView(ListView):
    template_name = "home.html"
    model = Post
    form_class=EmailSignupForm


    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        form = EmailSignupForm()
        context['form'] = form
        return context

    def get_queryset(self):
        return Post.objects.all().order_by('-published_date')[:5]

url.py

from . import views
from django.conf.urls import url
urlpatterns = [
    url(r'^email-signup$', views.subscribe,name="email-signup"),
]

forms.py

class EmailSignupForm(forms.ModelForm):
    email = forms.EmailField(widget=forms.TextInput(attrs={
        "type": "email",
        "name": "email",
        "id": "email",
        "placeholder": "Type your email address",
    }), label="")

    class Meta:
        model = Signup
        fields = ('email', )

home.html中的表单

{% block emailsignup %}
<div class="enter_email sidebar_element">
    <p class="white">Get all new posts E-Mailed to you! No Ads, we promise.</p>
    <form class="form " method='GET' action="{% url 'blog:email-signup' %}">
        {% csrf_token %}
        <!-- <input class="form-control " type="text" placeholder="Your email" name="email"> -->
        {{ form }}
        <button method="POST" class="btn btn-primary w-100 my-3" type="submit">Enter</button>
    </form>
</div>
{% endblock %}

如果有任何代码丢失,请告诉我, 非常感谢你的帮助


Tags: djangofromimportformapiurldataemail
1条回答
网友
1楼 · 发布于 2024-06-09 10:57:33

我解决了。 主要的事情是改变HTML中的表单。按照建议跟踪函数调用后,我发现甚至没有调用subscribe函数。我调查发现我的表单使用的是“GET”而不是“POST”方法。action属性中的url是正确的,但是按钮也有方法post,我删除了它(不知道是否有必要)。 然后,我将url.py中的url更改为路径,这不应该有什么区别,但我想在较新的django版本中是一个很好的做法。 我还向表单添加了enctype=“multipart/form data”,根据我的测试,这是不必要的。 因此,最终文件将是:

home.html中的表单

{% block emailsignup %}
<div class="enter_email sidebar_element">
    <p class="white">Get all new posts E-Mailed to you! No Ads, we promise.</p>
    <form class="form " method='POST' action="{% url 'blog:email-signup' %}" >
        {% csrf_token %}
        <!  <input class="form-control " type="text" placeholder="Your email" name="email">  >
        {{ form }}
        <button class="btn btn-primary w-100 my-3" type="submit">Enter</button>
    </form>
</div>
{% endblock %}

url.py

from . import views
from django.conf.urls import url
from django.urls import path

urlpatterns = [
    path('email-signup/', views.email_list_signup, name='email-signup'),
]

视图.py

from django.conf import settings
from .forms import EmailSignupForm
from django.http import HttpResponseRedirect
import json
import requests


MAILCHIMP_API_KEY = settings.MAILCHIMP_API_KEY
MAILCHIMP_DATA_CENTER = settings.MAILCHIMP_DATA_CENTER
MAILCHIMP_EMAIL_LIST_ID = settings.MAILCHIMP_EMAIL_LIST_ID

api_url = 'https://{dc}.api.mailchimp.com/3.0'.format(dc=MAILCHIMP_DATA_CENTER)
members_endpoint = '{api_url}/lists/{list_id}/members'.format(
    api_url=api_url,
    list_id=MAILCHIMP_EMAIL_LIST_ID
)


def subscribe(email):
    data = {
        "email_address": email,
        "status": "subscribed"
    }
    r = requests.post(
        members_endpoint,
        auth=("", MAILCHIMP_API_KEY),
        data=json.dumps(data)
    )
    return r.status_code, r.json()


def email_list_signup(request):
    form = EmailSignupForm(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            email_signup_qs = Signup.objects.filter(email=form.instance.email)
            if email_signup_qs.exists():
                messages.info(request, "You are already subscribed")
                print("in email_list_signup already subscribed.")
            else:
                subscribe(form.instance.email)
                messages.info(request, "You have been successfully subscribed.")
                print("in email_list_signup you have been subscribed")
                form.save()
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

没有再次提及的其他文件保持不变。 谢谢你帮了大家

相关问题 更多 >