URI и протокол (3 серии деталей)
Введение
В этом мини -сериале я расскажу вам, как сделать пользовательскую схему URI или URI и обработчик протокола для этого URI. Примером одного такого URI является vscode:///
! Возможно, вы видели это, когда пытаетесь войти в GitHub, используя VS -код, верно? Но мы не собираемся делать именно это, немного отличается! Готовый продукт приведен ниже!
Готовый продукт?
Ну, так что мы на самом деле сделаем? Ну, мы будем делать протокол Python://
Это позволит нам выполнить любой сценарий Python на нашем компьютере прямо из нашего браузера! Разве это не круто? И, возможно, в будущем мы могли бы сделать это так, чтобы он мог запустить любой файл Python в Интернете! Видео готового продукта приведено ниже! Извините за плохое качество, мне пришлось сократить его, чтобы Hashnode вписывался в статью!
Итак, что мы делаем сегодня?
Сегодня мы собираемся сделать базовый обработчик в Python, используя Urllib! Я буду использовать Python 3, но его можно легко перевести в Python 2 с помощью модуля Urllib2! Итак, начнем!
Предварительные условия
- Питон
- модуль Urllib – включен в стандартную библиотеку
- Stringio – включен в стандартную библиотеку
Фактический код!
Что ж, в этом посте мы просто сделаем основной обработчик, выполнение скрипта будет в следующем посте!
Импорт
import urllib.request as urlreq from io import StringIO as strio
Нам нужен urllib.request для анализа адреса протокола и создания обработчика! Нам не понадобится Stringio, с следующего поста, это только для этого поста!
Обработчик
Хорошо, поэтому импорт сделан, теперь давайте перейдем к фактическому обработчику! Это будет использовать какое-то очень основное объектно-ориентированное программирование (ООП), поэтому даже если вы не знакомы с ним, не будет проблем, но если вы знакомы, это поможет!
class PyProtoHandler(urlreq.BaseHandler): def python_open(self, req): fullUrl = req.get_full_url() return strio(fileUrl)
Итак, в приведенном выше коде мы сделали класс с именем Pyprotohandler
который наследует от urllib.request. Basehandler
. В этом классе мы определяем новую функцию с именем python_open
, который принимает 1 параметр req
В Но вот критический бит, эта функция должна быть названа определенным образом, то есть {имя протокола} _open
Анкет Если вы, например, определите функцию как myproto_open
И ваш фактический протокол – протомия
Тогда это просто даст ошибку, так что имейте это в виду!
Затем мы храним полный URL, возвращенный req.get_full_url ()
в полном. И, наконец, вернуться Fullurl
завернут в Stringio.
Установка обработчика
Хорошо, так что обработчик сделан, давайте установим и построим его. Этот шаг действительно прост, нам просто нужно назвать 2 встроенные функции Urllib!
opener = urlreq.build_opener(PyProtoHandler()) urlreq.install_opener(opener)
Итак, мы строим новичок, используя urlreq.build_opener (pyprotohandler)
и хранить возвращаемый результат или вывод в переменной новичок
Анкет Далее мы устанавливаем новичок
используя urlreq.install_opener (Opener)
. И мы закончили! Виола! Итак, давайте проверим это!
Тестирование обработчика
Мы будем использовать другую строку кода с этим файлом, чтобы проверить его!
print(urlreq.urlopen("python://something/random/file.txt").read())
Теперь, чтобы проверить, мы должны запустить файл из нашего терминала, удара или командной строки, что бы вы ни хотели! Вам, возможно, придется использовать Python
или Python3
в зависимости от вашей системы.
$ python protoHandler.py python://something/random/file.txt
Запуск файла еще раз с изменениями в коде:
print(urlreq.urlopen("python://hashnode/non-existing/dir/non/existing/file.py").read())
И выход:
$ python protoHandler.py python://hashnode/non-existing/dir/non/existing/file.py
Конец Получите путь файла!?
Я не думал, что включу это здесь, но, наконец, я сделал! Итак, наслаждайтесь всеми!
Что ж, теперь, когда мы можем получить весь протокол, теперь мы можем извлечь путь в файл.
class PyProtoHandler(urlreq.BaseHandler): def python_open(self, req): fullUrl = req.get_full_url() filePath = "".join(fullUrl.split("://")[1:]) return filePath
Итак, как вы можете видеть, я только что добавил строку в python_open
функция Который разбивает протокол в список, где 1 -й элемент – это протокол («Python»), а второй элемент – это путь файла. И мы завершаем это в ".join ()
Чтобы преобразовать путь в строку и соединить все элементы из и после элемента в индексе 1 с «» в качестве сепаратора. Даже если в индексе 1 должен быть один элемент, если введен правильный путь.
Окончательно, Конец
Я не должен ссылаться на это как конец, так как часть 2 еще впереди! В любом случае, до свидания на сегодня и подпишитесь на список рассылки, чтобы получить уведомление, когда я опубликовал часть 2! Хорошо, что!
URI и протокол (3 серии деталей)
Оригинал: “https://dev.to/pybash/making-a-custom-protocol-handler-and-uri-scheme-part-1-37mh”