我在控制台日志上收到此错误,并且在表单提交时它会不断加载,但不会将数据发布到服务器。
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.
这是我关闭通道的代码。
/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项目使用django-redis 3.8.0连接到reds的aws实例.但是,我ConnectionError: Error 111 connecting to None:6379. Connection refused.在尝试连接时收到了.如果我ssh到我的ec2并使用shell中的redis-py,我能够从缓存中读取和写入就好了,所以我不相信这是一个安全策略问题.
我是 django/redis 的新手,我开始熟悉 heroku redis 插件。但是,我只能使用set和get。
当我尝试使用其他方法时hset,我收到此错误:'RedisCache' object has no attribute
cache.hset('key', 'value')
我该如何管理?
使用 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) 我想做的是构建一个自定义版本,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 和 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-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不提供此实现有什么原因吗?我出于好奇而问。我可能错过了一些细节吗?
我已经在 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 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-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)
在此先感谢您的解决方案
我有一个 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))?
我在缓存中设置了一个查询集:
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提前..
django ×12
django-redis ×12
redis ×8
python ×5
caching ×4
django-cache ×2
heroku ×1
python-3.x ×1
session ×1
websocket ×1