We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
About page requires login
**Describe the bug**
Accessing the "About this server" link (https://bookwyrm.social/about) redirects to login

**To Reproduce**
Steps to reproduce the behavior:
1. Go to https://bookwyrm.social/about
2. redirected to login instead of seeing an about page (the URL is login/?next=/about)

**Expected behavior**
Access to information about this site / server

**Desktop (please complete the following information):**
 - OS: linux
 - Browser firefox
 - Version 85 (developer edition)


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `bookwyrm/views/landing.py`
Content:
```
1 ''' non-interactive pages '''
2 from django.contrib.auth.decorators import login_required
3 from django.core.paginator import Paginator
4 from django.db.models import Avg, Max
5 from django.template.response import TemplateResponse
6 from django.utils import timezone
7 from django.utils.decorators import method_decorator
8 from django.views import View
9 
10 from bookwyrm import forms, models
11 from bookwyrm.settings import PAGE_LENGTH
12 from .helpers import get_activity_feed
13 
14 
15 # pylint: disable= no-self-use
16 @method_decorator(login_required, name='dispatch')
17 class About(View):
18     ''' create invites '''
19     def get(self, request):
20         ''' more information about the instance '''
21         data = {
22             'title': 'About',
23         }
24         return TemplateResponse(request, 'about.html', data)
25 
26 class Home(View):
27     ''' discover page or home feed depending on auth '''
28     def get(self, request):
29         ''' this is the same as the feed on the home tab '''
30         if request.user.is_authenticated:
31             feed_view = Feed.as_view()
32             return feed_view(request, 'home')
33         discover_view = Discover.as_view()
34         return discover_view(request)
35 
36 class Discover(View):
37     ''' preview of recently reviewed books '''
38     def get(self, request):
39         ''' tiled book activity page '''
40         books = models.Edition.objects.filter(
41             review__published_date__isnull=False,
42             review__user__local=True,
43             review__privacy__in=['public', 'unlisted'],
44         ).exclude(
45             cover__exact=''
46         ).annotate(
47             Max('review__published_date')
48         ).order_by('-review__published_date__max')[:6]
49 
50         ratings = {}
51         for book in books:
52             reviews = models.Review.objects.filter(
53                 book__in=book.parent_work.editions.all()
54             )
55             reviews = get_activity_feed(
56                 request.user, ['public', 'unlisted'], queryset=reviews)
57             ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg']
58         data = {
59             'title': 'Discover',
60             'register_form': forms.RegisterForm(),
61             'books': list(set(books)),
62             'ratings': ratings
63         }
64         return TemplateResponse(request, 'discover.html', data)
65 
66 
67 @method_decorator(login_required, name='dispatch')
68 class Feed(View):
69     ''' activity stream '''
70     def get(self, request, tab):
71         ''' user's homepage with activity feed '''
72         try:
73             page = int(request.GET.get('page', 1))
74         except ValueError:
75             page = 1
76 
77         suggested_books = get_suggested_books(request.user)
78 
79         if tab == 'home':
80             activities = get_activity_feed(
81                 request.user, ['public', 'unlisted', 'followers'],
82                 following_only=True)
83         elif tab == 'local':
84             activities = get_activity_feed(
85                 request.user, ['public', 'followers'], local_only=True)
86         else:
87             activities = get_activity_feed(
88                 request.user, ['public', 'followers'])
89         paginated = Paginator(activities, PAGE_LENGTH)
90 
91         goal = models.AnnualGoal.objects.filter(
92             user=request.user, year=timezone.now().year
93         ).first()
94         data = {
95             'title': 'Updates Feed',
96             'user': request.user,
97             'suggested_books': suggested_books,
98             'activities': paginated.page(page),
99             'tab': tab,
100             'goal': goal,
101             'goal_form': forms.GoalForm(),
102         }
103         return TemplateResponse(request, 'feed.html', data)
104 
105 
106 def get_suggested_books(user, max_books=5):
107     ''' helper to get a user's recent books '''
108     book_count = 0
109     preset_shelves = [
110         ('reading', max_books), ('read', 2), ('to-read', max_books)
111     ]
112     suggested_books = []
113     for (preset, shelf_max) in preset_shelves:
114         limit = shelf_max if shelf_max < (max_books - book_count) \
115                 else max_books - book_count
116         shelf = user.shelf_set.get(identifier=preset)
117 
118         shelf_books = shelf.shelfbook_set.order_by(
119             '-updated_date'
120         ).all()[:limit]
121         if not shelf_books:
122             continue
123         shelf_preview = {
124             'name': shelf.name,
125             'books': [s.book for s in shelf_books]
126         }
127         suggested_books.append(shelf_preview)
128         book_count += len(shelf_preview['books'])
129     return suggested_books
130
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/bookwyrm/views/landing.py b/bookwyrm/views/landing.py
--- a/bookwyrm/views/landing.py
+++ b/bookwyrm/views/landing.py
@@ -13,7 +13,6 @@
 
 
 # pylint: disable= no-self-use
-@method_decorator(login_required, name='dispatch')
 class About(View):
     ''' create invites '''
     def get(self, request):

{"golden_diff": "diff --git a/bookwyrm/views/landing.py b/bookwyrm/views/landing.py\n--- a/bookwyrm/views/landing.py\n+++ b/bookwyrm/views/landing.py\n@@ -13,7 +13,6 @@\n \n \n # pylint: disable= no-self-use\n-@method_decorator(login_required, name='dispatch')\n class About(View):\n     ''' create invites '''\n     def get(self, request):\n", "issue": "About page requires login\n**Describe the bug**\r\nAccessing the \"About this server\" link (https://bookwyrm.social/about) redirects to login\r\n\r\n**To Reproduce**\r\nSteps to reproduce the behavior:\r\n1. Go to https://bookwyrm.social/about\r\n2. redirected to login instead of seeing an about page (the URL is login/?next=/about)\r\n\r\n**Expected behavior**\r\nAccess to information about this site / server\r\n\r\n**Desktop (please complete the following information):**\r\n - OS: linux\r\n - Browser firefox\r\n - Version 85 (developer edition)\r\n\n", "before_files": [{"content": "''' non-interactive pages '''\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.paginator import Paginator\nfrom django.db.models import Avg, Max\nfrom django.template.response import TemplateResponse\nfrom django.utils import timezone\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\n\nfrom bookwyrm import forms, models\nfrom bookwyrm.settings import PAGE_LENGTH\nfrom .helpers import get_activity_feed\n\n\n# pylint: disable= no-self-use\n@method_decorator(login_required, name='dispatch')\nclass About(View):\n    ''' create invites '''\n    def get(self, request):\n        ''' more information about the instance '''\n        data = {\n            'title': 'About',\n        }\n        return TemplateResponse(request, 'about.html', data)\n\nclass Home(View):\n    ''' discover page or home feed depending on auth '''\n    def get(self, request):\n        ''' this is the same as the feed on the home tab '''\n        if request.user.is_authenticated:\n            feed_view = Feed.as_view()\n            return feed_view(request, 'home')\n        discover_view = Discover.as_view()\n        return discover_view(request)\n\nclass Discover(View):\n    ''' preview of recently reviewed books '''\n    def get(self, request):\n        ''' tiled book activity page '''\n        books = models.Edition.objects.filter(\n            review__published_date__isnull=False,\n            review__user__local=True,\n            review__privacy__in=['public', 'unlisted'],\n        ).exclude(\n            cover__exact=''\n        ).annotate(\n            Max('review__published_date')\n        ).order_by('-review__published_date__max')[:6]\n\n        ratings = {}\n        for book in books:\n            reviews = models.Review.objects.filter(\n                book__in=book.parent_work.editions.all()\n            )\n            reviews = get_activity_feed(\n                request.user, ['public', 'unlisted'], queryset=reviews)\n            ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg']\n        data = {\n            'title': 'Discover',\n            'register_form': forms.RegisterForm(),\n            'books': list(set(books)),\n            'ratings': ratings\n        }\n        return TemplateResponse(request, 'discover.html', data)\n\n\n@method_decorator(login_required, name='dispatch')\nclass Feed(View):\n    ''' activity stream '''\n    def get(self, request, tab):\n        ''' user's homepage with activity feed '''\n        try:\n            page = int(request.GET.get('page', 1))\n        except ValueError:\n            page = 1\n\n        suggested_books = get_suggested_books(request.user)\n\n        if tab == 'home':\n            activities = get_activity_feed(\n                request.user, ['public', 'unlisted', 'followers'],\n                following_only=True)\n        elif tab == 'local':\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'], local_only=True)\n        else:\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'])\n        paginated = Paginator(activities, PAGE_LENGTH)\n\n        goal = models.AnnualGoal.objects.filter(\n            user=request.user, year=timezone.now().year\n        ).first()\n        data = {\n            'title': 'Updates Feed',\n            'user': request.user,\n            'suggested_books': suggested_books,\n            'activities': paginated.page(page),\n            'tab': tab,\n            'goal': goal,\n            'goal_form': forms.GoalForm(),\n        }\n        return TemplateResponse(request, 'feed.html', data)\n\n\ndef get_suggested_books(user, max_books=5):\n    ''' helper to get a user's recent books '''\n    book_count = 0\n    preset_shelves = [\n        ('reading', max_books), ('read', 2), ('to-read', max_books)\n    ]\n    suggested_books = []\n    for (preset, shelf_max) in preset_shelves:\n        limit = shelf_max if shelf_max < (max_books - book_count) \\\n                else max_books - book_count\n        shelf = user.shelf_set.get(identifier=preset)\n\n        shelf_books = shelf.shelfbook_set.order_by(\n            '-updated_date'\n        ).all()[:limit]\n        if not shelf_books:\n            continue\n        shelf_preview = {\n            'name': shelf.name,\n            'books': [s.book for s in shelf_books]\n        }\n        suggested_books.append(shelf_preview)\n        book_count += len(shelf_preview['books'])\n    return suggested_books\n", "path": "bookwyrm/views/landing.py"}], "after_files": [{"content": "''' non-interactive pages '''\nfrom django.contrib.auth.decorators import login_required\nfrom django.core.paginator import Paginator\nfrom django.db.models import Avg, Max\nfrom django.template.response import TemplateResponse\nfrom django.utils import timezone\nfrom django.utils.decorators import method_decorator\nfrom django.views import View\n\nfrom bookwyrm import forms, models\nfrom bookwyrm.settings import PAGE_LENGTH\nfrom .helpers import get_activity_feed\n\n\n# pylint: disable= no-self-use\nclass About(View):\n    ''' create invites '''\n    def get(self, request):\n        ''' more information about the instance '''\n        data = {\n            'title': 'About',\n        }\n        return TemplateResponse(request, 'about.html', data)\n\nclass Home(View):\n    ''' discover page or home feed depending on auth '''\n    def get(self, request):\n        ''' this is the same as the feed on the home tab '''\n        if request.user.is_authenticated:\n            feed_view = Feed.as_view()\n            return feed_view(request, 'home')\n        discover_view = Discover.as_view()\n        return discover_view(request)\n\nclass Discover(View):\n    ''' preview of recently reviewed books '''\n    def get(self, request):\n        ''' tiled book activity page '''\n        books = models.Edition.objects.filter(\n            review__published_date__isnull=False,\n            review__user__local=True,\n            review__privacy__in=['public', 'unlisted'],\n        ).exclude(\n            cover__exact=''\n        ).annotate(\n            Max('review__published_date')\n        ).order_by('-review__published_date__max')[:6]\n\n        ratings = {}\n        for book in books:\n            reviews = models.Review.objects.filter(\n                book__in=book.parent_work.editions.all()\n            )\n            reviews = get_activity_feed(\n                request.user, ['public', 'unlisted'], queryset=reviews)\n            ratings[book.id] = reviews.aggregate(Avg('rating'))['rating__avg']\n        data = {\n            'title': 'Discover',\n            'register_form': forms.RegisterForm(),\n            'books': list(set(books)),\n            'ratings': ratings\n        }\n        return TemplateResponse(request, 'discover.html', data)\n\n\n@method_decorator(login_required, name='dispatch')\nclass Feed(View):\n    ''' activity stream '''\n    def get(self, request, tab):\n        ''' user's homepage with activity feed '''\n        try:\n            page = int(request.GET.get('page', 1))\n        except ValueError:\n            page = 1\n\n        suggested_books = get_suggested_books(request.user)\n\n        if tab == 'home':\n            activities = get_activity_feed(\n                request.user, ['public', 'unlisted', 'followers'],\n                following_only=True)\n        elif tab == 'local':\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'], local_only=True)\n        else:\n            activities = get_activity_feed(\n                request.user, ['public', 'followers'])\n        paginated = Paginator(activities, PAGE_LENGTH)\n\n        goal = models.AnnualGoal.objects.filter(\n            user=request.user, year=timezone.now().year\n        ).first()\n        data = {\n            'title': 'Updates Feed',\n            'user': request.user,\n            'suggested_books': suggested_books,\n            'activities': paginated.page(page),\n            'tab': tab,\n            'goal': goal,\n            'goal_form': forms.GoalForm(),\n        }\n        return TemplateResponse(request, 'feed.html', data)\n\n\ndef get_suggested_books(user, max_books=5):\n    ''' helper to get a user's recent books '''\n    book_count = 0\n    preset_shelves = [\n        ('reading', max_books), ('read', 2), ('to-read', max_books)\n    ]\n    suggested_books = []\n    for (preset, shelf_max) in preset_shelves:\n        limit = shelf_max if shelf_max < (max_books - book_count) \\\n                else max_books - book_count\n        shelf = user.shelf_set.get(identifier=preset)\n\n        shelf_books = shelf.shelfbook_set.order_by(\n            '-updated_date'\n        ).all()[:limit]\n        if not shelf_books:\n            continue\n        shelf_preview = {\n            'name': shelf.name,\n            'books': [s.book for s in shelf_books]\n        }\n        suggested_books.append(shelf_preview)\n        book_count += len(shelf_preview['books'])\n    return suggested_books\n", "path": "bookwyrm/views/landing.py"}]}