У меня есть вид, который просто проверяет наличие ключа в хранилище сеансов, и если он присутствует, он удаляет его, а если его нет, он должен пройти, возможно, стоит отметить, что хранилище ключей содержит идентификаторы модельных экземпляров.

def RefreshInstances(request):

    if request.session['instances']:
      del request.session['instances']
    else:
      pass

    return redirect('/')

Это работает и достигает своей цели, удаляя экземпляры, однако, если хранилище ключей пусто, я получаю ошибку ключа, а не просто передаваемый код?

Кто-нибудь может пролить свет?

Заранее спасибо.

2
alvo 4 Июл 2019 в 17:01

3 ответа

Лучший ответ

Доступ к ключам диктов (или диктовок), которые не существуют, вызывает KeyError.

Вы можете явно проверить ключ:

if 'instances' in request.session:
   # ...

Или вы можете использовать метод .get(), который возвращает значение по умолчанию (None по умолчанию), если ключ не существует - это также удобно, потому что ложные значения, такие как 0, '', False, [ ] и т. д. пройти тест:

if request.session.get('instances'):
      del request.session['instances']

... но для удаления просто используйте .pop() со значением по умолчанию и без if:

request.session.pop('instances', None)  # Remove `instances` if it's there, do nothing otherwise.
3
AKX 4 Июл 2019 в 14:05

Если вы используете request.session['instances'], вы выполняете поиск. Если ключ (здесь 'instances') недоступен, он вызовет KeyError. Таким образом, ошибка выдается до того, как истинность выражения оценивается оператором if.

Однако лучше просто использовать .pop(..) здесь:

request.session.pop('instances', None)

Это удалит ключ, если он доступен, в противном случае ничего не делать. Он вернет значение, которое было связано с ключом 'instances', если такое значение существует, и вернет None в противном случае.

2
Willem Van Onsem 4 Июл 2019 в 14:05

Это может быть сведено в одну строку:

request.session.pop('instances', None)
3
Daniel Roseman 4 Июл 2019 в 14:04