Django. Робота з Excel.

Основи Python и Django. -> Винятки в Python.

# Помилки

Помилки в програмі Python виникають при виконанні коду, тому процес компіляції відсутній.

Помилки в коді викликають винятки, і якщо вони не відпрацьовані, робота програми припиняється.

Саме тому вміння обробляти винятки та приймати рішення виходячи з їх характеру є дуже важливим та невід’ємним процесом кожної програми.

Синтаксичні помилки.

Також відомі як помилки парсингу.

Наприклад, такий код викличе

while True print 'Hello world'

>>> while True print 'Hello world'
  File "<stdin>", line 1, in ?
    while True print 'Hello world'
                   ^
SyntaxError: invalid syntax

У цьому прикладі ми пропустили знак:

Маркер >>> вказує на рядок з помилкою, за яким слідує її номер.

Винятки та їх обробка.

Для того, щоб програма не завершувалася за винятком, його необхідно обробляти за допомогою конструкції try except.

Наприклад, спробуємо поділити два числа, що вводяться користувачем з клавіатури.

x = input('first number: ')
y = input('second number: ')
print('is: %s' % x/y)

>>> TypeError: unsupported operand type(s) for /: 'str' and 'int'

Ми отримаємо виключення невідповідності типів під час форматування рядка.

Додамо обробник виключення.

x = input('first number: ')
y = input('second number: ')
try:
    print('is: %s' % x/y)
except:
    print('Someting went wrong!')

>> Someting went wrong!

Для того, щоб у разі помилки вивести причину виникнення, потрібно її перехопити.

x = input('first number: ')
y = input('second number: ')
try:
    print('is: %s' % x/y)
except Exception as e:
    print(e)

>>> unsupported operand type(s) for /: 'str' and 'int'

Як визначити тип виключення та прийняти рішення, виходячи з цього типу?

Кожен виняток має тип, і ми можемо його використовувати.

try:
    print 'is: %s' % x/y
except TypeError:
    print 'is: %s' % str(x/y)
except ZeroDivisionError:
    print 'ZeroDivisionError exception!'

TypeError и ZeroDivisionError - это встроенные типы исключений и не требуют их импорта.

Що якщо нам необхідно щось виконати незалежно від того виник виняток чи ні.

Це може бути корисним для звільнення зайнятих ресурсів, наприклад бази даних або відкритого файлу.

Для цього використовуємо finally оператор.

Оператор finally.

Блок, укладений у цю конструкцію буде виконаний перед тим як залишити конструкцію try незалежно від того чи виняток чи ні.

try:
    print ('is: %s' % x/y)
except TypeError:
    print ('is: %s' % str(x/y))
except ZeroDivisionError:
    print ('ZeroDivisionError exception!')
finally:
    print('Finally block fired!')

>>>
code$ python exeption.py 
first number: 12
second number: 3
unsupported operand type(s) for /: 'str' and 'int'
is: 4
Finally block fired!

Крім вбудованих у python винятків ми можемо створювати власні, щоб мати можливість їх відпрацювати в клієнтському коді.

Наприклад, при написанні бібліотеки для поповнення рахунку користувача потрібно визначити виняток у разі спроби поповнення вище за лімітовану суму.

Для цього потрібно мати можливість штучно згенерувати виняток у програмі, виходячи з бізнес-логіки.

Це робить оператор rase, який повертає рядок або рядкове представлення об’єкта класу виключення.

У нашому випадку це виглядатиме так:

raise AddMoneyError(1000)

Створимо такий виняток.

class AddMoneyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr('User can not add more than %s' % self.value)

Ми створили свій клас виключення та успадкувалися від python класу Exception. Також визначили метод str де вивели опис помилки використовуючи внутрішню змінну value її форматування.

class User(object):
    account = 0
    def add(self,amount):
        if amount>1000:
            raise AddMoneyError(1000)
        else:
            self.account = self.account+amount

У клієнтському коді спробуємо поповнити рахунок.

user = User()
user.add(10000)
print 'finish operation'

Отримуємо

raise AddMoneyError(1000)
__main__.AddMoneyError: 'User can not add more than 1000'

Наш виняток спрацював і ми можемо його опрацювати.

user = User()
try:
    user.add(10000)
except AddMoneyError as e:
    print e


zdimon@dell:~/www/lyceum/8/code$ python limit_account.py
'User can not add more than 1000'
finish operation
zdimon@dell:~/www/lyceum/8/code$
Основи Python и Django. -> Експорт даних до таблиці Excel.

Створення проекту.

Створення проекту папки.

mkdir exel
cd exel

Віртуальне оточення.

встановлення в систему необхідних команд (установник python pip и virtualenv)

sudo apt-get install python3-pip virtualenv

встановлення віртуального оточення у проект

virtualenv -p python3 venv
  • створюється папка venv де будуть requirements-и, яку зазвичай ігнорують у git.

Активація віртуального оточення

. ./venv/bin/activate

з’являється приставка (venv) на початку командного рядка, що означає, що оточення активоване і ми можемо встановлювати необхідні пакети

Встановлення Django

pip install django

Створення нового проекту

django-admin startproject prj

Створення програми

cd djangoprj
./manage.py startapp main

Прописуємо назву нової програми в налаштуваннях djangoprj/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main'
]

Запуск сервера розробки.

./manage.py runserver 9898

Встановлення системних бібліотек для роботи с MySQL.

sudo apt-get install python3-dev libmysqlclient-dev build-essential

Встановлення клієнта MySQL.

pip install mysqlclient

Прописуємо коннект до бази в settings.py.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': './prj/my.cnf',
        },
    }
}

Файл prj/my.cnf

[client]
database = locotrade_new
user = root
password = password
default-character-set = utf8

Створюємо файл із класами моделей існуючої БД.

./manage.py inspectdb > out-models.py

Скопіюємо з файлу out-models.py клас із користувачами у файл main/models.py.

class Users(models.Model):
    email = models.CharField(unique=True, max_length=191)
    password = models.CharField(max_length=191)
    active = models.IntegerField()
    remember_token = models.CharField(max_length=100, blank=True, null=True)
    created_at = models.DateTimeField(blank=True, null=True)
    updated_at = models.DateTimeField(blank=True, null=True)
    deleted_at = models.DateTimeField(blank=True, null=True)
    first_name = models.CharField(max_length=191, blank=True, null=True)
    last_name = models.CharField(max_length=191, blank=True, null=True)
    phone = models.CharField(max_length=191, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'users'

Створимо нову команду.

cd main
mkdir  management
touch management/__init__.py
mkdir management/command
touch management/command/__init__.py
touch management/command/load_users.py

Файл load_users.py.

from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Load Users')

Запуск команди.

./manage.py load_users

Проходимо циклом за таблицею з користувачами.

print('Load Users')
for user in Users.objects.all():
    print(user.email)

Встановлення бібліотеки для роботи з файлами xls НА ЗАПИС!

Документація

pip install xlwt

Створення файлу exel.

ЗЗапис даних у комірки таблиці

wb = xlwt.Workbook()
ws = wb.add_sheet('A Test Sheet')
ws.write(0, 0, 'Hello world!!!')
ws.write(0, 1, 12345)
wb.save('example.xls')')