Объект 'SessionStore' не имеет атрибута 'GET' - PullRequest
1 голос
/ 02 июня 2019

Что не так в этом коде, он генерирует следующую ошибку:

>   'SessionStore' object has no attribute 'GET'

это код:

def blog_detail(request, blog_slug):
    blog = get_object_or_404(Blog, slug=blog_slug)
    session_key = 'blog_views_{}'.format(blog.slug)
    if not request.session.GET.get('session_key', False)
        blog.blog_views += 1
        blog.save()
        request.session['session_key'] = True

    return render(request, 'blogs/blog-detail.html', {'blog':blog})

Я думаю, что я делаю это неправильно, используя request.session,Можете ли вы помочь мне с этим, спасибо.

edit: traceback

Environment:


Request Method: GET
Request URL: http://localhost:8000/dramatically-productivate-global-functionalities-whereas-reliable-internal-or-organic-sources

Django Version: 2.2.1
Python Version: 3.7.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'blogs',
 'users',
 'crispy_forms']
Installed Middleware:
['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']



Traceback:

File "E:\Practice\new-blog\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "E:\Practice\new-blog\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "E:\Practice\new-blog\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "E:\Practice\new-blog\src\blogs\views.py" in blog_detail
  53.     if not request.session.GET.get('session_key', False):

Exception Type: AttributeError at /dramatically-productivate-global-functionalities-whereas-reliable-internal-or-organic-sources
Exception Value: 'SessionStore' object has no attribute 'GET'

1 Ответ

1 голос
/ 02 июня 2019

Здесь есть две ошибки:

  • вы не можете использовать request.session.GET.get(..), поскольку объект SessionBase имеет атрибут no GET
  • Вы использовали строковый литерал 'session_key' вместо идентификатора.

Возможно, вы захотите написать:

def blog_detail(request, blog_slug):
    blog = get_object_or_404(Blog, slug=blog_slug)
    session_key = 'blog_views_{}'.format(blog.slug)
    if not request.session<b>.get(session_key</b>, False<b>)</b>:
        blog.blog_views += 1
        blog.save()
        request.session[<b>session_key</b>] = True

    return render(request, 'blogs/blog-detail.html', {'blog':blog})

мы можем сделать оператор if немного короче, поскольку .get(..) по умолчанию возвращает None, который также имеет истинность False:

def blog_detail(request, blog_slug):
    blog = get_object_or_404(Blog, slug=blog_slug)
    session_key = 'blog_views_{}'.format(blog.slug)
    if not request.session.get(session_key):
        blog.blog_views += 1
        blog.save()
        request.session[session_key] = True

    return render(request, 'blogs/blog-detail.html', {'blog':blog})

Так что здесь мы используем request.session.get(..) и используемsession_key идентификатор, а не литерал.Если мы будем использовать 'session_key', мы просто спросим, ​​есть ли у сеанса ключ 'session_key', а не 'blog_views_some-title'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...