Като допълнение към урока за мрежовия клиент, този урок показва как да внедрите прост уеб сървър в Питон. За да сте сигурни, това не замества Apache или Zope. Има и по-здрави начини за реализиране на уеб услуги в Python, като се използват модули като BaseHTTPServer. Този сървър използва изключително модула на сокета.
Ще припомните, че сокетният модул е основата на повечето модули за уеб услуги Python. Както при обикновения мрежов клиент, изграждането на сървър с него илюстрира основите на уеб услугите в Python прозрачно. Самият BaseHTTPServer импортира модула на сокета, за да засегне сървър.
Като преглед, всички мрежови транзакции се случват между клиенти и сървъри. В повечето протоколи клиентите питат определен адрес и получават данни.
В рамките на всеки адрес може да работи множество сървъри. Ограничението е в хардуера. С достатъчен хардуер (RAM, скорост на процесора и т.н.) един и същ компютър може да служи като уеб сървър, ftp сървър и пощенски сървър (pop, smtp, imap или всичко по-горе) всички едновременно. Всяка услуга е свързана с порт. Портът е свързан към гнездо. Сървърът слуша асоциирания му порт и дава информация, когато са получени заявки на този порт.
Така че за да повлияете на мрежовата връзка, трябва да знаете хоста, порта и действията, разрешени на този порт. Повечето уеб сървъри работят на порт 80. Въпреки това, за да се избегне конфликт с инсталиран Apache сървър, нашият уеб сървър ще работи на порт 8080. За да се избегне конфликт с други услуги, най-добре е HTTP услугите да се съхраняват на порт 80 или 8080. Това са двете най-често срещани. Очевидно е, че ако те се използват, трябва да намерите отворен порт и да предупредите потребителите за промяната.
Както при мрежовия клиент, трябва да обърнете внимание, че тези адреси са общи номера на портове за различните услуги. Докато клиентът поиска правилната услуга на правилния порт на правилния адрес, комуникацията пак ще се осъществи. на Google например пощенската услуга първоначално не се изпълняваше на общите номера на портове, но тъй като те знаят как да получат достъп до своите акаунти, потребителите все още могат да получат пощата си.
За разлика от мрежовия клиент, всички променливи в сървъра са проводници. Всяка услуга, която се очаква да работи постоянно, не трябва да има променливите на своята вътрешна логика, зададени в командния ред. Единствената промяна в това би била, ако по някаква причина искате услугата да се изпълнява от време на време и на различни номера на порта. Ако това беше така, все пак ще можете да наблюдавате системното време и съответно да променяте връзките.
Както вече споменахме, сървърът трябва да знае хоста, към който трябва да бъде свързан, и порта, на който да слуша. За нашите цели услугата ще се прилага изобщо за всяко име на хост.
Пристанището, както бе споменато по-рано, ще бъде 8080. Затова имайте предвид, че ако използвате този сървър съвместно с мрежовия клиент, ще трябва да промените номера на порта, използван в този програма.
Дали да поискате информация или да я обслужвате, за да получите достъп до интернет, трябва да създадем гнездо. Синтаксисът за това обаждане е както следва:
Първите двама очевидно са интернет протоколи. Всичко, което пътува по интернет, може да бъде достъпно в тези семейства. Много мрежи все още не работят на IPv6. Така че, освен ако не знаете друго, най-безопасно е по подразбиране IPv4 и да използвате AF_INET.
Досега най-често срещаните типове са SOCK_STEAM и SOCK_DGRAM, тъй като те функционират върху двата протокола на IP пакета (TCP и UDP). Последните три са много по-редки и затова не винаги могат да бъдат подкрепени.
След създаването на гнездото трябва да зададем опциите на гнездото. За всеки обект на сокет можете да зададете опциите на сокета, като използвате метода setockopt (). Синтаксисът е следният:
Ако искаме да дадем обратна връзка на човека, който се обажда на сървъра, сега можем да въведем команда за печат, за да потвърдим, че сървърът е работещ и работи.
След като настроихме сървъра, сега трябва да кажем Питон какво да направите, когато е направена заявка на дадения порт. За това ние препращаме заявката по нейната стойност и я използваме като аргумент за постоянен цикъл.
Когато е направена заявка, сървърът трябва да приеме заявката и да създаде файлов обект, за да взаимодейства с нея.
В този случай сървърът използва същия порт за четене и писане. Следователно методът makefile получава аргумент 'rw'. Нулевата дължина на размера на буфера просто оставя тази част от файла да се определя динамично.
Освен ако не искаме да създадем сървър с едно действие, следващата стъпка е да прочетем входните данни от файла обект. Когато правим това, трябва да внимаваме да премахнем този вход на излишното бяло пространство.
Заявката ще бъде под формата на действие, последвано от страница, протокол и версия на протокола, който се използва. Ако човек иска да обслужва уеб страница, той разделя този вход, за да извлече исканата страница и след това чете тази страница в променлива, която след това се записва в обекта на сокетния файл. В блога може да се намери функция за четене на файл в речник.
За да направим този урок малко по-илюстративен какво може да се направи с модула на сокета, ние ще се откажем от тази част от сървъра и вместо това ще покажем как може да се нюансира представянето на данни. Въведете следващите няколко реда в програма.
Ако човек изпраща уеб страница, първият ред е приятен начин за въвеждане на данните в уеб браузър. Ако то бъде изоставено, повечето уеб браузъри ще бъдат по подразбиране за изобразяване HTML. Ако обаче го включите, трябва да бъде последвано от „ОК“ две нови символи на линия Те се използват за разграничаване на информацията за протокола от съдържанието на страницата.
Синтаксисът на първия ред, както може би предполагате, е протокол, версия на протокола, номер на съобщението и състояние. Ако някога сте ходили на преместена уеб страница, вероятно сте получили грешка 404. Съобщението от 200 тук е просто утвърдителното съобщение.
Останалата част от продукцията е просто уеб страница, разбита на няколко реда. Ще отбележите, че сървърът може да бъде програмиран да използва потребителски данни в изхода. Последният ред отразява заявката в мрежата, тъй като е получена от сървъра.
И накрая, като действия за затваряне на заявката, трябва да затворим файловия обект и сървърния сокет.
Сега запазете тази програма под разпознаваемо име. След като го извикате с „python program_name.py“, ако сте програмирали съобщение за потвърждаване на услугата като работещо, това трябва да се отпечата на екрана. След това изглежда, че терминалът ще спре. Всичко е както трябва да бъде. Отворете вашия уеб браузър и отидете на localhost: 8080. След това трябва да видите изхода на командите за писане, които дадохме. Моля, обърнете внимание, че в името на пространството не приложих обработка на грешки в тази програма. Всяка програма, пусната в „дивата“ трябва.