Als aanvulling op de zelfstudie over de netwerkclient laat deze zelfstudie zien hoe u een eenvoudige webserver in kunt implementeren Python. Zeker, dit is geen vervanging voor Apache of Zope. Er zijn ook robuustere manieren om webservices in Python te implementeren, met behulp van modules zoals BaseHTTPServer. Deze server gebruikt uitsluitend de socketmodule.
U zult zich herinneren dat de socketmodule de ruggengraat is van de meeste Python-webservicemodules. Net als bij de eenvoudige netwerkclient, illustreert het bouwen van een server hiermee op transparante wijze de basisprincipes van webservices in Python. BaseHTTPServer importeert zelf de socketmodule om een server te beïnvloeden.
Ter beoordeling vinden alle netwerktransacties plaats tussen clients en servers. In de meeste protocollen vragen de clients een bepaald adres en ontvangen ze gegevens.
Binnen elk adres kan een veelheid van servers draaien. De limiet zit in de hardware. Met voldoende hardware (RAM, processorsnelheid, enz.), Kan dezelfde computer dienen als een webserver, een ftp-server en
mail server (pop, smtp, imap of al het bovenstaande) allemaal tegelijkertijd. Elke service is gekoppeld aan een poort. De poort is gebonden aan een socket. De server luistert naar de bijbehorende poort en geeft informatie wanneer aanvragen op die poort worden ontvangen.Dus om een netwerkverbinding te beïnvloeden, moet u de host, de poort en de toegestane acties op die poort kennen. De meeste webservers werken op poort 80. Om echter conflicten met een geïnstalleerde Apache-server te voorkomen, werkt onze webserver op poort 8080. Om conflicten met andere services te voorkomen, is het het beste om HTTP-services op poort 80 of 8080 te houden. Dit zijn de twee meest voorkomende. Als deze worden gebruikt, moet u uiteraard een open poort vinden en gebruikers op de wijziging wijzen.
Net als bij de netwerkclient moet u er rekening mee houden dat deze adressen de algemene poortnummers zijn voor de verschillende services. Zolang de klant om de juiste service op de juiste poort op het juiste adres vraagt, zal er nog steeds communicatie plaatsvinden. Google's mailservice bijvoorbeeld, werkte aanvankelijk niet op de algemene poortnummers, maar omdat ze weten hoe ze toegang tot hun accounts kunnen krijgen, kunnen gebruikers nog steeds hun e-mail krijgen.
In tegenstelling tot de netwerkclient zijn alle variabelen in de server bedraad. Van elke service die naar verwachting constant wordt uitgevoerd, moeten de variabelen van de interne logica niet op de opdrachtregel zijn ingesteld. De enige variatie hierop zou zijn als u om een of andere reden wilde dat de service af en toe en op verschillende poortnummers werd uitgevoerd. Als dit het geval zou zijn, zou u echter nog steeds de systeemtijd kunnen bekijken en de bindingen dienovereenkomstig kunnen wijzigen.
Zoals reeds vermeld, moet de server de host kennen waaraan deze moet worden gekoppeld en de poort waarop moet worden geluisterd. Voor onze doeleinden zullen we de service überhaupt op elke hostnaam toepassen.
De poort, zoals eerder vermeld, zal 8080 zijn. Houd er dus rekening mee dat als u deze server gebruikt in combinatie met de netwerkclient, u het poortnummer moet wijzigen dat hierin wordt gebruikt programma.
Of informatie wordt opgevraagd of verstrekt, om toegang te krijgen tot de Internet, we moeten een socket maken. De syntaxis voor deze oproep is als volgt:
De eerste twee zijn duidelijk internetprotocollen. Alles wat via internet reist, is toegankelijk voor deze families. Veel netwerken draaien nog steeds niet op IPv6. Het is dus het veiligst om standaard IPv4 te gebruiken en AF_INET te gebruiken, tenzij u iets anders weet.
Veruit de meest voorkomende typen zijn SOCK_STEAM en SOCK_DGRAM omdat ze werken op de twee protocollen van de IP-suite (TCP en UDP). De laatste drie zijn veel zeldzamer en worden daarom mogelijk niet altijd ondersteund.
Nadat we de socket hebben gemaakt, moeten we de socketopties instellen. Voor elk socketobject kunt u de socketopties instellen met de methode setsockopt (). De syntaxis is als volgt:
Als we feedback willen geven aan de persoon die de server belt, kunnen we nu een afdrukopdracht invoeren om te bevestigen dat de server actief is.
Nadat we de server hebben ingesteld, moeten we dat nu weten Python wat te doen wanneer een verzoek wordt gedaan op de gegeven poort. Hiervoor verwijzen we naar het verzoek door zijn waarde en gebruiken het als het argument van een persistente while-lus.
Wanneer een verzoek wordt gedaan, moet de server het verzoek accepteren en een bestandsobject maken om ermee te communiceren.
In dit geval gebruikt de server dezelfde poort voor lezen en schrijven. Daarom krijgt de makefile-methode het argument 'rw'. De nullengte van de buffergrootte laat eenvoudig dat deel van het bestand dynamisch bepalen.
Tenzij we een server met één actie willen maken, is de volgende stap het lezen van invoer van het bestandsobject. Wanneer we dat doen, moeten we voorzichtig zijn om die input te ontdoen van overtollige witruimte.
Het verzoek heeft de vorm van een actie, gevolgd door een pagina, het protocol en de versie van het protocol dat wordt gebruikt. Als iemand een webpagina wil aanbieden, splitst men deze invoer om de gevraagde pagina op te halen en leest hij die pagina vervolgens in een variabele die vervolgens naar het socketbestandobject wordt geschreven. Een functie voor het lezen van een bestand in een woordenboek is te vinden in de blog.
Om deze tutorial een beetje illustratiever te maken van wat men met de socketmodule kan doen, zullen we dat deel van de server achterwege laten en in plaats daarvan laten zien hoe men de presentatie van gegevens kan nuanceren. Voer de volgende paar regels in de programma.
Als iemand een webpagina verzendt, is de eerste regel een leuke manier om de gegevens in een webbrowser te introduceren. Als dit wordt weggelaten, zullen de meeste webbrowsers standaard rendering gebruiken HTML. Als iemand het echter opneemt, moet 'OK' worden gevolgd door twee nieuwe lijntekens. Deze worden gebruikt om de protocolinformatie te onderscheiden van de pagina-inhoud.
De syntaxis van de eerste regel, zoals u waarschijnlijk kunt vermoeden, is het protocol, de protocolversie, het berichtnummer en de status. Als u ooit naar een webpagina bent gegaan die is verplaatst, heeft u waarschijnlijk een 404-fout ontvangen. De 200-boodschap hier is gewoon de bevestigende boodschap.
De rest van de uitvoer is gewoon een webpagina verdeeld over meerdere regels. U zult merken dat de server kan worden geprogrammeerd om gebruikersgegevens in de uitvoer te gebruiken. De laatste regel geeft het webverzoek weer zoals het door de server is ontvangen.
Tot slot moeten we als afsluitende handeling van het verzoek het bestandsobject en de server-socket sluiten.
Sla dit programma nu op onder een herkenbare naam. Nadat u het met 'python program_name.py' hebt geroepen en u een bericht hebt geprogrammeerd om te bevestigen dat de service wordt uitgevoerd, moet dit naar het scherm worden afgedrukt. De terminal lijkt dan te pauzeren. Alles is zoals het zou moeten zijn. Open uw webbrowser en ga naar localhost: 8080. U zou dan de uitvoer moeten zien van de schrijfopdrachten die we hebben gegeven. Houd er rekening mee dat ik omwille van de ruimte geen foutafhandeling in dit programma heb geïmplementeerd. Elk programma dat in het 'wild' wordt vrijgegeven, zou echter moeten.