'data'
Request Method: | GET |
---|---|
Request URL: | http://batchest.com/horoscope/?channelname=dr3wa_ |
Django Version: | 3.2.7 |
Exception Type: | KeyError |
Exception Value: | 'data' |
Exception Location: | /app/horoscope/scripts/twitchapi.py, line 171, in get_follows_by_userid |
Python Executable: | /usr/local/bin/python |
Python Version: | 3.8.18 |
Python Path: | ['/app', '/usr/local/bin', '/usr/local/lib/python38.zip', '/usr/local/lib/python3.8', '/usr/local/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/site-packages'] |
Server time: | Fri, 29 Mar 2024 15:59:34 +0000 |
/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py
, line 47, in inner
response = await sync_to_async(response_for_exception, thread_sensitive=False)(request, exc)
return response
return inner
else:
@wraps(get_response)
def inner(request):
try:
response = get_response(request)…
except Exception as exc:
response = response_for_exception(request, exc)
return response
return inner
Variable | Value |
---|---|
exc | KeyError('data') |
get_response | <bound method BaseHandler._get_response of <django.core.handlers.wsgi.WSGIHandler object at 0x7f4b230a64f0>> |
request | <WSGIRequest: GET '/horoscope/?channelname=dr3wa_'> |
/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py
, line 181, in _get_response
if response is None:
wrapped_callback = self.make_view_atomic(callback)
# If it is an asynchronous view, run it in a subthread.
if asyncio.iscoroutinefunction(wrapped_callback):
wrapped_callback = async_to_sync(wrapped_callback)
try:
response = wrapped_callback(request, *callback_args, **callback_kwargs)…
except Exception as e:
response = self.process_exception_by_middleware(e, request)
if response is None:
raise
# Complain if the view returned None (a common error).
Variable | Value |
---|---|
callback | <function home at 0x7f4b221559d0> |
callback_args | () |
callback_kwargs | {} |
middleware_method | <bound method CsrfViewMiddleware.process_view of <django.middleware.csrf.CsrfViewMiddleware object at 0x7f4b2216da60>> |
request | <WSGIRequest: GET '/horoscope/?channelname=dr3wa_'> |
response | None |
self | <django.core.handlers.wsgi.WSGIHandler object at 0x7f4b230a64f0> |
wrapped_callback | <function home at 0x7f4b221559d0> |
/app/horoscope/views.py
, line 50, in home
error_popup = f"""<div class="alert alert-dismissible alert-danger">
<strong>Oh snap!</strong> Channel {name} does not exist on Twitch! Check out
this channel instead!</div>"""
user = Streamer(get_data_by_channelname_cached("twitch"))
user_dict = user.relevantDict
# handle follows
follow_list = FollowList(user)
follows_same_zodiac = follow_list.get_zodiac_dict(user)…
follows_same_chinese_zodiac = follow_list.get_chinese_zodiac_dict(user)
follows_dict = follow_list.get_account_dict()
# handle big streamers
bigs_list = BigStreamerList()
bigs_same_zodiac = bigs_list.get_zodiac_dict(user=user)
Variable | Value |
---|---|
error_popup | ('<div class="alert alert-dismissible alert-danger">\n' '<strong>Oh snap!</strong> Channel dr3wa_ does not exist on Twitch! Check ' 'out \n' 'this channel instead!</div>') |
follow_list | <horoscope.models.FollowList object at 0x7f4b21fdc3a0> |
name | 'dr3wa_' |
request | <WSGIRequest: GET '/horoscope/?channelname=dr3wa_'> |
runtime | 48848.813332521 |
time | <module 'time' (built-in)> |
user | <horoscope.models.Streamer object at 0x7f4b1d878310> |
user_dict | {'chineseZodiacSignName': 'PIG', 'chineseZodiacSignTraits': 'compassionate, generous and diligent', 'createdAtShort': '2007-05-22', 'display_name': 'Twitch', 'logo': 'https://static-cdn.jtvnw.net/jtv_user_pictures/9fc1514f-6ea1-4109-94a4-b71e03a8944b-profile_image-300x300.png', 'name': 'twitch', 'url': 'https://www.twitch.tv/twitch', 'zodiacSignName': 'GEMINI', 'zodiacSignTraits': 'versatile, expressive, curious and kind'} |
/app/horoscope/models.py
, line 196, in get_zodiac_dict
def get_zodiac_dict(self, user):
"""
Filters for zodiac signs
"""
zodiac_sign = user.zodiacSignName
zodiac_def = lambda x: x.channel.zodiacSignName == zodiac_sign
filtered_list = list(filter(zodiac_def, self.accountlist))…
filtered_dict = self.convert_userlist_to_dict(filtered_list)
return filtered_dict
def get_chinese_zodiac_dict(self, user):
"""
Filters for chinese Zodiac signs
Variable | Value |
---|---|
self | <horoscope.models.FollowList object at 0x7f4b21fdc3a0> |
user | <horoscope.models.Streamer object at 0x7f4b1d878310> |
zodiac_def | <function FollowList.get_zodiac_dict.<locals>.<lambda> at 0x7f4b1c747940> |
zodiac_sign | 'GEMINI' |
/app/horoscope/models.py
, line 176, in accountlist
def __init__(self, user):
super().__init__()
self.user = user
@property
def accountlist(self):
follows = get_follows_by_userid_cached(userid=self.user.raw["id"])…
return list(map(Follow, follows))
@staticmethod
def convert_userlist_to_dict(liste):
"""converts Streamers in a list to a dict"""
liste = copy.deepcopy(liste)
Variable | Value |
---|---|
self | <horoscope.models.FollowList object at 0x7f4b21fdc3a0> |
/app/horoscope/scripts/twitchapi.py
, line 203, in get_follows_by_userid_cached
return userid
@functools.lru_cache(maxsize=999, typed=True)
def get_follows_by_userid_cached(userid):
"""returns the id of the named called channelname"""
api = TwitchAPI()
userid = api.get_follows_by_userid(userid)…
return userid
@functools.lru_cache(maxsize=999, typed=True)
def get_data_by_channelnames_cached(channelnames):
"""returns the id of the named called channelname"""
Variable | Value |
---|---|
api | <horoscope.scripts.twitchapi.TwitchAPI object at 0x7f4b1cc6e640> |
userid | '12826' |
/app/horoscope/scripts/twitchapi.py
, line 171, in get_follows_by_userid
'profile_image_url': 'https://static-cdn.jtvnw.net/jtv_user_pictures/5dbb23d1-8aa0-474b-ac66-9968e2a3686d-profile_image-300x300.png',
'offline_image_url': '',
'view_count': 10546,
'created_at': '2010-12-12T13:00:56Z'
}
}
"""
output = self.twitch.get_users_follows(from_id=userid)["data"]…
names = []
for single_follow in output:
names.append(single_follow["to_login"])
info = self.get_data_by_channelnames(names)
infonames = []
for single_info in info:
Variable | Value |
---|---|
self | <horoscope.scripts.twitchapi.TwitchAPI object at 0x7f4b1cc6e640> |
userid | '12826' |
AnonymousUser
Variable | Value |
---|---|
channelname | 'dr3wa_' |
No POST data
No FILES data
No cookie data
Variable | Value |
---|---|
HTTP_ACCEPT | '*/*' |
HTTP_HOST | 'batchest.com' |
HTTP_REFERER | 'https://batchest.com/horoscope?channelname=dr3wa_' |
HTTP_USER_AGENT | 'claudebot' |
HTTP_X_FORWARDED_FOR | '18.212.242.203' |
HTTP_X_FORWARDED_HOST | 'batchest.com' |
HTTP_X_FORWARDED_PORT | '443' |
HTTP_X_FORWARDED_PROTO | 'https' |
HTTP_X_FORWARDED_SCHEME | 'https' |
HTTP_X_REAL_IP | '18.212.242.203' |
HTTP_X_REQUEST_ID | 'bec6f38c19ac4db8ee59c3db0f0b59f8' |
HTTP_X_SCHEME | 'https' |
PATH_INFO | '/horoscope/' |
QUERY_STRING | 'channelname=dr3wa_' |
RAW_URI | '/horoscope/?channelname=dr3wa_' |
REMOTE_ADDR | '10.244.4.7' |
REMOTE_PORT | '57686' |
REQUEST_METHOD | 'GET' |
SCRIPT_NAME | '' |
SERVER_NAME | '0.0.0.0' |
SERVER_PORT | '8000' |
SERVER_PROTOCOL | 'HTTP/1.1' |
SERVER_SOFTWARE | 'gunicorn/20.1.0' |
gunicorn.socket | <gevent._socket3.socket at 0x7f4b1d40bd60 object, fd=11, family=2, type=1, proto=6> |
wsgi.errors | <gunicorn.http.wsgi.WSGIErrorsWrapper object at 0x7f4b1da53a90> |
wsgi.file_wrapper | <class 'gunicorn.http.wsgi.FileWrapper'> |
wsgi.input | <gunicorn.http.body.Body object at 0x7f4b1cc6e280> |
wsgi.input_terminated | True |
wsgi.multiprocess | True |
wsgi.multithread | True |
wsgi.run_once | False |
wsgi.url_scheme | 'http' |
wsgi.version | (1, 0) |
batchest.settings
Setting | Value |
---|---|
ABSOLUTE_URL_OVERRIDES | {} |
ADMINS | [] |
ALLOWED_HOSTS | ['localhost', '127.0.0.1', 'batchest.com', 'www.batchest.com', 'wordle.batchest.com'] |
APPEND_SLASH | True |
AUTHENTICATION_BACKENDS | ['django.contrib.auth.backends.ModelBackend'] |
AUTH_PASSWORD_VALIDATORS | '********************' |
AUTH_USER_MODEL | 'auth.User' |
BASE_DIR | PosixPath('/app') |
CACHES | {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}} |
CACHE_MIDDLEWARE_ALIAS | 'default' |
CACHE_MIDDLEWARE_KEY_PREFIX | '********************' |
CACHE_MIDDLEWARE_SECONDS | 600 |
CSRF_COOKIE_AGE | 31449600 |
CSRF_COOKIE_DOMAIN | None |
CSRF_COOKIE_HTTPONLY | False |
CSRF_COOKIE_NAME | 'csrftoken' |
CSRF_COOKIE_PATH | '/' |
CSRF_COOKIE_SAMESITE | 'Lax' |
CSRF_COOKIE_SECURE | False |
CSRF_FAILURE_VIEW | 'django.views.csrf.csrf_failure' |
CSRF_HEADER_NAME | 'HTTP_X_CSRFTOKEN' |
CSRF_TRUSTED_ORIGINS | [] |
CSRF_USE_SESSIONS | False |
DATABASES | {'default': {'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.mysql', 'HOST': 'mysqlservice', 'NAME': 'batchest', 'OPTIONS': {'charset': 'utf8mb4'}, 'PASSWORD': '********************', 'PORT': '3306', 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}, 'TIME_ZONE': None, 'USER': 'root'}} |
DATABASE_ROUTERS | [] |
DATA_UPLOAD_MAX_MEMORY_SIZE | 2621440 |
DATA_UPLOAD_MAX_NUMBER_FIELDS | 1000 |
DATETIME_FORMAT | 'N j, Y, P' |
DATETIME_INPUT_FORMATS | ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M'] |
DATE_FORMAT | 'N j, Y' |
DATE_INPUT_FORMATS | ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y'] |
DEBUG | True |
DEBUG_PROPAGATE_EXCEPTIONS | False |
DECIMAL_SEPARATOR | '.' |
DEFAULT_AUTO_FIELD | 'django.db.models.AutoField' |
DEFAULT_CHARSET | 'utf-8' |
DEFAULT_EXCEPTION_REPORTER | 'django.views.debug.ExceptionReporter' |
DEFAULT_EXCEPTION_REPORTER_FILTER | 'django.views.debug.SafeExceptionReporterFilter' |
DEFAULT_FILE_STORAGE | 'django.core.files.storage.FileSystemStorage' |
DEFAULT_FROM_EMAIL | 'webmaster@localhost' |
DEFAULT_HASHING_ALGORITHM | 'sha256' |
DEFAULT_INDEX_TABLESPACE | '' |
DEFAULT_TABLESPACE | '' |
DISALLOWED_USER_AGENTS | [] |
DJANGO_DB_HOST | 'mysqlservice' |
DJANGO_DB_PASSWORD | '********************' |
DJANGO_DB_USER | 'root' |
EMAIL_BACKEND | 'django.core.mail.backends.smtp.EmailBackend' |
EMAIL_HOST | 'localhost' |
EMAIL_HOST_PASSWORD | '********************' |
EMAIL_HOST_USER | '' |
EMAIL_PORT | 25 |
EMAIL_SSL_CERTFILE | None |
EMAIL_SSL_KEYFILE | '********************' |
EMAIL_SUBJECT_PREFIX | '[Django] ' |
EMAIL_TIMEOUT | None |
EMAIL_USE_LOCALTIME | False |
EMAIL_USE_SSL | False |
EMAIL_USE_TLS | False |
FILE_UPLOAD_DIRECTORY_PERMISSIONS | None |
FILE_UPLOAD_HANDLERS | ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler'] |
FILE_UPLOAD_MAX_MEMORY_SIZE | 2621440 |
FILE_UPLOAD_PERMISSIONS | 420 |
FILE_UPLOAD_TEMP_DIR | None |
FIRST_DAY_OF_WEEK | 0 |
FIXTURE_DIRS | [] |
FORCE_SCRIPT_NAME | None |
FORMAT_MODULE_PATH | None |
FORM_RENDERER | 'django.forms.renderers.DjangoTemplates' |
IGNORABLE_404_URLS | [] |
INSTALLED_APPS | ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'batchest', 'clipguesser', 'niaas', 'livenotification', 'yoink', 'horoscope', 'chatscan', 'emotechecker', 'twitchwar', 'tugochat', 'twitchconattendees', 'emotedata', 'bouncing', 'ytphrasefinder'] |
INTERNAL_IPS | [] |
LANGUAGES | [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ar-dz', 'Algerian Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('hy', 'Armenian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('ig', 'Igbo'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('ky', 'Kyrgyz'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('tg', 'Tajik'), ('th', 'Thai'), ('tk', 'Turkmen'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('uz', 'Uzbek'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')] |
LANGUAGES_BIDI | ['he', 'ar', 'ar-dz', 'fa', 'ur'] |
LANGUAGE_CODE | 'en-us' |
LANGUAGE_COOKIE_AGE | None |
LANGUAGE_COOKIE_DOMAIN | None |
LANGUAGE_COOKIE_HTTPONLY | False |
LANGUAGE_COOKIE_NAME | 'django_language' |
LANGUAGE_COOKIE_PATH | '/' |
LANGUAGE_COOKIE_SAMESITE | None |
LANGUAGE_COOKIE_SECURE | False |
LOCALE_PATHS | [] |
LOGGING | {} |
LOGGING_CONFIG | 'logging.config.dictConfig' |
LOGIN_REDIRECT_URL | '/accounts/profile/' |
LOGIN_URL | '/accounts/login/' |
LOGOUT_REDIRECT_URL | None |
MANAGERS | [] |
MEDIA_ROOT | '' |
MEDIA_URL | '/' |
MESSAGE_STORAGE | 'django.contrib.messages.storage.fallback.FallbackStorage' |
MIDDLEWARE | ['whitenoise.middleware.WhiteNoiseMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware'] |
MIGRATION_MODULES | {} |
MONTH_DAY_FORMAT | 'F j' |
NUMBER_GROUPING | 0 |
PASSWORD_HASHERS | '********************' |
PASSWORD_RESET_TIMEOUT | '********************' |
PASSWORD_RESET_TIMEOUT_DAYS | '********************' |
PREPEND_WWW | False |
ROOT_URLCONF | 'batchest.urls' |
SECRET_KEY | '********************' |
SECURE_BROWSER_XSS_FILTER | False |
SECURE_CONTENT_TYPE_NOSNIFF | True |
SECURE_HSTS_INCLUDE_SUBDOMAINS | False |
SECURE_HSTS_PRELOAD | False |
SECURE_HSTS_SECONDS | 0 |
SECURE_PROXY_SSL_HEADER | None |
SECURE_REDIRECT_EXEMPT | [] |
SECURE_REFERRER_POLICY | 'same-origin' |
SECURE_SSL_HOST | None |
SECURE_SSL_REDIRECT | False |
SERVER_EMAIL | 'root@localhost' |
SESSION_CACHE_ALIAS | 'default' |
SESSION_COOKIE_AGE | 1209600 |
SESSION_COOKIE_DOMAIN | None |
SESSION_COOKIE_HTTPONLY | True |
SESSION_COOKIE_NAME | 'sessionid' |
SESSION_COOKIE_PATH | '/' |
SESSION_COOKIE_SAMESITE | 'Lax' |
SESSION_COOKIE_SECURE | False |
SESSION_ENGINE | 'django.contrib.sessions.backends.db' |
SESSION_EXPIRE_AT_BROWSER_CLOSE | False |
SESSION_FILE_PATH | None |
SESSION_SAVE_EVERY_REQUEST | False |
SESSION_SERIALIZER | 'django.contrib.sessions.serializers.JSONSerializer' |
SETTINGS_MODULE | 'batchest.settings' |
SHORT_DATETIME_FORMAT | 'm/d/Y P' |
SHORT_DATE_FORMAT | 'm/d/Y' |
SIGNING_BACKEND | 'django.core.signing.TimestampSigner' |
SILENCED_SYSTEM_CHECKS | [] |
STATICFILES_DIRS | ('/app/batchest/static',) |
STATICFILES_FINDERS | ['django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder'] |
STATICFILES_STORAGE | 'django.contrib.staticfiles.storage.StaticFilesStorage' |
STATIC_ROOT | '/app/static' |
STATIC_URL | '/static/' |
TEMPLATES | [{'APP_DIRS': True, 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['/app/templates'], 'OPTIONS': {'context_processors': ['django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'batchest.context_processors.uptime']}}] |
TEST_NON_SERIALIZED_APPS | [] |
TEST_RUNNER | 'django.test.runner.DiscoverRunner' |
THOUSAND_SEPARATOR | ',' |
TIME_FORMAT | 'P' |
TIME_INPUT_FORMATS | ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] |
TIME_ZONE | 'UTC' |
USE_I18N | True |
USE_L10N | True |
USE_THOUSAND_SEPARATOR | False |
USE_TZ | True |
USE_X_FORWARDED_HOST | False |
USE_X_FORWARDED_PORT | False |
WSGI_APPLICATION | 'batchest.wsgi.application' |
X_FRAME_OPTIONS | 'ALLOW-FROM wordle.batchest.com' |
YEAR_MONTH_FORMAT | 'F Y' |
You’re seeing this error because you have DEBUG = True
in your
Django settings file. Change that to False
, and Django will
display a standard page generated by the handler for this status code.