Monthy Python

Ramhak konung@ic.ru

Xakep, номер #017, стр. 017-026-4


Затем нужно сказать пару магических слов, чтобы браузер, в котором инетчик введет наш урл, понял, что именно мы ему собираемся отдавать - файл, html-файл, txt-файл или может вообще ничего. Для того чтобы сказать, что мы собираемся отдать ему html-файл, нужно вывести определенные строки с помощью print:

print "Content-type: text/html"

print

Затем нужно разобраться, какие параметры заданы в урле. Параметры передаются после "?" в виде "имя параметра=значение параметра". Каждый параметр отделяется от остальных амперсандом - "&". У нашего скрипта должен быть только один параметр - url, а равняться он должен адресу странички, которую будет обрабатывать скрипт. Несложная система реализуется на питоне в один присест. Чтобы разобраться со строками и текстом, нам понадобятся соответствующие функции. Самим ничего писать не придется - все уже сделано до нас, надо только подключить нужную библиотеку:

import string

Стоп! Что-то забыл... А! Ну конечно! Параметры - с ними тоже можно не возиться, а просто подключить соответствующую либу:

import cgi

Теперь можно и кодить (все необходимые комментарии прямо в тексте):

f = open("counter.dat", "r+") # откроем файл counter.dat для чтения и записи (параметр r+)

counter = string.atoi(f.readline()) # f.readline - считывает одну строку из файла

# а string.atoi переводит строку в число, которое можно

counter = counter + 1 # увеличить на единицу (счетчик, все-таки :)

f.seek(0, 0) # снова перейдем в начало файла

s = "%(counter)d;" % vars() # сделаем здесь небольшой трюк, о котором подробнее - чуть

# позже

f.write(s + "\n") # здесь s = значение счетчика, но s - это уже строка.

# к ней мы прибавляем "\n" - символ перевода на следующую # строчку

f.close() # закроем файл

# здесь мы уже знаем текущее значение счетчика - оно находится в counter и в s

# нужно выяснить, что за файл нужно обработать. Для этого воспользуемся функциями

# подключенной библиотеки-либы cgi

form = cgi.FieldStorage() # разобраться с параметрами

if form.has_key("url") and form["url"].value != "": # нужный параметр есть и он не пуст...

f = open(form["url"].value, "r") # откроем файл

lines = f.readlines() # прочтем его весь в список lines

f.close() # закроем файл

for index in range(len(lines)): # и в каждой строке

string.replace(lines[index], "%%%counter%%%", s)

print s # заменим %%%counter%%% на значение

# счетчика и отдадим строку браузеру

Эти несколько строчек - все, что пришлось делать. Не пришлось даже разбираться (хотя было бы не плохо) :) в перло подобных "регулярных выражениях" (regular expression). Но это, как говорят, уже совсем другая история.

Все тело в волшебных пузырьках

Python ориентирован прежде всего на работу с консолью, поскольку задумывался он как Unix-приложение. Отсюда и все родственные с этой системой конструкции семантики (то есть правил написания программ). Но, надо признать, что те, кто потрудился в свое время над PYTHON, совершили мужественный поступок, решив оторвать его от Unix и постараться сделать его системонезависимым (чтобы он работал и под Windows, и под DOS, и под OS/2, и даже под QNX). Хотя впервые реализован PYTHON был на Маках. Неувязочка такая. (-: Уже позже были придуманы частичная компиляция (не в коды процессора, а в коды интерпретатора, который, естественно, обрабатывает их быстрее, чем "сырой" скрипт) и изготовление пакетных файлов, одна и та же версия которых может с успехом работать практически на любой платформе. Это, безусловно, большой плюс в пасть PYTHON. :) Тем более, что для win32 выпущен псевдокомпилятор - скрипт компилируется в транскоды (в собственный двоичный формат, придуманный автором питона, чтобы все программы, написанные на питоне, работали быстрее) и упаковывается в EXE-шник с интерпретатором. Получается небольшой исполняемый файл, который можно распространять отдельно, не ставя Python под каждую мастдайку.

Назад на стр. 017-026-3  Содержание  Вперед на стр. 017-026-5