Саммерфилд - Программирование на Python 3 (1077331), страница 113
Текст из файла (страница 113)
На первый взгляд, проверку величины пробега можно выполнить на стороне клиента, чтобы уменьшить объем сетевого графика — например, клиент мог бы получать сообщение об ошибке при вводе отрицательной величины пробега (или такая возможность просто предотвращалась бы). Но даже если мы обяжем сторону клиента реализовать такую проверку, мы по-прежнему должны проверять данные на стороне сервера, так как нельзя быть полностью уверенным, что клиентская программа не содержит ошибок.
И хотя программа-клиент получает величину пробега автомобиля, чтобы использовать ее в качестве значения по умолчанию, мы не должны считать величину пробега, указанную пользователем, верной (даже если она больше текущей величины), потому что какой-нибудь другой клиент мог увеличить это значение к текущему моменту времени. Из всего этого следует, что окончательная проверка данных может выполняться только на стороне сервера и только под защитой блокировки. 504 Глава 10.
Сети Метод сПапде оипег() очень похож на предыдущий, поэтому мы не будем приводить его здесь. Сет петг гедтятгаттоп(яе1Г, 1тсепяе, яеатя, а!1еаде, оипег): !Г пот 1тсепяе. ге!ого (Га1яе, "Саппот яет ап езрту 1тоепяе") тт яеатя пот тп (2, 4, 5, б, 7, б, 9): гетогп (Ра1яе, "Саппот гедгятег оаг и!то тпуа1тс яеатя") тт ат1еаде с О: гетогп (ра1яе, "Саппот яет а ледя!(че п11еаде") 1( пот оипег: гетогп (Га1яе, "Саппот яет ап епрту оипег") пгтп яе1(.Сага[поп: тг 11оепяе пот 1п яе1 и сага: яе1(.Сагя[11сепяе! = Саг(яеатя, ю1еаде, оипег) гетега (Тгое, Попе) гетогп (Га1яе, "саппот гедтятег оор1тоате 1!сепяе") И снова, прежде чем обратиться к словарю с регистрационными данными, мы можем выполнить множество проверок. Если все данные имеют допустимые значения, необходимо получить блокировку.
Если номер автомобиля отсутствует в словаре ЯедоеятНапе1ег. Сага (а он должен отсутствовать, так как при создании новой регистрационной записи должен указываться незарегистрированный номер), создается новый объект Саг и сохраняется в словаре. Все это должно выполняться под защитой блокировки, потому что мы не должны допускать возможность добавления одного и того же номера автомобиля в момент времени между проверкой присутствия номера автомобиля в словаре Нероеятиапб1ег. Сага и добавлением нового объекта Саг в словарь.
бег япотсопп(яе1г, *!дпоге); яе1(.яегрег.япотооип() га!яе Гтп1яп() Если запрошена операция остановки сервера, вызывается метод ало!- Соил() сервера — это приведет к прекращению приема последующих запросов, но сам сервер продолжит обработку уже принятых запросов. После этого мы возбуждаем собственное исключение, чтобы известить метод Папе1ег(), что работу сервера следует прекратить. Это приведет к тому, что метод Папе1ег() вернет управление вызывающей программе, не посылая ответ клиенту. В заключение В этой главе было показано, что сетевые клиенты и серверы реализуются довольно просто благодаря наличию в стандартной библиотеке языка Ру1Ьоп сетевых модулей и модулей я!гост и р!сН1е. В первом разделе мы разработали клиентскую программу н создали в ней единственную функцию Папо1е гедоеят(), способную отправлять 505 Упражнения на сервер и получать от сервера произвольные законсервированные объекты с данными в универсальном формате «длина плюс законсервированный объект».
Во втором разделе мы увидели, как можно создать подкласс сервера, используя классы из модуля восКетвегвег, и как реализовать класс обработчика запросов для обслуживания запросов клиентов. Здесь также все сетевые взаимодействия были сосредоточены в единственном методе Пзпб1е(), который принимает от клиентов и отправляет клиентам произвольные законсервированные объекты с данными. Модули восКет и восКетвегвег, а также многие другие модули из стандартной библиотеки, такие как авупссге, звупспа! и вв1, предоставляют намного больше функциональных возможностей, чем мы использовали здесь.
Но если окажется, что средств сетевых взаимодействий, имеющихся в стандартной библиотеке, недостаточно или они недостаточно высокоуровневые, то стоит обратить внимание сетевую платформу Гн1вгез, созданную сторонними разработчиками (шшш.вш(ввег(тавг!х.сот), как на возможную альтернативу. Упражнения В упражнения предлагается модифицировать программы клиента и сервера, описанные в этой главе. Модификации не требуют ввода больших объемов программного кода, но требуют проявить долю внимания, чтобы найти правильное решение. 1. Скопируйте программы саг геу(в(гав(оп зегоегру и саг геу!в!гав(- оп.ру и измените их так, чтобы они использовали версию протокола обмена на сетевом уровне.
Реализовать это можно, например, передавая два целых числа (длина, версия протокола) вместо одного. Для этого потребуется добавить или изменить порядка десяти строк в функции пзпс1е герпевт() в клиентской программе, а также добавить илн изменить порядка шестнадцати строк в методе Пзпп1е() в серверной программе, включая программный код, обрабатывающий ситуацию, когда номер версии протокола не соответствует ожидаемому. 2.
Скопируйте программу саг геу!в!гав!оп вегоегру (или используйте ту, что была разработана в упражнении 1) и модифицируйте ее так, чтобы она выполняла новую операцию СЕТ Е1СЕКВЕЗ БТАВТ1КС И1ТН. Операция должна принимать один строковый параметр. Метод, реализующий операцию, должен всегда возвращать кортеж из двух элементов (Тгпе, список номеров). Ситуация ошибки в данном случае невозможна, так как отсутствие совпадений не является ошибкой, и в этом случае клиенту должны возвращаться значение Тгзе и пустой список. Извлечение номеров автомобилей (ключей словаря Несзевтиапб1ег. Сагв) должно выполняться под защитой блокировки, но все ос- 506 Глава 10.
Сети тальные действия должны выполняться за пределами блокировки, чтобы минимизировать время блокировки словаря. Один из эффективных способов поиска соответствующих номеров автомобилей заключается в том, чтобы отсортировать список ключей, затем с помощью модуля О[вест отыскать первое совпадение и потом выполнять итерации, начиная с найденного элемента. Другое возможное решение состоит в том, чтобы выполнить итерации по списку номеров, выбирая те, что начинаются с указанной строки, возможно, с применением генератора списков.
Помимо дополнительной инструкции таро гС, необходимо будет добавить пару строк программного кода, записывающего ссылку на реализацию операции в словарь Са11. Размер метода реализации операции не будет превышать десятка строк. Это совсем несложно, но потребует проявить определенное внимание. Решение, использующее модуль О[вест, приводится в файле сап геу181га11оп вегиег апв.ру. 3.
Скопируйте программу саг геу[в1га11опру (или используйте ту, что была разработана в упражнении 1) и модифицируйте ее так, чтобы задействовать достоинства нового сервера (саг геу181гат[оп вегвег апв.ру). Это подразумевает внесение изменений в функцию гет г1ече саг Оетат!в(), чтобы в случае ввода неправильного номера автомобиля запросить у пользователя начальные символы номерного знака и предложить ему выбрать номер из полученного списка. Ниже приводится пример сеанса взаимодействия пользователя с программой с использованием новой функции (сервер уже запущен, меню немного отредактировано, чтобы уместить его по ширине книжной страницы, и ввод пользователя выделен жирным шрифтом): (С)аг (М)т1еаде (0)ипаг (М)еи саг (8)тор вегчег (0)отт [с]: Ысепве: Са 4020 (тсапве: ОА 4020 Веатв: 2 М[1еада: 97181 Оипег: Оопатлап Еупп (С)аг (М)11ааде (0)ипег (М)еи саг (8)тор вегчег (0)шт [о]: Ысепве [ОА 4020]: а Тата 1тсепве 1в пот ге91втегес Втагт от 1тсепве; а МО 1тСЕПСЕ Втатта ча1П 7 Втагт от 11свпве: а (1) А04 4НЕ (2) А37 4791 (3) АВК3035 ептег спо[са (О то сапсе1): 3 (тоапве.
ЯВК3035 Веатв; 5 Мт!ваде. 17719 Оипаг; Ашпопу Оау Упражнения 507 Для решения этого упражнения необходимо будет удалить одну строку и добавить порядка двадцати строк. Потребуется немного поломать голову, чтобы предоставить пользователю возможность выйти или продолжить на каждом этапе. Обязательно протестируйте новые функциональные возможности в разных ситуациях (отсутствие номеров, начинающихся с указанной строки; имеется всего один номер, начинающийся с указанной строки; имеется два или более номеров, начинающихся с указанной строки). Решение приводится в файле саг геу1а~га~юп апа.ру. 11 Программирование приложений баз данных Большинство разработчиков программного обеспечения под термином база данных подразумевают СУРБД (система управления реляционными базами данных).
Для хранения данных эти системы используют таблицы (по своему строению подобные электронным таблицам), строки которых соответствуют записям, а столбцы — полям. Манипулирование данными, хранящимися в этих таблицах, производится с помощью инструкций, написанных на языке ЯЯЬ (ЯФгис1игеб Янгу Ьапяцаяе — язык структурированных запросов). Язык РуФЬоп включает в себя АР1 (Арр11саФ1оп Ргоатаппп1пя 1п1егГасе — прикладной программный интерфейс) для работы с базами данных Вью и обычно распространяется с поддержкой базы данных ЯЦЬЫе 3.
Существует еще одна разновидность баз данных — ВВМ (Ра1аЬазе Мапаяег — система управления базами данных), в которой данные хранятся в виде произвольного числа элементов ключ-значение. В стандартной библиотеке РуФЬоп имеется несколько интерфейсов для работы с разными реализациями ВВМ, включая характерные для операционной системы 1)г)1Х. Базы данных ВВМ работают по принципу словарей в языке Ру$Ьоп, за исключением того, что обычно они хранятся на диске, а не в памяти, а их ключами и значениями всегда являются объекты типа Ьугез, размер которых может ограничиваться.
В первом разделе этой главы рассматривается модуль ззе1че, предоставляющий удобный интерфейс ВВМ, позволяя использовать строковые ключи и любые (поддающиеся консервированию) объекты в качестве значений, Если имеющихся в наличии баз данных ВВМ и Яь1Ь1(е окажется недостаточно, в каталоге пакетов РуФЬоп Рас)саяе 1пбех, рурьруМоп.ога/рурй можно найти множество пакетов, предназначенных для работы 509 Базы данных 0ВМ с различными базами данных, включая )звх)с)Ь 1ЗВМ («Вегйе1еу 1)В»), объектно-реляционные отображения, такие как ЯЦ1 А1с)зешу (ввв.
зд!а1с)дел«у.огд), и интерфейсы к популярным клиент/серверным базам данных, таким как ПВ2, 1п1огш)х, 1пягез, МуЯ«4Ь, 01)ВС и Ров$- йгеЯ()Ь. В этой главе мы реализуем две версии программы ведения списка фильмов на дисках ПЧ)), в котором будут храниться название фильма, год выхода, продолжительность в минутах и имя режиссера. Первая версия программы для хранения информации использует базу данных 1)ВМ (с помощью модуля зае1не), а вторая версия — базу данных ЯЙ4Ь11е.
Обе программы могут также загружать и сохранять информацию в простом формате ХМЬ, обеспечивая возможность, например, экспортировать сведения о фильмах из одной программы и импортировать их в другую. Версия, использующая базу данных ЯьдЬ, обладает немного более широкими возможностями, чем версия, использующая базу данных РВМ, и имеет более ясную организацию.