linuxsoftware / ls.joyous

A calendar application for Wagtail
BSD 3-Clause "New" or "Revised" License
74 stars 35 forks source link

'WSGIRequest' object has no attribute 'site' #36

Closed pierregm closed 4 years ago

pierregm commented 4 years ago

Hello,

I'm running into a 'WSGIRequest' object has no attribute 'site' error when trying to access a CalendarPage on my app (python 3.7.6, django 3.1, wagtail 2.10.1, wagtail_modeltranslation 0.10.14).

I was able to reproduce it with the orange-wagtail-site. After installing wagtail_modeltranslation, I create a new CalendarDemo. On preview/live view, I get the error. If I create a FullCalendar instead, I don't get the error.

Environment:

Request Method: GET
Request URL: http://localhost/calendardemo/

Django Version: 3.1
Python Version: 3.7.6
Wagtail Version: 2.10.1
WagtailModelTranslation Version: 0.10.14
Installed Applications:
['wagtail_modeltranslation',
 'wagtail_modeltranslation.makemigrations',
 'wagtail_modeltranslation.migrate',
 'home',
 'events',
 'website',
 'dashboard',
 'ls.joyous',
 'ls.joyful',
 'wagtail.contrib.modeladmin',
 'wagtail.contrib.forms',
 'wagtail.contrib.redirects',
 'wagtail.embeds',
 'wagtail.sites',
 'wagtail.users',
 'wagtail.snippets',
 'wagtail.documents',
 'wagtail.images',
 'wagtail.search',
 'wagtail.admin',
 'wagtail.core',
 'modelcluster',
 'taggit',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'wagtail.contrib.redirects.middleware.RedirectMiddleware',
 'ls.joyous.middleware.UserTimeZoneMiddleware']

Traceback (most recent call last):
  File "/Users/pierregm/Work/workspace/sandbox/wagtail/orange-wagtail-site/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/pierregm/Work/workspace/sandbox/wagtail/orange-wagtail-site/.venv/lib/python3.7/site-packages/wagtail/core/models.py", line 1590, in _get_response
    response = page.serve_preview(request, preview_mode)
  File "/Users/pierregm/Work/workspace/sandbox/wagtail/orange-wagtail-site/.venv/lib/python3.7/site-packages/wagtail/contrib/routable_page/models.py", line 126, in serve_preview
    return view(request, *args, **kwargs)
  File "/Users/pierregm/Work/workspace/sandbox/wagtail/orange-wagtail-site/.venv/lib/python3.7/site-packages/ls/joyous/models/calendar.py", line 156, in routeDefault
    return self.serveMonth(request, year)
  File "/Users/pierregm/Work/workspace/sandbox/wagtail/orange-wagtail-site/.venv/lib/python3.7/site-packages/ls/joyous/models/calendar.py", line 215, in serveMonth
    'events':       self._getEventsByWeek(request, year, month)})
  File "/Users/pierregm/Work/workspace/sandbox/wagtail/orange-wagtail-site/.venv/lib/python3.7/site-packages/ls/joyous/models/calendar.py", line 457, in _getEventsByWeek
    home = request.site.root_page

Exception Type: AttributeError at /calendardemo/
Exception Value: 'WSGIRequest' object has no attribute 'site'
linuxsoftware commented 4 years ago

Joyous 1.3.1 still requires wagtail.core.middleware.SiteMiddleware to be installed. This middleware is deprecated by Wagtail 2.10, but will continue to be available until Wagtail 2.11. The reason Joyous still requires it is I want to continue to support Wagtail 2.7 until the next Wagtail Long Term Support release (which should be 2.11) at which time I will migrate Joyous to using Site.find_for_request.

So the fix is to add wagtail.core.middleware.SiteMiddleware to your MIDDLEWARE settings. Wagtail 2.10 will give a warning that it is deprecated, but that can be ignored for now.

https://docs.wagtail.io/en/v2.7/advanced_topics/settings.html#middleware-settings-py

linuxsoftware commented 3 years ago

Just to note Joyous 1.4.0 does not require wagtail.core.middleware.SiteMiddleware. Which also means it will not work with Wagtail 2.7.