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

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

    return redirect('/')
Это работает и достигает своей цели, удаляя экземпляры, однако, если хранилище ключей пусто, я получаю ошибку ключа, а не просто передаваемый код? Кто-нибудь может пролить свет? Заранее спасибо.              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

3 Ответы

0 голосов
от
Доступ к ключам диктов (или диктовок), которые не существуют, вызывает
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.
    
0 голосов
от
Это может быть сведено в одну строку:
request.session.pop('instances', None)
    
0 голосов
от
Если вы используете
request.session['instances']
, вы выполняете поиск. Если ключ (здесь
'instances'
) недоступен, он вызовет
KeyError
. Таким образом, ошибка генерируется до того, как истинность выражения оценивается с помощью инструкции
if
. Однако лучше просто использовать
.pop(..)
здесь:
request.session.pop('instances', None)
Это удалит ключ, если он доступен, в противном случае ничего не делать. Он вернет значение, которое было связано с ключом
'instances'
, если такое значение существует, и в противном случае вернет
None
.     
...