404

Работа с веб содержимым Python на Ubuntu Touch

[исходный код проекта можно скачать здесь]

Иногда для приложения требуется возможность работы с веб-содержимым. Будто чат, парсер RSS или клиент версия сайта. В этом примере мы рассмотрим простейшую возможность обработки GET запроса.

Создадим новый проект в Clickable, в терминале вводим команду:

clickable create

Выбираем тип проекта Python и заполняем:
Title [App Title]: Example Web
App Name [appname]: example-web

Удаляем все лишнее в Main.qml и приводим к виду:

Page {
    anchors.fill: parent

    header: PageHeader {
        id: header
        title: i18n.tr('Example Web')
    }

    Label {
        id: label1
        anchors {
            top: header.bottom
            left: parent.left
            right: parent.right
            bottom: parent.bottom
        }
        text: 'Get Web'
        verticalAlignment: Label.AlignVCenter
        horizontalAlignment: Label.AlignHCenter
    }
}

Добавим обработчик Python:

Python {
    id: python
    Component.onCompleted: {
        addImportPath(Qt.resolvedUrl('../src/'));

        importModule('example', function() {
            python.call('example.speak',[], function(returnValue) {
                console.log(returnValue);
                label1.text=returnValue;
            })
        });
    }

    onError: {
        console.log('python error: ' + traceback);
    }
}

Таким образом, после исполнения Python кода, мы выведем это содержимое в Label.
Теперь переходим в папку src и редактируем example.py:

import urllib3

def speak():
  http = urllib3.PoolManager()
  try:
    source = http.request('GET', 'http://webcode.me')
  except Exception as e:
    return str(e)
  else:
    html_str = source.data.decode('utf-8')
    return html_str

Теперь если мы запустим этот код на телефоне, то мы получим ошибку:

HTTPConnectionPool(host='webcode.me', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xa8111390>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

Все это связано с защитой Ubuntu Toch от того, что бы приложения не творили лишнего 😁
В папке с проектом находим _.apparmor и добавляем в него новые привилегии(разрешения):

{
    "policy_groups": [
        "content_exchange",
        "content_exchange_source",
        "networking",
        "webview"
    ],
    "policy_version": 16.04
}

Хоть этот файл и в формате JSON, почему то количество пробелов здесь важно. Поэтому, если какие то разрешения не получены вашим приложением, то проверьте пробелы или напишите их в одну строку.

Теперь мы можем скомпилировать и запустить нашу программу.

ubuntu_toch_20.png