使用 Django 和 Mailchimp 的电子邮件订阅表单在部署后不起作用 (DigitalOcean)
An email subscription form with Django and Mailchimp doesn't work after deployment (DigitalOcean)
我用 Django 和 Mailchimp 构建了一个简单的电子邮件订阅表单。它在本地工作得很好,但是,在将它部署到 DigitalOcean 之后它似乎不起作用。我认为它可能与数据库有关,但我确实在服务器上迁移并且没有收到任何错误(在服务器上使用 Ubuntu 20.04)。
希望有人有线索可以帮助我解决这个问题。
表格如下:
https://www.winoutt.io
views.py
from django.contrib import messages
from django.http import HttpResponseRedirect
# from django.conf import settings
from .models import Signup
from decouple import config
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
MAILCHIMP_API_KEY = config("MAILCHIMP_API_KEY")
MAILCHIMP_DATA_CENTER = config("MAILCHIMP_DATA_CENTER")
MAILCHIMP_EMAIL_LIST_ID = config("MAILCHIMP_EMAIL_LIST_ID")
api_url = f"https://{MAILCHIMP_DATA_CENTER}.api.mailchimp.com/3.0"
members_endpoint = f"{api_url}/lists/{MAILCHIMP_EMAIL_LIST_ID}/members"
def subscribe_email(email):
data = {"email_address": email, "status": "subscribed"}
req = requests.post(
members_endpoint, auth=("", MAILCHIMP_API_KEY), data=json.dumps(data)
)
return req.status_code, req.json()
def newsletter_email_list(request):
if request.method == "POST":
email = request.POST.get("email", None)
email_query = Signup.objects.filter(email=email)
if email:
if email_query.exists():
messages.info(request, "You are already on the waitlist.")
else:
try:
subscribe_email(email)
subscribed = Signup.objects.create(email=email)
subscribed.save()
messages.success(
request,
"Thank you! We're putting you on the waitlist. Bear with us.",
)
except:
messages.warning(request, "Something went wrong. Please try again.")
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
else:
messages.warning(request, "Please enter your email")
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
models.py
from django.db import models
class Signup(models.Model):
email = models.CharField(max_length=100)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.email
urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from pages.views import custom_page_not_found_view, PageView
from about.views import AboutView
from privacy.views import PrivacyView
from newsletter.views import newsletter_email_list
handler404 = "pages.views.custom_page_not_found_view"
urlpatterns = [
path("jet/", include("jet.urls", "jet")),
path("admin/", admin.site.urls),
path("", PageView.as_view(), name="all_pages"),
# path("<slug>/", PostDetailView.as_view(), name="post_detail"),
path("tinymce/", include("tinymce.urls")),
path("about/", AboutView.as_view(), name="about"),
path("privacy-policy/", PrivacyView.as_view(), name="privacy"),
path("newsletter/subscribe/", newsletter_email_list, name="newsletter_subscribe"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
模板
<form action="{% url 'newsletter_subscribe' %}" class="flex items-end justify-center w-full mt-4" method="POST">
{% csrf_token %}
<input type="email" id="email" name="email" class="w-full px-3 py-1 mt-2 text-base leading-8 text-gray-100 transition-colors duration-200 ease-in-out border border-gray-700 rounded outline-none bg-blackLight focus:border-blue-500" placeholder="Your email" value="{{ email }}" required>
</div>
<button type="submit" class="inline-flex px-8 py-2 mt-4 mb-12 ml-4 text-lg text-white bg-blue-600 border-0 border-transparent rounded-lg shadow focus:outline-none hover:bg-blue-700" value="Send">Join</button>
</form>
.env
# Database Configurations
DB_ENGINE="django.db.backends.postgresql"
DB_NAME=""
DB_USER=""
DB_PASSWORD=""
DB_HOST="localhost"
你有 DigitalOcean 上的数据库吗?如果您托管本地数据库,则需要更改为 sqlite 后端,或附加到云 RDBMS。
好像是权限问题。但是,我通过编辑 gunicorn.service 文件解决了这个问题。
我打开了gunicorn.service个文件
sudo nano /etc/systemd/system/gunicorn.service
编辑前
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=djangoadmin
Group=www-data
WorkingDirectory=/home/djangoadmin/canny
ExecStart=/home/djangoadmin/.local/share/virtualenvs/canny-9cyzXi2O/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
编辑后
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=djangoadmin
Group=djangoadmin
WorkingDirectory=/home/djangoadmin/canny
ExecStart=/home/djangoadmin/.local/share/virtualenvs/canny-9cyzXi2O/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
我只是更改了组部分,以便它与我的用户匹配。
成功了。
我用 Django 和 Mailchimp 构建了一个简单的电子邮件订阅表单。它在本地工作得很好,但是,在将它部署到 DigitalOcean 之后它似乎不起作用。我认为它可能与数据库有关,但我确实在服务器上迁移并且没有收到任何错误(在服务器上使用 Ubuntu 20.04)。
希望有人有线索可以帮助我解决这个问题。
表格如下: https://www.winoutt.io
views.py
from django.contrib import messages
from django.http import HttpResponseRedirect
# from django.conf import settings
from .models import Signup
from decouple import config
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
MAILCHIMP_API_KEY = config("MAILCHIMP_API_KEY")
MAILCHIMP_DATA_CENTER = config("MAILCHIMP_DATA_CENTER")
MAILCHIMP_EMAIL_LIST_ID = config("MAILCHIMP_EMAIL_LIST_ID")
api_url = f"https://{MAILCHIMP_DATA_CENTER}.api.mailchimp.com/3.0"
members_endpoint = f"{api_url}/lists/{MAILCHIMP_EMAIL_LIST_ID}/members"
def subscribe_email(email):
data = {"email_address": email, "status": "subscribed"}
req = requests.post(
members_endpoint, auth=("", MAILCHIMP_API_KEY), data=json.dumps(data)
)
return req.status_code, req.json()
def newsletter_email_list(request):
if request.method == "POST":
email = request.POST.get("email", None)
email_query = Signup.objects.filter(email=email)
if email:
if email_query.exists():
messages.info(request, "You are already on the waitlist.")
else:
try:
subscribe_email(email)
subscribed = Signup.objects.create(email=email)
subscribed.save()
messages.success(
request,
"Thank you! We're putting you on the waitlist. Bear with us.",
)
except:
messages.warning(request, "Something went wrong. Please try again.")
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
else:
messages.warning(request, "Please enter your email")
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
models.py
from django.db import models
class Signup(models.Model):
email = models.CharField(max_length=100)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.email
urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from pages.views import custom_page_not_found_view, PageView
from about.views import AboutView
from privacy.views import PrivacyView
from newsletter.views import newsletter_email_list
handler404 = "pages.views.custom_page_not_found_view"
urlpatterns = [
path("jet/", include("jet.urls", "jet")),
path("admin/", admin.site.urls),
path("", PageView.as_view(), name="all_pages"),
# path("<slug>/", PostDetailView.as_view(), name="post_detail"),
path("tinymce/", include("tinymce.urls")),
path("about/", AboutView.as_view(), name="about"),
path("privacy-policy/", PrivacyView.as_view(), name="privacy"),
path("newsletter/subscribe/", newsletter_email_list, name="newsletter_subscribe"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
模板
<form action="{% url 'newsletter_subscribe' %}" class="flex items-end justify-center w-full mt-4" method="POST">
{% csrf_token %}
<input type="email" id="email" name="email" class="w-full px-3 py-1 mt-2 text-base leading-8 text-gray-100 transition-colors duration-200 ease-in-out border border-gray-700 rounded outline-none bg-blackLight focus:border-blue-500" placeholder="Your email" value="{{ email }}" required>
</div>
<button type="submit" class="inline-flex px-8 py-2 mt-4 mb-12 ml-4 text-lg text-white bg-blue-600 border-0 border-transparent rounded-lg shadow focus:outline-none hover:bg-blue-700" value="Send">Join</button>
</form>
.env
# Database Configurations
DB_ENGINE="django.db.backends.postgresql"
DB_NAME=""
DB_USER=""
DB_PASSWORD=""
DB_HOST="localhost"
你有 DigitalOcean 上的数据库吗?如果您托管本地数据库,则需要更改为 sqlite 后端,或附加到云 RDBMS。
好像是权限问题。但是,我通过编辑 gunicorn.service 文件解决了这个问题。
我打开了gunicorn.service个文件
sudo nano /etc/systemd/system/gunicorn.service
编辑前
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=djangoadmin
Group=www-data
WorkingDirectory=/home/djangoadmin/canny
ExecStart=/home/djangoadmin/.local/share/virtualenvs/canny-9cyzXi2O/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
编辑后
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=djangoadmin
Group=djangoadmin
WorkingDirectory=/home/djangoadmin/canny
ExecStart=/home/djangoadmin/.local/share/virtualenvs/canny-9cyzXi2O/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
我只是更改了组部分,以便它与我的用户匹配。
成功了。