You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:35:38