AWT2 - AD11 Lathund Python & Django Detta dokument innehåller instruktioner för hur man sätter upp en utvecklingsmiljö för python, virtuella miljöer och ett djangoprojekt, samt lite blandade tips och tricks som berör inlämningsuppgiften samt andra bra grundläggande django- tips. Slutligen följer ett kort exempel på grunderna i det senaste vad gäller setup för ett djangoprojekt på en produktionsserver. Sätta upp en utvecklingsmiljö Windows: 1. Överväg att utveckla i Linux (eller OS X), det kan vara jobbigt i början men det är helt klart värt det i längden. J 2. Installera Python (aktuell version när detta skrivs är 2.7.3): direktlänk: http://www.python.org/ftp/python/2.7.3/python- 2.7.3.msi 3. Klistra in C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\; i PATH på din dator: (Kontrollpanel- >System och säkerhet- >System, välj Avancerade systeminställningar, klicka på miljövariabler, hitta Path i den nedre listan och klicka på redigera- knappen. i början på strängen o lämna inga mellanslag efter. 4. Installera setuptools (aktuell version när detta skrivs är 0.6c11): http://pypi.python.org/packages/2.7/s/setuptools/setuptools- 0.6c11.win32- py2.7.exe 5. Installera pip: Öppna en terminal (startknapp, skriv cmd o tryck enter) och skriv: easy_install pip 6. Installera virtualenv och virtualenvwrapper- win: I en terminal, och skriv: pip install virtualenvwrapper virtualenvwrapper-win Mac & Linux: Jag förutsätter att din linux- distribution har python installerat. 1. Installera pip: Öppna en terminal och skriv: easy_install pip 2. Installera virtualenv och virtualenvwrapper- win: I en terminal, skriv: pip install virtualenvwrapper virtualenvwrapper 3. Initialisera virtualenvwrapper genom att skriva följande tre rader i terminalen: export WORKON_HOME=~/.virtualenvs mkdir -p $WORKON_HOME source /usr/local/bin/virtualenvwrapper.sh 4. Lägg till följande rad i din.bash_profile för att slutföra setupen: source /usr/local/bin/virtualenvwrapper.sh
Skapa en isolerad utvecklingsmiljö Denna instruktionen förutsätter att du har installerat virtualenvwrapper 1. Öppna en terminal och skriv: mkvirtualenv myproject Aktivera en isolerad utvecklingsmiljö Denna instruktionen förutsätter att du har installerat virtualenvwrapper 1. Öppna en terminal och skriv: workon myproject (Du kan även skriva enbart workon för att se vilka virtuella miljöer du har att välja mellan.) Installera Python Imaging Library PIL är en modul som används i de flesta typer av bildhantering (resize, thumbnails, etc) i Python. Den är käns för att kunna vara lite strulig att installera, fastnar ni så googla på felet! Windows: 1) Ladda ner och installera http://effbot.org/downloads/pil- 1.1.7.win32- py2.7.exe 2) I den virtualenv- miljö som ni vill använda med PIL så ta bort filen i Libs\ som heter no- global- site- packages Med andra ord så låter ni den virtualenv- miljön ärva de globala paketen. Detta är det enda enkla sättet vi kan använda PIL på i Windows utan att krångla med Visual Studio eller MinGW. Mac: 1) För att kunna kompilera saker på OS X så måste man ha ha Xcode installerat, eller åtminstone Command Line Tools - se översta svaret här: http://stackoverflow.com/questions/9329243/xcode- 4-4- command- line- tools - Kör du Snow Leopard eller äldre är det hela XCode som gäller, tyvärr. Dessutom måste man lägga in stöd för jpeg innan man installerar PIL om man vill kunna manipulera jpeg- bilder. Detta beskrivs här: http://gpiot.com/mac- os- x- lion- install- the- python- image- library- pil/ - Om man kör homebrew kan man köra brew install libjpeg istället. 2) pip install Pillow Linux: Förutsatt att du har build- essentials, zlib- dev och libjpeg- dev installerat i Ubuntu, eller motsvarande I andra distributioner så ska du kunna köra pip install Pillow. Du som kör debian eller ubuntu kan välja att installera ertt binärt apt- paket, python- imaging, motsvarande paket finns till andra distributioner. - - - När installationen är klar så kan ni scrolla upp några rader i terminalen och kolla följande rader: - - - TKINTER support available - - - JPEG support available - - - ZLIB (PNG/ZIP) support available *** FREETYPE2 support not available *** LITTLECMS support not available Raderna där det står JPEG och ZLIB (PNG/ZIP) ska vara "support available" om ni vill kunna manipulera jpeg och png- bilder.
Installera django 1. Se till att du har aktiverat önskad virtuell miljö med workon 2. Installera django med: pip install django Starta ett djangoprojekt 1. Se till att du har aktiverat en virtuell miljö där django är installerat 2. Gå till din projektmapp i terminalen T.ex: cd /Users/jan/projects 3. Starta ditt projekt med: django-admin.py startproject projektnamn Starta en djangoapp 1. Ta dig till mappen där du har ditt projekt 2. Skapa app med: python manage.py startapp appnamn Kör utvecklingsservern 1. Ta dig till mappen där du har ditt projekt 2. Starta servern med: python manage.py runserver
Django tips & tricks Här hittar ni främst lite generella tips, samt tips kring moment som man ofta kan fastna med och som inte finns med i kurspresentationerna, etc. Om ni har en ModelForm med ett obligatoriskt fält som ni inte vill visa i formuläret kan ni lägga till det efter att användaren har postat formuläret, enligt följande exempelsätt: if form.is_valid(): # spara formuläret i minnet med commit=false # new_ad är nu en instans av modellen Ad som bara # existerar i minnet, dvs inte i databasen. new_ad = form.save(commit=false) # populera önskat obligatoriskt fält som inte # var med i formuläret, i detta exemplet är det # den inloggade användaren new_ad.owner = request.user # spara på riktigt. new_ad är instansen av modellen # dvs new_ad.save() motsvarar form.save() med owner satt. new_ad.save() Om ni vill instantiera en ModelForm med ett befintlig modellinstans, t.ex. visa ett formulär för att redigera en befintlig annons, så måste ni skicka med en modellinstans vid formulärinstansiering, t.ex: ad = Ad.objects.get(id=ad_id) form = AdForm(instance=ad) Vid formulärpostningen måst instansen vara med också! Dvs: form = AdForm(request.POST, instance=ad) Om ni vill att användare ska kunna ladda upp filer eller bilder behöver ni tänka på följande: o Ställ in MEDIA_ROOT i settings.py till någon mapp, gärna utanför projektmappen. o När ni definierar FileField, ImageField, osv i era models så blir t.ex. models.imagefield(upload_to= profilbilder/ ) uppladdat till en underkatalog för MEDIA_ROOT o För att kunna ladda upp filer i ett formulär så måste form- taggen ha följande attribut: enctype="multipart/form-data" o För att kunna spara bilden när ni tar emot ett formulär i request.post i en view så måste ni ta med request.files för att filer ska följa med - t.ex form = MyCoolForm(request.POST, request.files) o För att kunna visa uppladdade bilder på en sida medan ni kör utvecklingsservern så behöver ni skapa en static serve för MEDIA_URL- mappen. I er urls.py lägger ni till följande längst upp: from django.conf.urls.static import static o På sista raden i samma fil så kan ni lägga till: ) + static(settings.media_url, document_root=settings.media_root) Parantesen i början är är alltså slutparantesen för url- listan. För att ställa in vilken sida django- registration ska skicka en nyregistrerad användare när man kör signup utan emailverifiering kan ni använda er av följande: ABSOLUTE_URL_OVERRIDES = { 'auth.user': lambda u: "/some/postregistration/url/", För att ändra vilken sida användaren kommer in på efter login kan ni använda följande: LOGIN_REDIRECT_URL = '/this/postlogin/page/' För att underlätta settings för flera servrar så kan man skapa en fil i samma folder som settings.py som man kallar local_settings.py och importerar längst ner i settings.py enligt
följande: try: from local_settings import * except ImportError: pass Det finns mer avancerade sätt att hantera settings för utveckling/test/produktion, detta är dock bra nog att böra med! Utnyttja django.shortcuts de är väldigt smidiga. Se dock till att förstå hur de fungerar. Mer på https://docs.djangoproject.com/en/1.4/topics/http/shortcuts/ Lägg templates för en app I en underkatalog som heter templates/appnamn/ under appens folder, t.ex. om appen heter tavlan så lägger ni dem i tavlan/templates/tavlan/ På detta sätt slipper ni speca något I TEMPLATES_DIRS Skapa en theme- app (eller liknande) som ni lägger projektets static - filer (css,js, bilder) i, i en underkatalog som heter static/theme/ under appens folder. På detta sätt slipper ni speca något I STATICFILES_DIRS. Dock måste ni då även se till att det står {{ STATIC_URL theme/ i era html- filer och eventuellt css- filer, men projektstrukturen blir ganska ren på detta sätt. Ni kan även lägga en templates- mapp i denna app (dvs i theme/templates/) som ni lägger projektrelaterade templates, såsom base.html och felsidor som 404.html, samt exempelvis templates för django- registration i en undermapp som heter registration/ Gå in på https://docs.djangoproject.com/en/1.4/ och läs igenom förteckningen på den sidan, det finns så mycket intressant funktionalitet i Django, t.ex. Aggregation för models, Cache- systemet, Internationalization, Pagination, Custom storage, Template filters, Formsets, anpassning av Admin- appen, och mycket mycket mer.
Deployment Nedan följer ett enkelt exempel på hur man kan sätta upp en djangoprojekt på en linuxserver för att ni ska ha ett hum om vilka moment som är inblandade. Exemplet förutsätter följande: Operativsystem: Ubuntu 12.04 Djangoversion: 1.4.x Virtualenv- mapp: /srv/www/mysite/env Static- mapp (STATIC_ROOT): /srv/www/mysite/static Media- folder (MEDIA_ROOT): /srv/www/mysite/media Projektmapp: /srv/www/mysite/myproject Alla nödvändiga python- paket och django- appar är installerade Vettiga brandväggsregler och andra säkerhetsåtgärder är genomförda Installera nginx och uwsgi Sudo apt- get install uwsgi nginx (Japp, det är så enkelt.) Konfigurera nginx Gå till /etc/nginx/sites- available och skapa en ny konfigurationsfil (t.ex. mysite) med följande innehåll: server { # Ställ in vilken port server ska lyssna på. listen 80; # Ställ in servernamn server_name www.mysite.se; # Låt vår STATIC_ROOT-mapp servas av nginx # på en url som mostvarar MEDIA_URL location /static { alias /srv/www/mysite/static; # Låt vår MEDIA_URL-mapp servas av nginx # på en url som mostvarar STATIC_URL location /media { alias /srv/www/mysite/media; # Allt annat som inte är media eller statiska filer # ska vidare till uwsgi och därmed django location / { # skicka vidare via uwsgi-rptokollet # (uwsgi är både ett protokoll och en application) uwsgi_pass unix:/run/uwsgi/app/cstorm/socket;
Konfigurera uwsgi Gå till /etc/uwsgi/apps- available och skapa en ny konfigurationsfil (t.ex. mysite.ini) med följande innehåll: [uwsgi] # vilken användare uwsgi ska köras som uid = uwsgi # vilken grupp uwsgi ska köras som gid = www-data # stöd för vhosts vhost = true # sökvägen till roten för virtuella miljön vi kör virtualenv = /srv/www/mysite/env # sökvägen till projektets basfolder chdir = /srv/www/mysite/myproject # sökväg till wsgi-applikationsmodulen från basfoldern # motsvarar variabeln application i filen myproject/wsgi.py module=myproject.wsgi:application # definiera settings-filen som används # motsvarar filen myproject/settings.py env: DJANGO_SETTINGS_MODULE=myproject.settings # använd python-pluginen plugins = python # det finns manga fler inställningar som jag inte beskriver här # läs docs och googla information om uwsgi för mer information! # här följer dock några exempel: enable-threads = true single-interpreter = true logdate #processes = 4 harakiri = 20 #limit-as = 128 die-on-term #memory-report chmod-socket = 660 Aktivera tjänsteinstanserna Länka nginx- configfilen från /etc/nginx/sites- available till /etc/nginx/sites- enabled samt länka uwsgi- configen från /etc/uwsgi/apps- available till /etc/uwsgi/apps- enabled. Exempel (när du står i sites-available): ln s mysite.ini../sites-enabled/mysite.ini Starta / stoppa services Kör sudo service nginx start, stop eller reload. Samma kommandon fungerar för uwsgi. Exempel: sudo service uwsgi reload Övrigt relaterat till deployment och serverar Fabric är ett väldigt trevligt verktyg för att automatisera diverse deploymentrelaterade uppgifter. Läs mer på http://fabfile.org Om ni vill ha en egen VPS (virtuell server) så är Glesys en väldigt trevlig leverantör I Sverige. Mer info på http://www.glesys.se. Andra alternative är Amazon EC2, som har ett år gratis av de flesta av deras tjänster. Det finns väldigt mycket tjänster och man kan lätt gå vilse bland alla kontrollpaneler och alternativ. Börja på http://aws.amazon.com/ec2/ och anväd Amazons documentation och Google för att lära er hur man gör.
Ett annat alternative är att köra applikationshosting, där man bara behöver bry sig om applikationen och inte server Heroku är ett populärt alternativ, börja på https://devcenter.heroku.com/articles/django