?
Анимация
JavaScript
|
Главная Библионтека 26.1. rexec - основные средства настройки защищенного режима 353 r execfile( filename) s execfile( filename) Выполняет в модуле main созданного окружения код языка Python, содержащийся в файле filename. Класс RExec также определяет следующие методы, которые неявно вызываются при выполнении кода в защищенном режиме. Вы можете переопределить их в производном классе, чтобы изменить накладываемые ограничения (достаточно переопределить метод с приставкой r ). r import( modulename [, globals [, locals [, fromlist ]]]) s import( modulename [, globals [, locals [, fromlist ]]]) Этот метод используется вместо встроенной функции import () (см. главу 12) для импортирования модуля. Должен генерировать исключение ImportError, если считается небезопасным. r open (filename [, mode [, bufsize]]) s open (filename [, mode [, bufsize]]) Этот метод используется вместо встроенной функции open() (см. главу 12). По умолчанию метод r open() позволяет открыть любой файл только для чтения (режимы r и rb). Смотрите пример в конце раздела, реализующий метод r open() с меньшими ограничениями. r reload( module) s reload( module) Этот метод используется вместо встроенной функции reload() (см. главу 12) для перезагрузки модуля. r unload() s unload() Вы можете использовать эти методы для выгрузки модуля (удаления его из словаря sys.modules созданного окружения). Приведем пример класса, позволяющего открывать файлы на запись в каталоге /tmp: from rexec import RExec from os.path import normpath, islink class TmpWriterRExec(RExec): def r open(self, file, mode=r, bufsize=-1): if mode not in (r, rb): file = normpath(file) 354 Глава 26. Выполнение в защищенном режиме if file[:5]!=/tmp/ or islink(file): raise IOError( "Cant write outside /tmp") return open(file, mode, bufsize) 26.2 Bastion - ограничение доступа к экземплярам классов Этот модуль предназначен для использования совместно с модулем rexec и предоставляет возможность запретить доступ ко всем атрибутам данных и небезопасным методам экземпляра класса. Bastion (object [, filter [, name [, bastionclass]]]) Возвращает экземпляр класса bastionclass (по умолчанию используется BastionClass), который ведет себя аналогично объекту object, но предоставляет доступ только к методам, для имен attr name которых filter (attr name) является истиной. Функция filter, используемая по умолчанию, запрещает доступ к методам, имена которых начинаются с символа подчеркивания ( ). При попытке доступа к атрибутам данных или запрещенным методам генерируется исключение AttributeError. Строковым представлением (результатом применения встроенной функции repr() или при заключении в обратные кавычки) защищенного объекта будет <Bastion for name>. Если аргумент name опущен или равен None, вместо name используется repr(object) . BastionClass(getfunc, name) Этот (или производный от него) класс используется в качестве аргумента bastionclass функции Bastion() и реализует защиту объекта. Аргумент getfunc должен быть функцией (тип function), возвращающей значение атрибута с именем, переданным в качестве единственного аргумента, если атрибут считается безопасным, и генерирующей исключение AttributeError, если доступ к атрибуту запрещен. Аргумент name используется при конструировании строкового представления объекта. Поддержка протоколов Internet Стандартная библиотека предоставляет набор модулей, осуществляющих поддержку большинства распространенных протоколов Internet. Мы остановимся лишь на наиболее часто используемых - тех, которые предоставляют интерфейс высокого уровня. cgi Протокол CGI (общий шлюзовой интерфейс), используемый для интер- претации форм HTML на стороне сервера. urllib Чтение произвольных ресурсов по URL. urlparse Операции над URL. 27.1 cgi - протокол CGI Этот модуль предоставляет средства, которые будут полезны при написании программ, использующих интерфейс CGI (Common Gateway Interface, общий шлюзовой интерфейс), на языке Python. 27.1.1 Введение CGI-программа вызывается HTTP-сервером, обычно для обработки данных, переданных пользователем через элементы <F0RM> и <ISINDEX> языка HTML. HTTP-сервер помещает информацию о запросе (имя узла клиента, запрашиваемый URL, строка параметров запроса и др.) в переменные окружения программы, выполняет программу и пересылает клиенту его вывод. Часть данных от клиента может также поступать на стандартный поток ввода программы. Модуль cgi берет на себя заботу обо всех возможных способах передачи данных и предоставляет их программе через простой интерфейс. Модуль также предоставляет набор средств, которые будут полезны при отладке. Вывод CGI-программы должен состоять из двух частей, разделенных пустой строкой. Первая часть содержит набор заголовков, которые описывают тип данных, следующих во втором разделе. Простейшая программа может выглядеть следующим образом: # Заголовок: далее следует HTML-документ print "Content-Type: text/html" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 [ 112 ] 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |