Создание команды загрузки пользователей. Создание команды загрузки пользователей. Создание команды загрузки пользователей.

Создание команды загрузки пользователей.

Open in new window

Создание структуры каталогов для команды.

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

main/
    management/
        __init__.py
        commands/
            __init__.py

Сделаем это с помощью bash команд

cd main
mkdir management
mkdir management/commands
touch management/__init__.py
touch management/commands/__init__.py

Создание пустой команды.

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

class Command(BaseCommand):

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

Установка библиотеки requests

pip install requests

Пытаемся использовать requests.

rez = requests.get('https://google.com')
print(rez.text)

Определим глобальную переменную с ключем API в файле settings.py

API_KEY = '<secret key>'

Импорт этой переменной из любого модуля будет выглядить так:

from djangoprj.settings import API_KEY

Определим ф-цию внутри команды.

def get_users():
    action = 'get_users'
    key_str = '%s%s' % (action,API_KEY)
    hash = hashlib.md5(key_str.encode()).hexdigest()
    print('hash = %s' % hash)
    url = 'https://wezom.worksection.com/api/admin/?action=%s&hash=%s' % (action, hash)
    res = requests.get(url)
    print(res.text)

Тут мы формируем строку согласно документации API где конкатенируем название запроса с секретным ключем.

key_str = '%s%s' % (action,API_KEY)

Кодируем ее в md5 строку.

hash = hashlib.md5(key_str.encode()).hexdigest()

И посылаем запрос на адрес API, куда передаем наш хэш.

url = 'https://wezom.worksection.com/api/admin/?action=%s&hash=%s' % (action, hash)
res = requests.get(url)

Получаем результат в таком формате:

{

    "status": "ok",
    "data": [
        {
            "id": "USER_ID",
            "email": "USER_EMAIL",
            "first_name": "USER_FIRST_NAME",
            "last_name": "USER_LAST_NAME",
            "name": "USER_NAME",
            "title": "USER_POSITION",
            "avatar": "URL",
            "company": "USER_COMPANY",
            "department": "USER_DEPARTMENT"
         }
    ]
}

Чтобы с ним работать необходимо эту json строку преобразовать в питоновский словарь.

out = json.loads(res.text)

теперь можно доставать данные по ключу:

out['data']

Добавим класс модели в файл main/models.py

class WUsers(models.Model):
    name = models.CharField(max_length=250)
    email = models.CharField(max_length=250)
    first_name =  models.CharField(max_length=250)
    last_name = models.CharField(max_length=250)
    title = models.CharField(max_length=250)
    avatar = models.CharField(max_length=250)
    company = models.CharField(max_length=250)
    department = models.CharField(max_length=250)

Определим функцию для сохранения пользователей в базу, которой передадим список пользователей.

def save_users(users):
    for u in users:
        print('Saving %s' % u['name'])
        try:
            WUsers.objects.get(email=u['email'])
            print('User %s exists' % u['email'])
        except:
            nu = WUsers()
            nu.name = u['name']
            nu.email = u['email']
            nu.first_name = u['first_name']
            nu.last_name = u['last_name']
            nu.title = u['title']
            nu.avatar = u['avatar']
            nu.company = u['company']
            nu.department = u['department']
            nu.save()

Попутно проверяем пользователя на существование чтобы избежать дублирования при повторных запусках команды.

Полный код комманды:

from django.core.management.base import BaseCommand, CommandError
import requests
from djangoprj.settings import API_KEY
import hashlib
import json

from main.models import WUsers

def save_users(users):
    for u in users:
        print('Saving %s' % u['name'])
        try:
            WUsers.objects.get(email=u['email'])
            print('User %s exists' % u['email'])
        except:
            nu = WUsers()
            nu.name = u['name']
            nu.email = u['email']
            nu.first_name = u['first_name']
            nu.last_name = u['last_name']
            nu.title = u['title']
            nu.avatar = u['avatar']
            nu.company = u['company']
            nu.department = u['department']
            nu.save()

def get_users():
    action = 'get_users'
    key_str = '%s%s' % (action,API_KEY)
    hash = hashlib.md5(key_str.encode()).hexdigest()
    print('hash = %s' % hash)
    url = 'https://wezom.worksection.com/api/admin/?action=%s&hash=%s' % (action, hash)
    res = requests.get(url)
    out = json.loads(res.text)
    return out['data']


class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Load users key is %s' % API_KEY)
        users = get_users()
        save_users(users)

Результат работы (содержимое базы sqlite в файле db.sqlite3)

error template page

Вывод пользователей на страницу.

Во вьюхе (main/views.py) выберем всех пользователей и передадим в шаблон третьим параметром функции render.

from .models import WUsers

def home_page(request):
    users = WUsers.objects.all()
    return render(request,'main.html',{'users': users})

Парсим массив в шаблоне (main/templates/main.html).

<h1>User list</h1>

<ul>
{% for u in users %}
    <li>{{ u.name }}</li>
{% endfor %}
</ul>

user's list page

Other topics