Легко заметить, что далеко не все полученные данные подходят для загрузки на SQL сервер. Например, дата должна быть в формате, "понятном" серверу. Не говоря уже о том, что bytes и status могут и не быть числами, тогда как в базе данных для них имеет смысл завести поля типа integer (для последующего суммирования).
Разберемся сначала с датой. Определим словарь с порядковыми номерами месяцев. Он нам будет нужен в дальнейшем:
month = {'Jan' : 1, 'Feb' : 2, 'Mar' : 3, 'Apr' : 4, 'May' : 5, 'Jun' : 6, 'Jul' : 7, 'Aug' : 8, 'Sep' : 9, 'Oct' : 10, 'Nov' : 11, 'Dec' : 12}
>>>> #разделяем на день, часы, минуты, секунды
...
>>>> datetime = date[1:].split(':')
>>>> datetime
['13/Sep/2002', '14', '19', '58']
В принципе, день можно оставить как есть. MS SQL Server понимает такой формат. Тогда окончательная дата будет:
sql_date = '%s %s:%s:%s' % (datetime[0], datetime[1], datetime[2], datetime[3])
>>>> sql_date
'13/Sep/2002 14:19:58'
Можно определить другой формат, например:
#получаем день, месяц, год
...
>>>> day = datetime[0].split('/')
>>>> day
['13', 'Sep', '2002']
>>>> #теперь конструируем дату
...
>>>> sql_date = '%s-%s-%s %s:%s:%s' % (day[2], month[day[1]], day[0], datetime[1], datetime[2], datet
ime[3])
>>>> sql_date
'2002-9-13 14:19:58'
Теперь проверим, действительно ли bytes и status содержат целые числа. Это лучше всего сделать с помощью конструкции try/except:
try:
bytes = int(bytes)
except:
bytes = 0
Еще одна проблема может возникнуть с содержанием запроса клиента. Дело в том, что строка запроса может быть очень длинной (например, при попытке взлома веб-сервера злоумышленник может сформировать такую строку, пытаясь воспользоваться уязвимостью переполнения буфера). Имеет смысл ограничить ее разумной величиной, например 256 символов:
if len(user_request) > 255:
user_request = user_request[:255]
Конечно, если вы хотите анализировать попытки взлома и некорректные запросы, нужно оставить все как есть, задав соответствующему полю таблицы нужный формат.