Python from Scratch - Creëer een dynamische website

We hebben nogal wat Python behandeld in de vorige tutorials in deze sessie. Vandaag gaan we alles combineren wat we tot nu toe hebben geleerd om met Python een dynamische website te bouwen.


Liever een video-zelfstudie?

Bekijk meer videozelfstudies op YouTube.

Dus, hoe begin je met het maken van websites met Python? Nou, je zou het allemaal zelf kunnen doen, en een programma schrijven dat op een webserver draait, pagina-aanvragen accepteren en antwoorden in de vorm van HTML en andere bronnen weergeven. Dat is echter een hoop werk, dus waarom zou je alle moeite doen als er genoeg bestaande tools zijn om het werk voor je te doen? Deze tools worden frameworks genoemd en ze zijn wat we vandaag zullen gebruiken om onze website te maken.

Python Frameworks

Er zijn nogal wat Python-webkaders, maar hier zijn enkele van de beste:

  • Django - We gaan dit vandaag gebruiken. Het heeft een enorm aantal functies, maar het blijft eenvoudig in gebruik. De documentatie is ook uitstekend, dus als je vastloopt, heb je de gemakkelijkste tijd om je probleem met Django op te lossen.
  • Grok - Een ander framework met een functieset die in de buurt komt van Django. Als je besluit dat je Django niet de voorkeur geeft, is dit een goed alternatief.
  • WebPy - Een veel lichter kader. Het heeft niet zoveel functies, hoewel het Reddit gedurende een bepaalde periode heeft gebruikt!
  • TurboGears - Hoewel TurboGears voorheen bekend stond om zijn slechte documentatie, is het afgelopen jaar aanzienlijk verbeterd.

Een uitgebreidere lijst is te vinden op de website van Python als u extra opties nodig heeft. Vandaag gaan we Django klaarstomen voor ontwikkeling op een lokale computer en vervolgens een eenvoudige blog maken. We gaan ook het installatieproces op een externe webserver bekijken.


Django installeren

We zullen het grootste deel van ons werk vandaag in de Terminal uitvoeren. Dit zou allemaal op Mac en Linux moeten werken; Als u Windows gebruikt, is het proces enigszins anders. Een vertrouwdheid met de commandoregel is echter niet nodig als je alleen Python schrijft. Als je echter van plan bent Django te gebruiken of een dynamische website in het algemeen te gebruiken, is het de moeite waard om te leren.

Terminal-zelfstudies

Overweeg deze zelfstudies te bekijken om jezelf op gang te brengen met de Terminal.

  • Een intro voor het werken in de terminal, die ook Git en Github omvat.
  • 10 tips om sneller te werken in de terminal.

Hier zijn de commando's die je nodig hebt om Django te installeren. Het is niet compatibel met Python 3, dus je moet versie 2.7 of eerder installeren om het te laten draaien.

 wget http://www.djangoproject.com/download/1.3.1/tarball/ tar xzvf Django-1.3.1.tar.gz cd Django-1.3.1 python setup.py installeren

Vervolgens kunnen we optioneel de installatiebestanden verwijderen.

 cd ... rm Django-1.3.1.tar.gz

Dat zou het moeten doen! Laten we het uittesten.

 python van django import get_version get_version ()

Je zou '1.3.1' moeten zien. Als je dat doet, werkte alles en Django is op je systeem geïnstalleerd. Gefeliciteerd! We zijn klaar om te beginnen met het maken van onze site!


Bouwen aan onze blog

We gaan vandaag een blogsysteem bouwen, omdat het een uitstekende manier is om de basis te leren. Eerst moeten we een Django-project maken.

cd ~ / Documenten / Projecten django-admin.py startproject FirstBlog cd FirstBlog ls

Wat doen al deze bestanden?

  • __init__.py vertelt Python dat deze map een Python-pakket is. We leerden hierover in de derde les; Hiermee kan Python alle scripts in de map als modules importeren.
  • manage.py maakt eigenlijk geen deel uit van uw website; het is een utility-script dat je uitvoert vanaf de opdrachtregel. Het bevat een reeks functies voor het beheren van uw site.
  • settings.py bevat de instellingen van je website. Django gebruikt geen XML-bestanden voor configuratie; alles is Python. Dit bestand is gewoon een aantal variabelen die de instelling voor uw site bepalen.
  • urls.py is het bestand dat URL's toewijst aan pagina's. Het kan bijvoorbeeld in kaart brengen yourwebsite.com/about aan een Over ons pagina.

Django verwijst naar zichzelf een MTV-framework, wat staat voor Model Template View.

Apps

Geen van deze bestanden maakt echter alleen een functionele website. Daar hebben we apps voor nodig. Apps zijn de plekken waar je de code schrijft die je website laat functioneren, maar voordat we ze bekijken, moeten we iets weten over de ontwerpprincipes van Django.

Ten eerste is Django een MVC-raamwerk, dat staat voor Model View Controller. Django verwijst naar zichzelf een MTV-framework, wat staat voor Model Template View. Het is een iets andere benadering dan MVC, maar fundamenteel zijn ze vergelijkbaar. Hoe dan ook, MVC is een architecturaal patroon dat een methode biedt om je projecten te structureren. Het scheidt de code die wordt gebruikt om gegevens te verwerken uit de code die de gebruikersinterface beheert.

Django onderschrijft de filosofie DROOG, of "Do not Repeat Yourself".

Ten tweede onderschrijft Django de DROE, of Do not Repeat Yourself-filosofie, wat betekent dat je nooit code mag schrijven die een bepaalde taak meer dan eens uitvoert. Als we bijvoorbeeld in onze blog een functie hebben geschreven die een willekeurig artikel uit het archief heeft gekozen en deze functie op meerdere pagina's hebben geïmplementeerd, zouden we deze niet telkens opnieuw coderen als dit nodig was. We zouden het een keer coderen en het dan op elke pagina gebruiken.

Dus hoe verhoudt dit zich tot apps? Nou, met apps kun je je website in een DROGE stijl schrijven. Elk project, zoals het project dat we hier hebben, kan meerdere apps bevatten. Omgekeerd kan elke app deel uitmaken van meerdere projecten. Met behulp van het voorbeeld van vroeger betekent dit dat als we in de toekomst een andere site zouden maken die ook een willekeurige paginafunctie nodig had, we het niet opnieuw zouden hoeven schrijven. We kunnen de app eenvoudig vanuit dit project importeren. Daarom is het belangrijk dat elke app één specifiek doel dient. Als u alle functionaliteit van uw site in één app schrijft en vervolgens een deel later opnieuw moet gebruiken, moet u alles importeren. Als u bijvoorbeeld een eCommerce-website maakt, wilt u niet alle blogfuncties importeren. Als je echter één app maakt voor de willekeurige functie en één app voor het blogpublicatiesysteem, kun je de bits kiezen en kiezen die je nodig hebt.

Dit betekent ook dat de code binnen de site goed georganiseerd is. Als u een functie wilt wijzigen, hoeft u niet één enorm bestand te doorzoeken; u kunt in plaats daarvan naar de relevante app bladeren en deze wijzigen zonder dat u zich zorgen hoeft te maken over iets anders.

python mangage.py startapp blog cd blog ls

Nogmaals, we hebben een __init__.py bestand om er een pakket van te maken, en drie andere bestanden: modellen, tests en views. We hoeven ons voorlopig geen zorgen te maken over tests, maar de andere twee zijn belangrijk. Modellen en weergaven zijn de M en V delen van MVC.

In modellen definiëren we onze datastructuren.

Als je ooit eerder met PHP hebt gewerkt, heb je mogelijk PhpMyAdmin gebruikt om je MySQL-tabellen te maken en vervolgens heb je je SQL-query's handmatig uitgeschreven in je PHP-scripts. In Django is het veel gemakkelijker. We definiëren alle datastructuren die we nodig hebben in dit modellenbestand, voeren vervolgens een opdracht uit en alle benodigde databases worden voor ons gemaakt.

Wanneer u toegang wilt tot die gegevens, gaat u via deze modellen door de methode erop aan te roepen, in plaats van het uitvoeren van onbewerkte zoekopdrachten. Dit is erg handig, omdat Django verschillende databaseprogramma's kan gebruiken. We gaan vandaag MySQL gebruiken, omdat dit het krachtigst is en wat de meeste hosts bieden, maar als we in de toekomst naar een andere database zouden moeten overschakelen, blijft alle code geldig! Als u in andere talen naar SQLite of iets dergelijks wilt overschakelen, moet u de code overschrijven die toegang heeft tot uw database.

In het weergavenbestand schrijven we de code die de webpagina's genereert. Dit verbindt alle andere delen samen. Wanneer een gebruiker een URL invoert, wordt deze verzonden door de urls script zagen we eerder bij de keer bekeken script, dat vervolgens relevante gegevens uit de modellen haalt, verwerkt en doorgeeft aan een sjabloon, die uiteindelijk wordt gepresenteerd als de pagina die de gebruiker ziet. We zullen deze sjablonen binnenkort bekijken. Ze zijn het gemakkelijkste gedeelte - meestal HTML.

Voor een blog hebben we een tabel met berichten nodig, met verschillende velden voor de titel, hoofdtekst, auteur, de tijd waarop deze is geschreven, enzovoort. Een echte blog zou opmerkingen hebben, maar dat valt buiten de reikwijdte van de demo van vandaag.

van django.db importeren modellen class posts (models.Model): author = models.CharField (max_length = 30) title = models.CharField (max_length = 100) bodytext = models.TextField () timestamp = models.DateTimeField ()

MySQL

Deze modellen zijn slechts een beschrijving. We moeten van hen een echte database maken. Allereerst moeten we echter MySQL op ons systeem gebruiken. Op een echte webserver zou dit geen probleem zijn, omdat ze meestal vooraf geïnstalleerd zijn. Gelukkig is het met een pakketbeheerder eenvoudig te installeren. Eerst moet je Homebrew en Easy Install installeren

brouwinstallatie mysql easy_install mysql-python mysqld_safe --skip-grant-tables #let iedereen heeft volledige rechten mysql -u root UPDATE mysql.user SET Wachtwoord = PASSWORD ('nettuts') WHERE Gebruiker = "root"; #geef de gebruiker 'root' een wachtwoord FLUSH PRIVILEGES; mysql -u root -p # meld je aan met ons wachtwoord 'nettuts' CREATE DATABASE firstblog; quit python2.6 manage.py runserver

Wanneer u opnieuw opstart, zal MySQL niet actief zijn, dus elke keer dat u dit in de toekomst moet doen, start u mysqld om de server te starten. Je kunt dan rennen python2.6 manange.py-server in een nieuw tabblad om de ontwikkelserver te starten.

Deze opdracht voert de server nog niet uit, er wordt alleen een fout geretourneerd. Dat komt omdat we onze instellingen moeten configureren. Laten we eens kijken settings.py.

U moet eerst de database-instellingen wijzigen. Deze beginnen op regel twaalf.

DATABASES = 'standaard': 'ENGINE': 'django.db.backends.mysql', # Toevoegen 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' of 'oracle'. 'NAME': 'firstblog', # Of pad naar databasebestand bij gebruik van sqlite3. 'USER': 'root', # Niet gebruikt met sqlite3. 'PASSWORD': 'nettuts', # Niet gebruikt met sqlite3. 'HOST': ", # Stel in op een lege tekenreeks voor localhost. Niet gebruikt met sqlite3. 'PORT':", # Stel in op lege tekenreeks voor standaard. Niet gebruikt met sqlite3. 

Als u de server opnieuw probeert uit te voeren, zou het moeten werken, op voorwaarde dat u MySQL succesvol hebt geïnstalleerd. Als je bezoekt 127.0.0.1:8000 in je webbrowser zou je de standaard Django-pagina moeten zien.

Laten we nu onze Django-site in een blog veranderen. Ten eerste moeten we onze modellen gebruiken om tabellen in de database te maken door de volgende opdracht uit te voeren:

python2.6 manage.py syncdb

Telkens wanneer u uw modellen wijzigt, moet u deze opdracht uitvoeren om de database bij te werken. Merk op dat dit bestaande velden niet kan veranderen; het mag alleen nieuwe toevoegen. Dus als u velden wilt verwijderen, moet u dat handmatig doen met iets als PhpMyAdmin. Omdat dit de eerste keer is dat we de opdracht uitvoeren, zal Django alle standaard ingebouwde tabellen instellen voor zaken als het beheersysteem. Typ gewoon 'ja' en vul vervolgens uw gegevens in.

Laten we nu de urls.py het dossier. Maak een commentaar op de eerste regel in het gedeelte met voorbeelden en wijzig deze in zeg url (r '^ $', 'FirstBlog.blog.views.home', name = "home") .

Laten we nu het weergavenbestand maken om op deze verzoeken te reageren.

van django.shortcuts import render_to_response van blog.models importeer berichten def home (request): return render_to_response ('index.html')

templates

Deze index.html bestand bestaat nog niet, dus laten we het maken. Maak een map, sjablonen genoemd in de blog app en sla een bestand erin op genaamd index.html, die voor nu gewoon "Hello World" kan bevatten. Vervolgens moeten we het instellingenbestand bewerken zodat Django weet waar deze sjabloon zich bevindt.

Regel 105 is waar het gedeelte voor het declareren van sjabloonmappen begint; dus pas het aan, zoals:

TEMPLATE_DIRS = ("blog / sjablonen", # Plaats hier strings, zoals "/ home / html / django_templates" of "C: / www / django / templates". # Gebruik altijd doorgaande schuine strepen, ook in Windows. # Vergeet niet om absolute paden te gebruiken, niet relatieve paden.)

Als u de server opnieuw uitvoert en de pagina in uw browser vernieuwt, wordt het bericht 'Hallo wereld' weergegeven. We kunnen nu beginnen met het opmaken van ons blog. We zullen HTML HTML toevoegen voor de startpagina.

      Eerste blog   

Eerste blog

Titel

Geplaatst op datum van auteur

Lichaamstaal

Als u de pagina opslaat en vernieuwt, zou u moeten zien dat de pagina is bijgewerkt met deze nieuwe inhoud. De volgende stap is om dynamische inhoud uit de database toe te voegen. Om dit te bereiken, heeft Django een sjablonerende taal waarmee je variabelen kunt insluiten met accolades. Verander het middelste gedeelte van uw pagina om er als volgt uit te zien:

Eerste blog

title

Geplaatst op date door author

body

We kunnen dan waarden doorgeven aan deze variabele tijdelijke aanduidingen van de views.py bestand door een waardenwoordenboek te maken.

van django.shortcuts import render_to_response van blog.models importeer berichten def home (request): content = 'title': 'My First Post', 'auteur': 'Giles', 'date': '18 september 2011', ' lichaam ':' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam cursus tempus dui, ut vulputate nisl eleifend eget. Aenean justo felis, dapibus quis vulputate at, porta et dolor. Praesent enim libero, malesuada nec vestibulum vitae, fermentum nec ligula. Etiam eget convallis turpis. Donec non sem justo. ', Return render_to_response (' index.html ', inhoud)

Opslaan en vernieuwen, en u zou moeten zien dat u nu content doorgeeft aan een sjabloon vanuit uw weergavebestand. De laatste stap is om gegevens uit onze database te halen en in plaats daarvan door te geven. Gelukkig kunnen we dit allemaal doen zonder SQL-query's, met behulp van Django's modellen. We moeten onze toevoegen blog app op onze FirstBlog project door een andere instelling te veranderen. Ga naar INSTALLED_APPS op regel 112 en voeg de

'FirstBlog.blog',

naar de lijst.

Dan veranderen views.py dus het voegt gegevens uit de database toe.

van django.shortcuts import render_to_response van blog.models importeer berichten def home (request): entries = posts.objects.all () [: 10] return render_to_response ('index.html', 'berichten': entries)

Werk vervolgens de sjabloon bij om toegang tot deze gegevens te krijgen.

Eerste blog


% voor plaatsen in berichten%

post.title

Geplaatst op post.timestamp door post.author

post.bodytext


% endfor%

Hier hebben we toegang tot alle gegevens in onze tabel in de views.py bestand en selecteer vervolgens alleen de eerste tien items. We geven deze gegevens door aan de sjabloon, doorlopen de gegevens en geven de gegevens weer met de HTML van onze site. Dit zal nog niet werken, omdat er niets in de database zit. Stop de server en voer uit:

python2.6 manage.py syncdb

Hiermee wordt de nieuwe tabel voor onze berichten aan de database toegevoegd. Open vervolgens een nieuw tabblad en typ het volgende:

mysql -u root -p

... typ uw wachtwoord, druk op enter en voer uit:

INSERT IN blog_posts (auteur, titel, bodytext) waarden ('Bob', 'Hello World', 'Lorem Ipsum');

Keer terug naar het vorige tabblad en voer de server opnieuw uit. Ververs de pagina en je zou een blogpost moeten zien met de dummy-inhoud die je zojuist hebt toegevoegd. Als u de opdracht MySQL nog een paar keer uitvoert, ziet u dat er meer berichten op de pagina verschijnen wanneer u deze vernieuwt.

Het beheerssysteem van Django

Het laatste dat we vandaag moeten doen, is Django's administratiesysteem herzien. Dit is een erg krachtige functie van Django waarmee je je site kunt beheren zonder nog meer code te hoeven schrijven, zoals je zou moeten doen als je een nieuwe site zou maken. Om dit in te schakelen, moeten we enkele instellingen wijzigen. Ten eerste, uncomment lijnen 4, 5, 13 en 16 binnen urls.py, zodat je daadwerkelijk toegang hebt tot de admin-pagina. Ga vervolgens naar de INSTALLED_APPS gedeelte van settings.py en uncomment 'Django.contrib.admin', en 'Django.contrib.admindocs',. Om de beheerder uw controle te laten hebben posts tabel, maak een nieuw bestand met de naam admin.py in de blog map en voeg de volgende regels toe:

van django.contrib importeer admin van blog.models importeer berichten admin.site.register (berichten)

Rennen python2.6 manage.py syncdb om de tabellen voor de beheerderssectie opnieuw toe te voegen en de server opnieuw te starten.

Als je bezoekt 127.0.0.1:8000/admin nu in je browser zou je een inlogpagina moeten zien. Gebruik de gegevens die u eerder hebt gekozen toen u de syncdb commando om in te loggen. Je zou een sectie moeten zien, genaamd Blog, met een ondertitel voor de posts tafel. U kunt dit gebruiken om blogposts te maken, te bewerken en te verwijderen met een eenvoudige interface.

Dat is alles wat er te doen is. U hebt zojuist een volledig functionerende, zij het eenvoudige, blog gemaakt. Om deze les af te sluiten, gaan we kijken naar de installatie van Django op een webserver.


Installeren op een webserver

Er zijn twee soorten webhosting en welke je gebruikt, heeft invloed op de vraag of je Django kunt gebruiken. Als u shared hosting heeft, bent u volledig overgeleverd aan de genade van uw gastheer.

Veel goedkope webhosts ondersteunen geen Python. Hoewel PHP bijna is gegarandeerd, is ondersteuning voor andere talen vaak niet. U moet het configuratiescherm controleren om te bepalen of Python (en Django) beschikbaar zijn. Het is duidelijk dat het proces bij elke host enigszins anders is. Bijna alle hosting draait op Apache, en we kunnen het gebruiken om Django te hosten, met behulp van de mod_wsgi of mod_python Apache-modules.

De meeste webhosts voeren scripts uit in verschillende talen met behulp van CGI. Django kan op FastCGI draaien, en ook, theoretisch, op CGI, maar dit wordt niet officieel ondersteund en zou veel te traag zijn voor een echte productiewebsite. U moet controleren of deze zijn geïnstalleerd. Ze worden meestal gevonden onder een kop, zoals 'CGI en ondersteuning voor scripttaal'..

Als je VPS-hosting hebt of als je het geluk hebt een dedicated server te hebben, is je leven een stuk eenvoudiger. Meestal worden deze geleverd met Python vooraf geïnstalleerd en vanaf daar hoef je alleen dezelfde stappen te volgen die we hebben doorlopen om een ​​lokale kopie van Django te krijgen. Als je geen Python hebt, kun je het installeren met een pakketbeheerder. Je systeem kan zelfs komen met Django.

ssh [email protected] wget http://www.djangoproject.com/download/1.3.1/tarball/ tar xzvf Django-1.3.1.tar.gz cd Django-1.3.1 python setup.py installeren

Nadat u Django op uw server hebt geïnstalleerd, uploadt u de site die u zojuist hebt gemaakt met behulp van een client voor bestandsoverdracht. U kunt de bestanden overal plaatsen, maar ze buiten de openbaar map of iemand kan de broncode van uw site zien. ik gebruik /huis voor al mijn projecten.

Maak vervolgens een MySQL-database, genaamd 'firstblog' op uw server en voer deze uit syncdb nog een keer. U moet uw account opnieuw maken voor het configuratiescherm voor beheerders, maar dit is eenmalig.

Als u dit probeert uit te voeren, ontvangt u mogelijk een foutmelding en dat komt omdat de instellingen voor de server verschillen van die op uw lokale computer. Mogelijk moet u het databasewachtwoord hierbinnen wijzigen settings.py, maar afhankelijk van uw serverconfiguratie, kunt u ook andere problemen tegenkomen. Google is uw vriend in deze situaties!

Om de server deze keer te laten werken, is de opdracht enigszins anders. U moet een IP-adres en poort opgeven zodat u via internet toegang hebt tot de site.

python manage.py run server 0.0.0.0:8000

Als u uw site in een webbrowser bezoekt, op poort 8000, zou u uw site moeten zien!


Conclusie

Dat is het voor deze les ... en onze serie. Ik hoop dat je in de afgelopen vijf lessen een aantal nuttige vaardigheden hebt geleerd en dat je er klaar voor bent om in de toekomst nog meer Python te leren. Als je het uiterlijk van Django leuk vindt en je kennis van het framework wilt blijven vergroten, volgen hier een paar extra tutorials over het onderwerp.

  • Duiken in Django
  • Een takenlijst maken
  • 10 nuttige Django-tips

Zoals altijd, ben ik blij om eventuele vragen over deze tutorial of Python in het algemeen te bespreken in de comments. Bedankt voor het lezen.

Leer Python

Leer Python met onze complete python-handleiding, of je nu net begint of dat je een ervaren coder bent die op zoek is naar nieuwe vaardigheden.