Ответ 1
Первый момент: у вас слишком много кода в вашем блоке try/кроме. Лучше использовать отдельные блоки try/кроме случаев, когда у вас есть два оператора (или две группы операторов), которые могут вызывать разные ошибки:
try:
try:
curs.execute(sql)
# NB : you won't get an IntegrityError when reading
except (MySQLdb.Error, MySQLdb.Warning) as e:
print(e)
return None
try:
user = curs.fetchone()[0]
return user
except TypeError as e:
print(e)
return None
finally:
conn.close()
Теперь вам действительно нужно ловить TypeError здесь? Если вы прочитаете трассировку, вы заметите, что ваша ошибка возникает из-за вызова __getitem__()
в None
(примечание: __getitem__()
- реализация для оператора индекса []
), что означает, что если у вас нет подходящих строк cursor.fetchone()
возвращает None
, так что вы можете просто проверить возвращение currsor.fetchone()
:
try:
try:
curs.execute(sql)
# NB : you won't get an IntegrityError when reading
except (MySQLdb.Error, MySQLdb.Warning) as e:
print(e)
return None
row = curs.fetchone()
if row:
return row[0]
return None
finally:
conn.close()
Теперь вам действительно нужно ловить ошибки MySQL здесь? Предполагается, что ваш запрос хорошо протестирован и представляет собой только операцию чтения, поэтому он не должен завершаться сбоем - поэтому, если у вас что-то идет не так, то у вас, очевидно, есть большая проблема, и вы не хотите скрывать это под ковром. IOW: либо регистрируйте исключения (используя стандартный пакет logging
и logger.exception()
) и повторно повышайте их, либо, более просто, позволяйте им распространяться (и, в конечном итоге, компонент более высокого уровня позаботится о регистрации необработанных исключений):
try:
curs.execute(sql)
row = curs.fetchone()
if row:
return row[0]
return None
finally:
conn.close()
И, наконец: способ создания SQL-запроса совершенно небезопасен. Вместо этого используйте заполнители sql:
q = "%s%%" % data["email"].strip()
sql = "select userid from oc_preferences where configkey='email' and configvalue like %s"
cursor.execute(sql, [q,])
О, да: wrt/"Функция просмотра не вернула ответ" ValueError, это потому, что ваш взгляд возвращает None
во многих местах. Предполагается, что представление в колбе должно возвращать что-то, что может быть использовано в качестве ответа HTTP, и здесь None
не является допустимым вариантом.