Beginnen met Python op je hostingpakket!

Vanaf het Plus-pakket is het nu mogelijk om een Python-applicatie op je hostingpakket te draaien. Het opzetten van zo’n webapplicatie heeft iets meer voorbereiding nodig dan bijvoorbeeld het uploaden van een PHP-website. Wil je beginnen met Python, dan leggen we je graag stap voor stap uit hoe je dit het beste aanpakt.

Beginnen met Python op je hostingpakket!

Basisbenodigdheden

Python-ondersteuning is bij Antagonist beschikbaar vanaf het Plus-pakket. Kun je de Python-selector in het DirectAdmin-menu niet vinden, bekijk dan in Mijn Antagonist welk hostingpakket je hebt. Je kunt dat zien op de productpagina. Voor het installeren en testen van de Python-applicatie is het ook handig dat je weet hoe je een SSH-verbinding met je pakket kunt maken.

Belangrijke kanttekeningen

  • Met deze uitleg zet je direct op productie een applicatie op. Volg het alleen als je op jouw domein geen belangrijke website hebt draaien. Er bestaat een risico bestaat dat je de bestaande website beschadigt.
  • Deze uitleg is puur geschikt voor een testproject. Zorg dat je een nieuwe productiewebsite eerst lokaal of op een testomgeving bouwt.
  • Vul geen belangrijke (klant)informatie in deze testapplicatie in, voordat je begrijpt hoe de beveiliging van Django werkt.

Python-applicatie aanmaken

Het toevoegen van een Python-applicatie begint in DirectAdmin. Ga in het menu naar Extra functies → Python Selector en klik op ‘Create application’ om met een nieuwe applicatie te beginnen.

De Python-selector in DirectAdmin.

Er verschijnen nu een aantal velden. Het ene veld is intuïtiever dan het andere, daarom licht ik ze graag elk even toe.

Instellingen in de Python-selector.
  • Python version | Geeft aan onder welke Python-versie je omgeving wordt aangemaakt. Python 2.7 is sterk verouderd, dus ik zou adviseren om hier Python 3.7 te selecteren.
  • Application root | Bepaalt in welke map je project komt te staan. Deze waarde is vaak de projectnaam van je applicatie. Gebruik hier geen submap om problemen met pip-pakketten installeren te voorkomen. Wil je een subpad gebruiken, stel dit dan in bij ‘Application URL’.
  • Application URL | Dit is standaard de URL van je website met de ‘application root’ als pad (voorbeeld.nl/demo). Je kunt ook het project op de URL draaien zonder pad. Vul dan gewoon je domein in (voorbeeld.nl).
  • Application startup file | Dit is het aanknopingspunt voor onze server om te kunnen bepalen hoe jouw webapplicatie wordt geserveerd. Laat je dit veld leeg bij het voor de eerste keer opslaan, dan wordt er standaard een passenger_wsgi.py-bestand aangemaakt en gelinkt. Als je een Django-applicatie aanmaakt of uploadt, dan wil je deze waarde achteraf aanpassen naar de bijbehorende wsgi.py. Dit volgt later in deze uitleg.
  • Application Entry point | De ondertekst bij dit veld doet vermoeden dat dit de plek is waar je linkt naar de wsgi.py van je applicatie, maar dit werkt niet als zodanig. Laat dit veld leeg, zodat hier de standaardwaarde ‘application’ wordt ingevuld.
  • Passenger log file | Vul hier eventueel een bestandsnaam in waar de standaard passenger_wsgi naar kan loggen. Mocht je zelf een applicatie uploaden, bijvoorbeeld op basis van Django, zorg dan dat je zelf logging instelt. Het komt dan niet in dit bestand terecht.

Nieuwe Python-applicatie gebruiken

Als je alle instellingen naar wens hebt ingevoerd, dan klik je op ‘Create’. Na het opslaan van de nieuwe configuratie, zie je dan hoe je via SSH je virtualenv activeert en naar je projectmap navigeert.

Python-selector: virtualenv activeren en naar je projectmap navigeren.

Let op dat de inhoud van je project dus niet in public_html-map staat, maar in:

/home/<gebruikersnaam>/<projectnaam>

Dit is ook de locatie waar je wijzigingen in de applicatie naar wilt uploaden met SFTP of SCP. In de public_html-map heb je ook een map met een vergelijkbare naam, maar hierin staat enkel een .htaccess-bestand. Die zorgt ervoor dat de server jouw applicatie kan vinden.

Virtualenv

Je virtualenv is een hulpmiddel om alle benodigde pip-pakketten (en de versie van Python) in de context van een specifieke applicatie in te stellen. Mocht je op je website meerdere applicaties willen draaien, dan houdt de virtualenv de context gescheiden. Zo hoef je je niet druk te maken als verschillende apps verschillende versies van Python of van pakketten nodig hebben – dit blijft netjes gescheiden.

Django installeren

Hoewel er alternatieve opties zijn om met je eigen webapplicatie verder te gaan (from scratch, met Flask of Web2py), ga ik voor deze demo-applicatie uit van Django. Nadat je via SSH je virtualenv hebt geactiveerd, kun je eenvoudig starten met Django door met pip de benodigde pakketten te installeren.

pip install --upgrade pip
pip install django mysqlclient

Vervolgens initialiseer je je project in de huidige map met django-admin.

django-admin startproject demo .

Configuratie

Een paar aanpassingen in het settings.py-bestand helpen je op weg met de databaseverbinding en de logging. Merk op dat een wijziging in settings.py pas na een herstart van de applicatie actief wordt. De applicatie herstarten, kan in de Python-selector. Voeg nu de website-URL toe aan ALLOWED_HOSTS:

ALLOWED_HOSTS = ['example.com']

Vervang het blok DATABASES met onderstaande code. Vul je eigen MySQL-gegevens in tussen de quotes.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': '<database_naam>',
        'USER': '<database_gebruiker>',
        'PASSWORD': '<database_wachtwoord>',
        'HOST': 'localhost',   
        'PORT': '3306',
    }
}

Enkel met Django experimenteren?
Laat dan de standaardinstellingen staan. De gegevens worden dan in een SQLite-database opgeslagen (db.sqlite3). Zo hoef je de applicatie niet aan te sluiten op één van je MySQL-databases.

Om eventuele fouten in de applicatie op te sporen, voeg je het volgende blok code toe. Vervang ‘filename’ door je eigen locatie.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/home/<gebruikersnaam>/django.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}

Zorg als laatste stap in de Python-selector in DirectAdmin dat de instellingen naar de juiste wsgi.py verwijzen. In plaats van ‘passenger_wsgi.py’ wordt de waarde bij bij ‘Application startup file’ in ons voorbeeld dan ‘demo/wsgi.py’.

Testen en vervolg

Als alles goed is gelukt, dan zie je nu de onderstaande beginpagina als je jouw domein bezoekt. Voor meer informatie over het installeren en uitbreiden van een Django-applicatie kun je de officiële tutorial van het Django-project volgen.

De beginpagina van een Django-applicatie.

Mogelijke foutmeldingen en oplossingen

Loop je vast bij de aanmaken van je Python-applicatie, bekijk dan eerst deze veelvoorkomende foutmeldingen en oplossingen daarvoor.

Can’t acquire lock for app: <applicatienaam>

Het kan gebeuren dat in DirectAdmin de pagina herladen of gesloten wordt tijdens het uitvoeren van een commando of wijziging in de Python-selector. Er kan dan er een lockfile achterblijven, het bestand dat DirectAdmin normaal gesproken gebruikt om te voorkomen dat er twee acties door elkaar lopen. Wacht een paar minuten en als je zeker weet dat er geen acties meer lopen, dan kun je de lockfile via SSH verwijderen. Deze is te vinden in:

virtualenv/<applicatienaam>/.lock

500 Internal Server Error

Zie je geen beginpagina, maar een foutpagina? Kijk dan in de django.log of start de server handmatig in SSH om te zien waar de fout zit.

python ./manage.py runserver

403 forbidden / 404 not found

Waarschijnlijk klopt de URL die je hebt gebruikt niet met de instellingen op de pagina van de Python-selector. Controleer of die instellingen overeenkomen met het voorbeeld en of je de wsgi.py uit je Django-project goed hebt ingesteld onder ‘Application startup file’.

P.S. Blijf op de hoogte en volg ons via Facebook, Twitter, Instagram, e-mail en RSS. Heb je vragen, tips of opmerkingen? Laat het achter als reactie. Vond je het artikel nuttig? Deel het dan met anderen!

Deel App Tweet Mail Deel

10 thoughts on “Beginnen met Python op je hostingpakket!

  1. Sebastiaan op zei:

    Geweldig nieuws! Ik zat al een tijd te zoeken naar een nieuwe host omdat ik steeds meer met Python doe, maar eigenlijk wou ik helemaal niet weg bij Antagonist. Fijn dat ik nu het beste van beide werelden kan gebruiken!

  2. Robert Loeber op zei:

    Hoi jonathan, complimenten voor deze uitbreiding. Ik was zelf al plm 2 maanden geleden aan de slag gegaan en had een django app draaiend gekregen die ik als api gebruik. Op 18 juni exact werkte hij niet meer, wat jullie ongetwijfeld via mijn mail aan de helpdesk te weten zijn gekomen.

    Omdat verder niets lukte heb ik de hele app maar verwijderd en ben opnieuw begonnen. Toen ook dat een fout bleef geven heb ik slaafs je voorbeeld gevolgd en een demo app gemaakt zoals beschreven. Waar ik nu achter ben is het volgende: je kan de app niet in een folder op een niveau dieper installeren, zoals ik aanvankelijk gedaan had, en wat toen werkte. Het zat bij mij in : naam1/naam2/ in de virtual env. Waarschijnlijk worden zodoende paden niet gevonden. Ik heb alles nu direct in de hoofdfolder gezet, en via de url toch weer het path op naam1/naam2/ kunnen zetten. Ik heb nu gelukkig weer een django die reageert. Nu nog alles verder werkend krijgen. Ook gaat er bij het installeren van de mysql client nog iets fout, wat een algemeen probleem is: eerst moet pip geupdated worden van vs 9 naar vs 20. Dat kan via pip install –upgrade pip. Wellicht handig om dit in de tutorial te vermelden.
    Groeten, Robert

    • Bedankt voor de nuttige feedback, Robert! We hebben op basis daarvan een aantal aanpassingen aan het artikel doorgevoerd.

  3. Stefan op zei:

    Verrassend en tegelijkertijd geweldig nieuws !

    Vorig jaar al de vraag neergelegd bij Antagonist of er de mogelijkheid bestond om Python te draaien ….. ben erg blij dat hiernaar geluisterd is (zal vast niet de enige zijn geweest) en er nu ook de mogelijkheid bestaat om dit te gebruiken.

    Zelf gebruik ik al een aantal jaar web2py. Zou mooi zijn als ook hiervoor een korte instructie komt hoe dit in te richten.

    Goed gedaan

    • Bedankt voor je feedback, Stefan. Tof dat je er wat aan hebt! Het uitrollen van een Python-applicatie kan bij ons meestal, zoals je het ook gewend bent van andere platforms. De wens voor een Web2py-handleiding staat in ieder geval genoteerd. Mocht je daar trouwens erg thuis in zijn en vind je het leuk om er de basis voor aan te leveren, dan kan zo’n handleiding ook gezamenlijk tot stand komen. Deze info is verder wellicht nuttig voor nu: http://web2py.com/books/default/chapter/29/13/deployment-recipes#anyserver-py

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *