如何为django-maintenance-mode维护模式模板添加功能?
解决Django Maintenance Mode模板添加表单功能的问题
我之前也碰到过一模一样的情况——这个包靠中间件拦截所有请求直接返回维护页面,常规视图函数确实不会被触发。不过咱们可以利用包自带的「忽略URL」配置绕过这个限制,让表单提交的请求能正常抵达视图处理,具体步骤如下:
第一步:定义表单处理的URL与视图
先在urls.py里新增一个专门处理订阅请求的路由:from django.urls import path from . import views urlpatterns = [ # 其他原有URL... path('subscribe-newsletter/', views.handle_newsletter_subscription, name='newsletter_subscribe'), ]接着在
views.py里写对应的处理函数,比如把邮箱保存到数据库:from django.http import JsonResponse from django.views.decorators.csrf import csrf_protect from .models import NewsletterSubscriber @csrf_protect def handle_newsletter_subscription(request): if request.method == 'POST': email = request.POST.get('email') if email: # 这里可以加邮箱格式验证逻辑 NewsletterSubscriber.objects.get_or_create(email=email) return JsonResponse({'status': 'success', 'message': '订阅成功!我们会尽快联系你~'}) return JsonResponse({'status': 'error', 'message': '请输入有效的邮箱地址哦'}) # GET请求直接返回错误 return JsonResponse({'status': 'error', 'message': '无效的请求方式'})第二步:配置维护模式忽略该URL
在settings.py里找到或新增MAINTENANCE_MODE_IGNORE_URLS配置,把刚才定义的订阅URL用正则表达式加进去:MAINTENANCE_MODE_IGNORE_URLS = ( r'^subscribe-newsletter/$', )这样维护模式的中间件就不会拦截这个URL的请求,表单提交能正常被视图处理。
第三步:在维护模板里添加表单
打开你的维护模式模板(默认是maintenance_mode/base.html,自定义过就用你自己的模板),添加表单代码,推荐用AJAX提交避免页面跳转:<div class="newsletter-section"> <h3>订阅我们的通讯,第一时间获取网站更新通知</h3> <form id="subscribeForm"> {% csrf_token %} <input type="email" name="email" placeholder="请输入你的邮箱" required> <button type="submit">立即订阅</button> </form> <div id="subscriptionMsg" style="margin-top:10px; display:none;"></div> </div> <script> document.getElementById('subscribeForm').addEventListener('submit', function(e) { e.preventDefault(); const formData = new FormData(this); const msgElement = document.getElementById('subscriptionMsg'); fetch("{% url 'newsletter_subscribe' %}", { method: 'POST', body: formData }) .then(res => res.json()) .then(data => { msgElement.style.display = 'block'; msgElement.style.color = data.status === 'success' ? 'green' : 'red'; msgElement.textContent = data.message; // 清空输入框 this.reset(); }) .catch(() => { msgElement.style.display = 'block'; msgElement.style.color = 'red'; msgElement.textContent = '订阅失败,请稍后重试'; }); }); </script>
这样设置后,哪怕网站处于维护模式,用户的订阅请求也能正常被处理,而且全程不用跳页,体验更顺畅。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

