首页 > 解决方案 > Python(Redis + DRF):类型无效的输入:'NoneType'。先转换为字节、字符串、整数或浮点数

问题描述

我有我的 redis 运行服务器,这是它的配置:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://TestPass1234@192.168.0.30:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient"
        },
        "KEY_PREFIX": "example"
    }
}

CACHE_TTL = 60 * 1  # 1 hour

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

这是我的views.py

from django.shortcuts import render
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_cookie
from rest_framework.viewsets import ModelViewSet
from .serializers import TestSerializer
from .models import Test
# Create your views here.


class NameofViewSet(ModelViewSet):
    serializer_class = TestSerializer
    queryset = Test.objects.all()
    #lookup_field = 'name_of_lookup_field'
    # and more..

    @method_decorator(vary_on_cookie)
    @method_decorator(cache_page(60*60))
    def dispatch(self, *args, **kwargs):
        return super(TestSerializer, self).dispatch(*args, **kwargs)

我在数据库中有一个对象,只是为了通过请求 URL 来获取一些东西。

错误 :

[08/Dec/2020 02:17:25] "GET /tests/ HTTP/1.1" 500 158257
Internal Server Error: /tests/
Traceback (most recent call last):
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 643, in on_connect
    auth_response = self.read_response()
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 756, in read_response
    raise response
redis.exceptions.AuthenticationWrongNumberOfArgsError: wrong number of arguments for 'auth' command

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\rest_framework\viewsets.py", line 125, in 
view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\views\decorators\vary.py", line 38, in inner_func
    response = func(*args, **kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\utils\decorators.py", line 122, in 
_wrapped_view
    result = middleware.process_request(request)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\middleware\cache.py", line 145, in 
process_request
    cache_key = get_cache_key(request, self.key_prefix, 'GET', cache=self.cache)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django\utils\cache.py", line 360, in get_cache_key
    headerlist = cache.get(cache_key)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django_redis\cache.py", line 87, in get   
    value = self._get(key, default, version, client)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django_redis\cache.py", line 27, in _decorator
    return method(self, *args, **kwargs)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django_redis\cache.py", line 94, in _get  
    return self.client.get(key, default=default, version=version, client=client)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\django_redis\client\default.py", line 220, in get
    value = client.get(key)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\client.py", line 1606, in get       
    return self.execute_command('GET', name)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\client.py", line 898, in execute_command
    conn = self.connection or pool.get_connection(command_name, **options)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 1192, in get_connection
    connection.connect()
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 567, in connect    self.on_connect()
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 649, in on_connect
    self.send_command('AUTH', self.password, check_health=False)
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 725, in send_command
    self.send_packed_command(self.pack_command(*args),
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 775, in pack_command
    for arg in imap(self.encoder.encode, args):
  File "C:\Users\dziugas\.virtualenvs\test_cache-PBGnRHhx\lib\site-packages\redis\connection.py", line 119, in encode 
    raise DataError("Invalid input of type: '%s'. Convert to a "
redis.exceptions.DataError: Invalid input of type: 'NoneType'. Convert to a bytes, string, int or float first.        
[08/Dec/2020 02:19:58] "GET /tests/ HTTP/1.1" 500 158257

这是我第一次尝试使用缓存,可能出了什么问题?我在 youtube 上关注本教程,但没有得到与预期相同的结果。如何使用redis?

我的Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
django = "*"
django-rest-framework = "*"
django-redis = "==4.12.1"
django-redis-cache = "==3.0.0"
redis = "==3.5.3"

[dev-packages]

[requires]
python_version = "3.9"

标签: pythondjangodjango-rest-frameworkredis

解决方案


我对 Django 如何为 redis 提供密码有错误的理解,所以我将设置更改为:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://@192.168.0.30:6379/1",
        "OPTIONS": {
            "PASSWORD": "TestPass123",
            "CLIENT_CLASS": "django_redis.client.DefaultClient"
        },
        "KEY_PREFIX": "example"
    }
}

推荐阅读