标签: django-redis

Django 通道错误“关闭时间太长并被杀死”。

我在控制台日志上收到此错误,并且在表单提交时它会不断加载,但不会将数据发布到服务器。

/home/Python/Working/Benutzerverwaltung/env/lib/python3.6/site-packages/channels/sessions.py:183>
wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at
0x7fab9fe51408>()]>> for connection <WebSocketProtocol
client=['127.0.0.1', 59462] path=b'/ws/stream/Sales'> took too long to
shut down and was killed.
Run Code Online (Sandbox Code Playgroud)

这是我关闭通道的代码。

/home/Python/Working/Benutzerverwaltung/env/lib/python3.6/site-packages/channels/sessions.py:183>
wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at
0x7fab9fe51408>()]>> for connection <WebSocketProtocol
client=['127.0.0.1', 59462] path=b'/ws/stream/Sales'> took too long to
shut down and was killed.
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

django websocket python-3.x django-redis django-channels

9
推荐指数
1
解决办法
1万
查看次数

无法使用django-redis连接到redis

我有一个django项目使用django-redis 3.8.0连接到reds的aws实例.但是,我ConnectionError: Error 111 connecting to None:6379. Connection refused.在尝试连接时收到了.如果我ssh到我的ec2并使用shell中的redis-py,我能够从缓存中读取和写入就好了,所以我不相信这是一个安全策略问题.

python django amazon-web-services redis django-redis

7
推荐指数
1
解决办法
4686
查看次数

如何在 django-redis-cache 中使用 hset?

我是 django/redis 的新手,我开始熟悉 heroku redis 插件。但是,我只能使用setget

当我尝试使用其他方法时hset,我收到此错误:'RedisCache' object has no attribute

cache.hset('key', 'value')

我该如何管理?

django caching heroku redis django-redis

7
推荐指数
0
解决办法
1327
查看次数

Django Channels Redis:应用程序内部异常:未获取锁

使用 Daphne/Channels 的具有 1000 个 WebSockets 的完全加载的多租户 Django 应用程序,运行良好几个月,突然租户都称其为支持线,应用程序运行缓慢或完全挂起。由于 HTTP REST API 命中率快速且无错误,因此将其缩小到 WebSockets。

应用程序日志或操作系统日志均未表明存在问题,因此唯一要做的就是下面提到的异常。在这两天的时间里,它在这里和那里一遍又一遍地发生。

我不期望任何深入的调试帮助,只是一些关于可能性的即兴建议。

AWS Linux 1
Python 3.6.4
Elasticache Redis 5.0
Run Code Online (Sandbox Code Playgroud)
channels==2.4.0
channels-redis==2.4.2
daphne==2.5.0
Django==2.2.13
Run Code Online (Sandbox Code Playgroud)

uwsgi服务的拆分配置HTTP,daphne服务asgi,Nginx

May 10 08:08:16 prod-b-web1: [pid 15053] [version 119.5.10.5086] [tenant_id -] [domain_name -] [pathname /opt/releases/r119.5.10.5086/env/lib/python3.6/site-packages/daphne/server.py] [lineno 288] [priority ERROR] [funcname application_checker] [request_path -] [request_method -] [request_data -] [request_user -] [request_stack -] Exception inside application: Lock is not acquired.
Traceback (most recent call last):
  File "/opt/releases/r119.5.10.5086/env/lib/python3.6/site-packages/channels_redis/core.py", line 435, in receive
    real_channel
  File "/opt/releases/r119.5.10.5086/env/lib/python3.6/site-packages/channels_redis/core.py", …
Run Code Online (Sandbox Code Playgroud)

python django redis django-redis django-channels

7
推荐指数
1
解决办法
431
查看次数

Django Rest 框架:Pickle 响应

我想做的是构建一个自定义版本,cache_page让我可以更好地控制缓存键,但我什至无法完成响应的基本缓存:

from django.core.cache import cache
from rest_framework import viewsets
from rest_framework.response import Response

from app import models

class BaseViewSet(viewsets.GenericViewSet):
    queryset = models.Items.objects.all()

    def get_queryset(self):
        return models.Items.objects.all()

    def list(self, request, **kwargs):
        response = Response({})
        cache.set('test', response, 10)
        return response
Run Code Online (Sandbox Code Playgroud)

我的相关部分settings.py设置为:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning'
}
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": f"redis://127.0.0.1:6729/1",
    },
}
Run Code Online (Sandbox Code Playgroud)

当我尝试调用端点时,我得到:

django.template.response.ContentNotRenderedError: The response content must be rendered before it can be pickled.
Run Code Online (Sandbox Code Playgroud)

然后,如果我将该行更改为:

cache.set('test', response.render(), …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework django-redis

6
推荐指数
1
解决办法
952
查看次数

从 Redis (Django) 中删除会话

我使用 Django 和 Redis 作为会话引擎(也是 Celery,但那是别的东西)。它工作得很好,我可以看到速度的提高。

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
Run Code Online (Sandbox Code Playgroud)

我有一个脚本,每分钟运行一次,通过某些方法检查活动用户,如果用户在最近一分钟内没有活动,则会话将被删除。这样做是为了满足客户的跟踪需求。

在我切换到 Redis 作为会话引擎之前,此脚本运行良好。会话确实从数据库中删除,但不会从 Redis 中删除。我没有为此使用任何 Django 内置方法,而是使用我自己的函数:

def clean_sessions():
    stored_sessions = Session.objects.all()
    active_users = active_users(minutes=1)
    active_users_ids = [user.id for user in active_users]
    for session in stored_sessions:
        session_uid = session.get_decoded().get('_auth_user_id')
        if not session_uid:
            session.delete()
            continue
        if session_uid not in active_users_ids:
            user = User.objects.get(pk=session_uid)
            ## some code between ##
            session.delete()
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何从缓存中删除会话,以便用户实际上已注销?

django session django-authentication redis django-redis

5
推荐指数
1
解决办法
2213
查看次数

Django Redis LPUSH / RPUSH

我正在使用django-redis后端和django.core.cache.cache模块。django缓存模块似乎不支持推送到列表和处理某些数据结构的适当功能。

隐含的实现用于更新Django缓存模块中的列表:

my_list = cache.get('my_list')
my_list.append('my value')

cache.set('my_list', my_list)
Run Code Online (Sandbox Code Playgroud)

这种方法效率不高,因为整个列表都已加载到应用程序服务器的内存中。

Redis支持LPUSH / RPUSH命令以动态更新列表。但是,看起来这些方法在django缓存模块中不可用。

官方的python redis客户端似乎实现了这些方法。django不提供此实现有什么原因吗?我出于好奇而问。我可能错过了一些细节吗?

python django caching redis django-redis

5
推荐指数
1
解决办法
1391
查看次数

缓存值未出现在 Redis 中

我已经在 Django 中将 Redis 设置为我的缓存,并具有以下设置:

CACHES = {
    'default': {
        'BACKEND': 'redis_cache.RedisCache',
        'LOCATION': 'localhost:6379',
        'OPTIONS': {
            'PICKLE_VERSION': 1,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

我正在试验它(Redis 的新手,想更好地理解它)。所以,我进入我的 Django shell,然后我做:

from django.core.cache import cache
cache.set('asdf', 2)
cache.get('asdf')  # Returns 2
Run Code Online (Sandbox Code Playgroud)

然后我进入redis-cli,我希望在那里看到价值,但这些都没有显示任何价值:

KEYS *
GET *
GET 'asdf'
Run Code Online (Sandbox Code Playgroud)

那是怎么回事?

django caching redis django-redis

4
推荐指数
1
解决办法
1169
查看次数

Django 中的缓存和 django-channels 通道层可以使用相同的 Redis 存储吗?

我有一个 Django 3.1 应用程序,它使用 Redis 作为其缓存后备存储 (django-redis)。我希望使用 django-channels,它能够使用 Redis 作为通道层

同时为缓存和 django-channels 通道层使用相同的 Redis 存储是否安全?换句话说,我希望在我的 settings.py 中包含以下内容,并且我想知道这是否可以。

import environ

env = environ.Env()

REDIS_HOST = env('REDIS_HOST', default='127.0.0.1')
REDIS_PORT = env('REDIS_PORT', default='6379')

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        "LOCATION": "redis://" + REDIS_HOST + ":" + REDIS_PORT + "/0",
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'CONNECTION_POOL_KWARGS': {'max_connections': 30},
            'IGNORE_EXCEPTIONS': True,
        }
    }
}

CHANNEL_LAYERS = {
    "default": {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        "CONFIG": {
            "hosts": [(REDIS_HOST, int(REDIS_PORT))],
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

django django-cache django-redis django-channels

3
推荐指数
1
解决办法
1096
查看次数

如何在Django-1.9中添加Redis数据库?

我想在Django-1.9中添加Redis数据库,所以我按照这些文档进行集成 https://niwinz.github.io/django-redis/latest/ 但我没有找到任何关于如何提及数据库名称的线索设置,这里我想提到Redis作为代表Sqlite3的数据库,如果取消注释这行django抛出DATABASE错误未找到

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'sqlite3'),
}
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的解决方案

python django redis django-settings django-redis

2
推荐指数
1
解决办法
2795
查看次数

有没有办法为 Django 缓存锁设置过期时间?

我有一个 Django 3.1.3 服务器,它通过 django-redis 4.12.1 使用 Redis 进行缓存。我知道缓存锁通常可以通过以下方式设置:

with cache.lock('my_cache_lock_key'):
    # Execute some logic here, such as:
    cache.set('some_key', 'Hello world', 3000)
Run Code Online (Sandbox Code Playgroud)

with一般来说,当块执行完成时,缓存锁就会释放。但是,我的代码中有一些自定义逻辑,有时不会释放缓存锁(出于我自己的原因,这很好)。

我的问题:有没有办法为 Django 缓存锁设置超时值,与设置缓存值的超时值非常相似(cache.set('some_key', 'Hello world', 3000))?

django caching django-cache redis django-redis

1
推荐指数
1
解决办法
5253
查看次数

redis与django-redis无关

我在缓存中设置了一个查询集:

cache.set('person',Lecture_Detail.objects.all())
Run Code Online (Sandbox Code Playgroud)

在我看来:

from django.core.cahe import cache
t3=datetime.datetime.now()
list(Lecture_Detail.objects.all())
t5 = datetime.datetime.now()
print "time before",(t5 - t3)
g = cache.get('person')
t4 = datetime.datetime.now()
print "time after",(t4 - t5)
g = cache.get('person')
t6 = datetime.datetime.now()
print "time after",t6-t4
g = cache.get('person')
t7 = datetime.datetime.now()
print "time after",t7-t6
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,其输出为:

time before 0:00:00.014256
time after 0:00:01.366022
time after 0:00:01.552436
time after 0:00:01.433049
Run Code Online (Sandbox Code Playgroud)

所以我认为我的redis与django-redis无关.我的设置是:

CACHES = {
    "default": {
        "BACKEND": "redis_cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379:1",
        "OPTIONS": {
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以请告诉我一些事情.. thanx提前..

python django django-redis

0
推荐指数
1
解决办法
188
查看次数