Я проверил пакет, упомянутый @Makarand Bauskar. Однако я не был удовлетворен. Он не активен и использует собственный способ работы / работы с заголовком Last-Modified. Поэтому я решил создать новый пакет django-rest-framework-condition , который будет:
[ 1110] Для его установки:
pip install django-rest-framework-condition
Использование:
from django.contrib.auth import get_user_model
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from rest_framework_condition import last_modified
def my_last_modified(request, *args, **kwargs):
return datetime(2019, 1, 1)
class SubscriptionViewSet(ViewSet):
@last_modified(my_last_modified)
def list(self, request):
data = {'user_count': get_user_model().objects.count()}
return Response(data)
It works now, for both XP and Vista. I created a stub winform app with the relevant code (could be cleaned up, obviously, but it conveys the point).
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace standbyTest
{
public partial class Form1 : Form
{
[DllImport("Kernel32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
protected static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE state);
[Flags]
public enum EXECUTION_STATE : uint
{
ES_CONTINUOUS = 0x80000000,
ES_DISPLAY_REQUIRED = 2,
ES_SYSTEM_REQUIRED = 1,
ES_AWAYMODE_REQUIRED = 0x00000040
}
public Form1()
{
if(Environment.OSVersion.Version.Major > 5)
{
// vista and above: block suspend mode
SetThreadExecutionState(EXECUTION_STATE.ES_AWAYMODE_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
}
InitializeComponent();
//MessageBox.Show(string.Format("version: {0}", Environment.OSVersion.Version.Major.ToString() ));
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
if(Environment.OSVersion.Version.Major > 5)
{
// Re-allow suspend mode
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
}
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
// Power status event triggered
if(m.Msg == (int)WindowMessage.WM_POWERBROADCAST)
{
// Machine is trying to enter suspended state
if(m.WParam.ToInt32() == (int)WindowMessage.PBT_APMQUERYSUSPEND ||
m.WParam.ToInt32() == (int)WindowMessage.PBT_APMQUERYSTANDBY)
{
// Have perms to deny this message?
if((m.LParam.ToInt32() & 0x1) != 0)
{
// If so, deny broadcast message
m.Result = new IntPtr((int)WindowMessage.BROADCAST_QUERY_DENY);
}
}
return;
}
base.WndProc(ref m);
}
}
internal enum WindowMessage
{
/// <summary>
/// Notify that machine power state is changing
/// </summary>
WM_POWERBROADCAST = 0x218,
/// <summary>
/// Message indicating that machine is trying to enter suspended state
/// </summary>
PBT_APMQUERYSUSPEND = 0x0,
PBT_APMQUERYSTANDBY = 0x0001,
/// <summary>
/// Message to deny broadcast query
/// </summary>
BROADCAST_QUERY_DENY = 0x424D5144
}
}
Вы работаете на Vista или Windows Server 2008? Эта страница говорит
Из-за изменений в Модели Управления питанием для Windows Vista и Windows Server 2008, событие PBT-APMQUERYSUSPEND больше не поставляется приложениям. Вместо этого событие BT_APMSUSPEND поставляется...
Это могло быть то, почему Вы не видите его?
Я попробовал этот же код в тестовом приложении на моей (dev) машине и на другой (тестовой) машине ( также winXP). На моей машине она продолжает выходить из строя, то есть машина уходит в сон. Но на другой машине все работает! Сначала я думал, что это проблема отладки и режима выпуска, но это не так.
Кажется, что-то не так в моей машине разработчика, хотя я понятия не имею, что это может быть.
Тайна решена .. Сорта.
В Vista вызовите SetThreadExecutionState, чтобы уведомить WPM о том, что система не находится в режиме ожидания.
В Windows XP / 2000:
Приложение может вернуть BROADCAST_QUERY_DENY, чтобы отклонить запрос PBT_APMQUERYSUSPEND или PBT_APMQUERYSUSPENDFAILED.
MSDN: Windows XP и более ранние версии: система передает событие PBT_APMQUERYSUSPEND, чтобы запросить разрешение на приостановку работы системы. Система ожидает, что каждое приложение и драйвер определят, должно ли запрошенное событие произойти, и вернут TRUE, если оно произойдет, или вернут BROADCAST_QUERY_DENY в противном случае. Приложения не должны отклонять этот запрос. Если приложение отклоняет этот запрос, система передает событие PBT_APMQUERYSUSPENDFAILED. Это событие уведомляет приложения и драйверы о продолжении работы в обычном режиме.
Также я не думаю, что PBT_APMQUERYSTANDBY или PBT_APMSTANDBY поддерживаются в Win2K. Вы пробовали глобально регистрировать трансляцию, когда Windows выключается, чтобы увидеть, отправляются ли они?