Python Django中间件跳过静态url中的数据属性

Python Django中间件跳过静态url中的数据属性,python,django,python-3.x,push-notification,django-views,Python,Django,Python 3.x,Push Notification,Django Views,我在django应用程序中构建了一个简单的中间件。它适用于推送通知图像跟踪。逻辑:若push出现,中间件应该通过数据属性和更新push对象的状态来查看它。 我的中间件代码: class PushStatistic: def process_request(self, request): if request.GET.get('pushid'): print('entered push id for readed') push

我在django应用程序中构建了一个简单的中间件。它适用于推送通知图像跟踪。逻辑:若push出现,中间件应该通过数据属性和更新push对象的状态来查看它。 我的中间件代码:

class PushStatistic:
    def process_request(self, request):
        if request.GET.get('pushid'):
            print('entered push id for readed')
            pushid = request.GET.get('pushid')
            print(f'Push id - {pushid}. Updating...')
            if pushid:
                pushid = int(pushid)
                if Push.objects.filter(id=pushid).exists():
                    Push.objects.filter(id=pushid).update(status=4)
                    print('status updated')
因此,当我发送通知时,推送的图标url如下所示:

https://test.com/static/img/pic.png?pushid=9403687
当push出现时,我看到了图片,但中间件不工作

我使用相同的中间件逻辑来跟踪推送点击,并且运行良好。我无法理解我现在做错了什么,因为在我看来,这和我的要求是一样的。可能是因为它的静态url

此外,我还构建了django视图,该视图具有与推送跟踪相同的逻辑,并且在视图中可以工作:

def fileresp(request, filename):
    if request.GET.get('pushid'):
        pushid = request.GET.get('pushid')
        Push.objects.filter(id=pushid).update(status=4)


    image_data = open(f"{project_settings.BASE_DIR}/media/{filename}", "rb").read()
    return HttpResponse(image_data, content_type="image/png")

但我想在django中间件中构建它,以实现更多的通用性。是否可能?

在生产环境中,您通常会将服务器(如Apache或Nginx)配置为提供静态/媒体文件,或者使用CDN。因此,Django不会处理静态文件的请求,因此中间件不会运行


如果您必须运行这个中间件来实现静态文件,您可以考虑使用静态文件。您需要将中间件类置于WhiteNoiseMiddleware之上,尽管whitenoise文档中有警告不要这样做。

在生产中,您通常配置服务器(例如Apache或Nginx)以提供静态/媒体文件,或使用CDN。因此,Django不会处理静态文件的请求,因此中间件不会运行


如果您必须运行这个中间件来实现静态文件,您可以考虑使用静态文件。您需要将中间件类置于WhiteNoiseMiddleware之上,尽管whitenoise文档中有警告不要这样做。

您需要将中间件更新为设计


您需要将中间件更新为设计



“中间件不工作”这是什么意思?是否有错误消息或任何日志?或者你只是没有得到更新?推送对象只是没有更新,“打印”没有显示在日志中,你使用的是哪个版本的Django?Django中间件不再是这样设计的Django==1.11.4。不幸的是,我现在不能更新它,因为整个项目确实很旧,而且仍然有很多旧的逻辑,中间件早就改变了,即使对于1.11“中间件不工作”,你这是什么意思?是否有错误消息或任何日志?或者你只是没有得到更新?推送对象只是没有更新,“打印”没有显示在日志中,你使用的是哪个版本的Django?Django中间件不再是这样设计的Django==1.11.4。不幸的是,我现在不能更新它,因为整个项目确实很旧,而且仍然有很多旧的逻辑,中间件早就改变了,即使对于1.11,您也可以将来自服务器的流量镜像到只设计用于更新的其他路由。例如,使用。您还可以将来自服务器的流量镜像到仅用于执行更新的其他路由。例如,使用.Django 1.11支持
中间件类
中间件
。升级是个好主意,但旧式中间件并不是问题的根源。@IainShelvington for me process_请求成功。我对中间件配置没有任何问题,问题只是推送更新逻辑。对于点击,我使用相同的中间件,它工作得很好。所以我认为问题不在于中间件设计,如果您想使用流程,您需要子类_request@Alasdair如果设置使用的是
中间件类
,而不是
中间件
,则仅当中间件对弃用类进行了子类化时,才会使用,那么Django 1.10/1.11中不需要mixin。Django 1.11支持
中间件类
中间件
。升级是个好主意,但旧式中间件并不是问题的根源。@IainShelvington for me process_请求成功。我对中间件配置没有任何问题,问题只是推送更新逻辑。对于点击,我使用相同的中间件,它工作得很好。所以我认为问题不在于中间件设计,如果您想使用流程,您需要子类_request@Alasdair确实如此,但只有当中间件子类化了弃用类时,如果设置使用的是
中间件类
而不是
中间件
,那么Django 1.10/1.11中不需要mixin。
class PushStatistic(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.GET.get('pushid'):
            print('entered push id for readed')
            pushid = request.GET.get('pushid')
            print(f'Push id - {pushid}. Updating...')
            if pushid:
                pushid = int(pushid)
                if Push.objects.filter(id=pushid).exists():
                    Push.objects.filter(id=pushid).update(status=4)
                    print('status updated')

        response = self.get_response(request)

        return response