No exception message supplied
Request Method: | GET |
---|---|
Request URL: | https://sumnerhayes.com/dojo/meetup/?group_name=Data-Visualization-DC |
Django Version: | 1.9.9 |
Exception Type: | HttpUnauthorized |
Exception Location: | /usr/local/lib/python2.7/dist-packages/meetup/api.py in _call, line 162 |
Python Executable: | /usr/local/bin/uwsgi |
Python Version: | 2.7.12 |
Python Path: | ['.', '', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat'] |
Server time: | Fri, 29 Mar 2024 10:18:30 +0000 |
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py
in get_response
break
if response is None:
wrapped_callback = self.make_view_atomic(callback)
try:
response = wrapped_callback(request, *callback_args, **callback_kwargs)
except Exception as e:
response = self.process_exception_by_middleware(e, request)...
# Complain if the view returned None (a common error).
if response is None:
if isinstance(callback, types.FunctionType): # FBV
view_name = callback.__name__
else: # CBV
Variable | Value |
---|---|
e | HttpUnauthorized() |
callback_args | () |
resolver_match | ResolverMatch(func=dojo.views.meetup, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[]) |
response_is_rendered | False |
middleware_method | <bound method CsrfViewMiddleware.process_view of <django.middleware.csrf.CsrfViewMiddleware object at 0x7f62c75be990>> |
self | <django.core.handlers.wsgi.WSGIHandler object at 0x7f62c75c2f50> |
request | <WSGIRequest: GET '/dojo/meetup/?group_name=Data-Visualization-DC'> |
callback | <function meetup at 0x7f62ced1e668> |
wrapped_callback | <function meetup at 0x7f62ced1e668> |
resolver | <RegexURLResolver u'sumnerhayes.urls' (None:None) ^/> |
callback_kwargs | {} |
response | None |
urlconf | u'sumnerhayes.urls' |
/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py
in get_response
response = middleware_method(request, callback, callback_args, callback_kwargs)
if response:
break
if response is None:
wrapped_callback = self.make_view_atomic(callback)
try:
response = wrapped_callback(request, *callback_args, **callback_kwargs)...
except Exception as e:
response = self.process_exception_by_middleware(e, request)
# Complain if the view returned None (a common error).
if response is None:
if isinstance(callback, types.FunctionType): # FBV
Variable | Value |
---|---|
e | HttpUnauthorized() |
callback_args | () |
resolver_match | ResolverMatch(func=dojo.views.meetup, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[]) |
response_is_rendered | False |
middleware_method | <bound method CsrfViewMiddleware.process_view of <django.middleware.csrf.CsrfViewMiddleware object at 0x7f62c75be990>> |
self | <django.core.handlers.wsgi.WSGIHandler object at 0x7f62c75c2f50> |
request | <WSGIRequest: GET '/dojo/meetup/?group_name=Data-Visualization-DC'> |
callback | <function meetup at 0x7f62ced1e668> |
wrapped_callback | <function meetup at 0x7f62ced1e668> |
resolver | <RegexURLResolver u'sumnerhayes.urls' (None:None) ^/> |
callback_kwargs | {} |
response | None |
urlconf | u'sumnerhayes.urls' |
./dojo/views.py
in meetup
class NameForm(forms.Form):
group_name = forms.CharField(label='Meetup Group:', max_length=100)
# Main Django entry point for the search results (graph) page
# https://sumnerhayes.com/dojo/meetup/?group_name=Data
# This would go in your urls.py in Django setup
def meetup(request):
stuff = graph_pizza_by_group(request.GET['group_name'])...
group = 'Data-Visualization-DC'
datelist, labellist, rsvplist, attendlist, estimatelist, pizzacount = graph_pizza_by_group(group)
return pizza_tracker(request, datelist, rsvplist, attendlist, estimatelist, pizzacount)
# Main Django entry point for the search page
# https://sumnerhayes.com/dojo/meetupsearch ; this would go in urls.py too
Variable | Value |
---|---|
request | <WSGIRequest: GET '/dojo/meetup/?group_name=Data-Visualization-DC'> |
./dojo/views.py
in graph_pizza_by_group
if estimate<.3: return .3
else: return estimate
# Fetch the Meetup data from the API, including historical data
# Get all the data massaged in a format for bokeh graphing to use
def graph_pizza_by_group(groupurl):
client = meetupapi.Client(apikey)
group_info = client.GetGroup({'urlname': groupurl})...
events = client.GetEvents({'group_id': group_info.id, 'status':'past,upcoming'})
# Meetup doesn't use Unix timestamps, it uses milliseconds since the epoch
# So we have to divide by 1000 before parsing them.
for e in events.results:
e["date"] = datetime.fromtimestamp(e["time"]/1000)
Variable | Value |
---|---|
client | <meetup.api.Client object at 0x7f62c7396090> |
groupurl | u'Data-Visualization-DC' |
/usr/local/lib/python2.7/dist-packages/meetup/api.py
in _call
self.rate_limit.remaining = response.headers.get('X-RateLimit-Remaining')
self.rate_limit.reset = response.headers.get('X-RateLimit-Reset')
print('{0}/{1} ({2} seconds remaining)'.format(self.rate_limit.remaining,
self.rate_limit.limit,
self.rate_limit.reset))
if response.status_code == 401:
raise exceptions.HttpUnauthorized...
if response.status_code == 404:
raise exceptions.HttpNotFoundError
# If we have two or less remaining calls in the period, wait (if the wait flag is set).
# I tried only waiting after a 429 error, and ended getting locked out doing parallel testing.
if int(self.rate_limit.remaining) <= 5 and self.overlimit_wait:
Variable | Value |
---|---|
param_name | u'urlname' |
parameters | {'key': '6f244015247378191a2126a53e7771', 'urlname': u'Data-Visualization-DC'} |
service_name | u'GetGroup' |
k | u'desc' |
v | {u'description': None, u'location': u'query', u'required': False} |
response | <Response [401]> |
param_dict | {u'desc': {u'description': None, u'location': u'query', u'required': False}, u'fields': {u'description': u'A comma-delimited list of optional fields to append to the response', u'location': u'query', u'required': False}, u'offset': {u'description': None, u'location': u'query', u'required': False}, u'omit': {u'description': None, u'location': u'query', u'required': False}, u'only': {u'description': None, u'location': u'query', u'required': False}, u'order': {u'description': None, u'location': u'query', u'required': False}, u'page': {u'description': None, u'location': u'query', u'required': False}, u'urlname': {u'description': None, u'location': u'uri', u'required': True}} |
kwargs | {} |
request_http_method | u'GET' |
request_url | 'http://api.meetup.com//Data-Visualization-DC' |
required_params | [u'urlname'] |
self | <meetup.api.Client object at 0x7f62c7396090> |
request_uri | u'/Data-Visualization-DC' |
Variable | Value |
---|---|
group_name | u'Data-Visualization-DC' |
No POST data
No FILES data
No cookie data
Variable | Value |
---|---|
wsgi.multiprocess | False |
SCRIPT_NAME | u'' |
REQUEST_METHOD | 'GET' |
PATH_INFO | u'/dojo/meetup/' |
SERVER_PROTOCOL | 'HTTP/2.0' |
QUERY_STRING | 'group_name=Data-Visualization-DC' |
x-wsgiorg.fdevent.readable | '' |
CONTENT_LENGTH | '' |
HTTP_USER_AGENT | 'claudebot' |
SERVER_NAME | 'sumnerhayes.com' |
REMOTE_ADDR | '54.166.96.191' |
wsgi.url_scheme | 'https' |
SERVER_PORT | '443' |
uwsgi.node | 'sumner' |
DOCUMENT_ROOT | '/usr/share/nginx/html' |
uwsgi.core | 99 |
x-wsgiorg.fdevent.timeout | None |
wsgi.input | <uwsgi._Input object at 0x7f62c51430f0> |
HTTP_HOST | 'sumnerhayes.com' |
HTTPS | 'on' |
wsgi.multithread | False |
REQUEST_URI | '/dojo/meetup/?group_name=Data-Visualization-DC' |
HTTP_ACCEPT | '*/*' |
wsgi.version | (1, 0) |
x-wsgiorg.fdevent.writable | '' |
wsgi.run_once | False |
wsgi.errors | <open file 'wsgi_errors', mode 'w' at 0x7f62ec760ae0> |
REMOTE_PORT | '42702' |
REQUEST_SCHEME | 'https' |
uwsgi.version | '2.1-dev-9896a9e' |
CONTENT_TYPE | '' |
wsgi.file_wrapper | '' |
sumnerhayes.settings.dev
Setting | Value |
---|---|
SECURE_BROWSER_XSS_FILTER | False |
USE_X_FORWARDED_PORT | False |
USE_THOUSAND_SEPARATOR | False |
CSRF_COOKIE_SECURE | False |
LANGUAGE_CODE | u'en-us' |
ROOT_URLCONF | u'sumnerhayes.urls' |
MANAGERS | [] |
WAGTAIL_SITE_NAME | u'SumnerHayes.com' |
BASE_DIR | '/home/sumner/www/sumnerhayes' |
SILENCED_SYSTEM_CHECKS | [] |
DEFAULT_CHARSET | 'utf-8' |
SESSION_SERIALIZER | 'django.contrib.sessions.serializers.JSONSerializer' |
STATIC_ROOT | u'/home/sumner/www/sumnerhayes/static' |
ALLOWED_HOSTS | [] |
MESSAGE_STORAGE | 'django.contrib.messages.storage.fallback.FallbackStorage' |
EMAIL_SUBJECT_PREFIX | '[Django] ' |
SERVER_EMAIL | 'root@localhost' |
SECURE_HSTS_SECONDS | 0 |
STATICFILES_FINDERS | [u'django.contrib.staticfiles.finders.FileSystemFinder', u'django.contrib.staticfiles.finders.AppDirectoriesFinder'] |
SESSION_CACHE_ALIAS | 'default' |
SESSION_COOKIE_DOMAIN | None |
SESSION_COOKIE_NAME | 'sessionid' |
WAGTAILSEARCH_BACKENDS | {u'default': {u'BACKEND': u'wagtail.wagtailsearch.backends.elasticsearch.ElasticSearch', u'INDEX': u'{{ project_name }}'}} |
TIME_INPUT_FORMATS | ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] |
SECURE_REDIRECT_EXEMPT | [] |
DATABASES | {u'default': {'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, u'ENGINE': u'django.db.backends.postgresql', u'HOST': u'localhost', u'NAME': u'sumner', 'OPTIONS': {}, u'PASSWORD': u'********************', 'PORT': '', 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIRROR': None, 'NAME': None}, 'TIME_ZONE': None, u'USER': u'www'}} |
EMAIL_SSL_KEYFILE | u'********************' |
FILE_UPLOAD_DIRECTORY_PERMISSIONS | None |
FILE_UPLOAD_PERMISSIONS | None |
FILE_UPLOAD_HANDLERS | ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler'] |
DEFAULT_CONTENT_TYPE | 'text/html' |
APPEND_SLASH | True |
LOCALE_PATHS | [] |
DATABASE_ROUTERS | [] |
DEFAULT_TABLESPACE | '' |
YEAR_MONTH_FORMAT | 'F Y' |
STATICFILES_STORAGE | 'django.contrib.staticfiles.storage.StaticFilesStorage' |
CACHES | {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}} |
SESSION_COOKIE_PATH | '/' |
EMAIL_HOST_PASSWORD | u'********************' |
SECURE_CONTENT_TYPE_NOSNIFF | False |
MIDDLEWARE_CLASSES | [u'django.contrib.sessions.middleware.SessionMiddleware', u'django.middleware.common.CommonMiddleware', u'django.middleware.csrf.CsrfViewMiddleware', u'django.contrib.auth.middleware.AuthenticationMiddleware', u'django.contrib.auth.middleware.SessionAuthenticationMiddleware', u'django.contrib.messages.middleware.MessageMiddleware', u'django.middleware.clickjacking.XFrameOptionsMiddleware', u'django.middleware.security.SecurityMiddleware', u'wagtail.wagtailcore.middleware.SiteMiddleware', u'wagtail.wagtailredirects.middleware.RedirectMiddleware'] |
USE_I18N | True |
THOUSAND_SEPARATOR | ',' |
SECRET_KEY | u'********************' |
LANGUAGE_COOKIE_NAME | 'django_language' |
DEFAULT_INDEX_TABLESPACE | '' |
LOGGING_CONFIG | 'logging.config.dictConfig' |
TEMPLATE_LOADERS | ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader'] |
FIRST_DAY_OF_WEEK | 0 |
WSGI_APPLICATION | u'sumnerhayes.wsgi.application' |
TEMPLATE_DEBUG | False |
X_FRAME_OPTIONS | 'SAMEORIGIN' |
CSRF_COOKIE_NAME | 'csrftoken' |
FORCE_SCRIPT_NAME | None |
USE_X_FORWARDED_HOST | False |
CSRF_HEADER_NAME | 'HTTP_X_CSRFTOKEN' |
EMAIL_TIMEOUT | None |
SECURE_SSL_HOST | None |
SIGNING_BACKEND | 'django.core.signing.TimestampSigner' |
SESSION_COOKIE_SECURE | False |
BASE_URL | u'http://sumnerhayes.com' |
CSRF_COOKIE_DOMAIN | None |
FILE_CHARSET | 'utf-8' |
DEBUG | True |
CSRF_TRUSTED_ORIGINS | [] |
LANGUAGE_COOKIE_DOMAIN | None |
DEFAULT_FILE_STORAGE | 'django.core.files.storage.FileSystemStorage' |
INSTALLED_APPS | [u'home', u'search', u'recipes', u'blog', u'dojo', u'library', u'dnd', u'graph', u'f7site', u'jsonapi', u'django_gevent_deploy', u'wagtail.wagtailforms', u'wagtail.wagtailredirects', u'wagtail.wagtailembeds', u'wagtail.wagtailsites', u'wagtail.wagtailusers', u'wagtail.wagtailsnippets', u'wagtail.wagtaildocs', u'wagtail.wagtailimages', u'wagtail.wagtailsearch', u'wagtail.wagtailadmin', u'wagtail.wagtailcore', u'modelcluster', u'taggit', u'django.contrib.admin', u'django.contrib.auth', u'django.contrib.contenttypes', u'django.contrib.sessions', u'django.contrib.messages', u'django.contrib.staticfiles'] |
LANGUAGES | [('af', 'Afrikaans'), ('ar', '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'), ('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'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmal'), ('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'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')] |
USE_L10N | True |
SECURE_HSTS_INCLUDE_SUBDOMAINS | False |
STATICFILES_DIRS | [u'/home/sumner/www/sumnerhayes/sumnerhayes/static'] |
PREPEND_WWW | False |
SECURE_PROXY_SSL_HEADER | None |
LANGUAGE_COOKIE_AGE | None |
SESSION_COOKIE_HTTPONLY | True |
DEBUG_PROPAGATE_EXCEPTIONS | False |
CSRF_COOKIE_AGE | 31449600 |
MONTH_DAY_FORMAT | 'F j' |
LOGIN_URL | '/accounts/login/' |
SESSION_EXPIRE_AT_BROWSER_CLOSE | False |
TIME_FORMAT | 'P' |
AUTH_USER_MODEL | 'auth.User' |
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'] |
AUTHENTICATION_BACKENDS | ['django.contrib.auth.backends.ModelBackend'] |
AUTH_PASSWORD_VALIDATORS | u'********************' |
PASSWORD_RESET_TIMEOUT_DAYS | u'********************' |
SESSION_FILE_PATH | None |
CACHE_MIDDLEWARE_ALIAS | 'default' |
SESSION_SAVE_EVERY_REQUEST | False |
ADMIN_MEDIA_PREFIX | u'/media/' |
NUMBER_GROUPING | 0 |
SESSION_ENGINE | 'django.contrib.sessions.backends.db' |
CSRF_FAILURE_VIEW | 'django.views.csrf.csrf_failure' |
CSRF_COOKIE_PATH | '/' |
LOGIN_REDIRECT_URL | '/accounts/profile/' |
DECIMAL_SEPARATOR | '.' |
IGNORABLE_404_URLS | [] |
MIGRATION_MODULES | {} |
WAGTAILIMAGES_FEATURE_DETECTION_ENABLED | True |
TEMPLATE_STRING_IF_INVALID | '' |
LOGOUT_URL | '/accounts/logout/' |
EMAIL_USE_TLS | False |
FIXTURE_DIRS | [] |
EMAIL_HOST | 'localhost' |
DATE_FORMAT | 'N j, Y' |
MEDIA_ROOT | u'/home/sumner/www/static/' |
DEFAULT_EXCEPTION_REPORTER_FILTER | 'django.views.debug.SafeExceptionReporterFilter' |
ADMINS | [] |
FORMAT_MODULE_PATH | None |
DEFAULT_FROM_EMAIL | 'webmaster@localhost' |
MEDIA_URL | u'/static/media/' |
DATETIME_FORMAT | 'N j, Y, P' |
TEMPLATE_DIRS | [] |
DISALLOWED_USER_AGENTS | [] |
ALLOWED_INCLUDE_ROOTS | [] |
LOGGING | {} |
PROJECT_DIR | '/home/sumner/www/sumnerhayes/sumnerhayes' |
TEMPLATES | [{u'APP_DIRS': True, u'BACKEND': u'django.template.backends.django.DjangoTemplates', u'DIRS': [u'/home/sumner/www/sumnerhayes/sumnerhayes/templates'], u'OPTIONS': {u'context_processors': [u'django.template.context_processors.debug', u'django.template.context_processors.request', u'django.contrib.auth.context_processors.auth', u'django.contrib.messages.context_processors.messages']}}] |
TEST_RUNNER | 'django.test.runner.DiscoverRunner' |
SHORT_DATE_FORMAT | 'm/d/Y' |
CACHE_MIDDLEWARE_KEY_PREFIX | u'********************' |
SECURE_SSL_REDIRECT | False |
TIME_ZONE | u'UTC' |
FILE_UPLOAD_MAX_MEMORY_SIZE | 2621440 |
EMAIL_BACKEND | u'django.core.mail.backends.console.EmailBackend' |
EMAIL_USE_SSL | False |
TEMPLATE_CONTEXT_PROCESSORS | ['django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.media', 'django.template.context_processors.static', 'django.template.context_processors.tz', 'django.contrib.messages.context_processors.messages'] |
SESSION_COOKIE_AGE | 1209600 |
SETTINGS_MODULE | u'sumnerhayes.settings.dev' |
USE_ETAGS | False |
LANGUAGES_BIDI | ['he', 'ar', 'fa', 'ur'] |
FILE_UPLOAD_TEMP_DIR | None |
INTERNAL_IPS | [] |
STATIC_URL | u'/static/' |
EMAIL_PORT | 25 |
USE_TZ | True |
SHORT_DATETIME_FORMAT | 'm/d/Y P' |
TEST_NON_SERIALIZED_APPS | [] |
PASSWORD_HASHERS | u'********************' |
ABSOLUTE_URL_OVERRIDES | {} |
LANGUAGE_COOKIE_PATH | '/' |
CACHE_MIDDLEWARE_SECONDS | 600 |
EMAIL_SSL_CERTFILE | None |
CSRF_COOKIE_HTTPONLY | False |
DATETIME_INPUT_FORMATS | ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%Y', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M', '%m/%d/%y'] |
EMAIL_HOST_USER | '' |
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.