Dag 3: Python & Django

27
Dag 3: Python & Django

Transcript of Dag 3: Python & Django

Page 1: Dag 3: Python & Django

Dag 3: Python & Django

Page 2: Dag 3: Python & Django

Python• Skapat av Guido van Rossum, 1989

• Drivs vidare av ett gäng frivilliga världen över…men han är BDFL

• Klassisk programmering, likt många andra språk

• Fokus på läsbarhet: “Code is read much more often than it is written”

Page 3: Dag 3: Python & Django

from time import localtime

activities = { 8: 'Sleeping', 9: 'Commuting', 17: 'Working', 18: 'Commuting', 20: 'Eating', 22: 'Resting',}time_now = localtime()hour = time_now.tm_hour

for activity_time in sorted(activities.keys()): if hour < activity_time: print activities[activity_time] break

Page 4: Dag 3: Python & Django

Hur lär man ut Python?

• Det flesta guider är listor med saker…

• Istället: Börja med ett enkelt program som fungerar

• … steg för steg göra det bättre genom att lägga till delar av Python

• Jag tänkte göra tutorialen, och sen får ni göra samma tutorial själva

Page 5: Dag 3: Python & Django

Programmet!• Du har precis startat företag som säljer

robotar som du byggt hemma. Du har räknat ut hur mycket du måste sälja dem för för att gå med vinst, nu saknas bara att summera priset för alla varor och lägga på momsen. Skriv ett program för detta.

• En kund vill köpa: Två robotar (900 kr/st), en instruktionsbok (100 kr/st).

• När du räknar ut det, kom ihåg att böcker har 6% moms, inte 25%.

Page 6: Dag 3: Python & Django

Dag 3: Django

Page 7: Dag 3: Python & Django

Hur fungerar webben?

Webbläsaren Webbservern

http://www…

HTTP

HTML

CSS & img

Django

Page 8: Dag 3: Python & Django

HTTPGET / HTTP/1.1Host: www.tjejerkodar.seUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:40.0) Gecko/20100101 Firefox/40.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: sv,en-GB;q=0.7,en;q=0.3Accept-Encoding: gzip, deflateCookie: SS_MID=9ac92c50-0aac-4dd1-b0af-6bd062cc8823i91ekghb; JSESSIONID=ngvU6ki8L7ma35Gt71e4AeTCcnkQ_ra5vKprymmct33pvqGECLveKw; crumb=515ed0683bConnection: keep-aliveIf-None-Match: W/"325f2ce48960ffbbaa02bf1d0abc65b4"Cache-Control: max-age=0

Page 9: Dag 3: Python & Django

YAY HTML!

HTTPStatus: HTTP/1.1 200 OK Accept-Ranges: bytesContent-Encoding: gzipContent-Length: 13479Content-Type: text/html; charset=UTF-8Date: Mon, 03 Aug 2015 15:41:48 GMTEtag: W/"325f2ce48960ffbbaa02bf1d0abc65b4"Expires: Thu, 01 Jan 1970 00:00:00 GMTSet-Cookie: JSESSIONID=ngvU6ki8L7ma35Gt71e4AeTCcnkQ_ra5vKprymmc t33pvqGECLveKw;Path=/;HttpOnlyX-ContextId: zBj97Vfr/KBT2mMQJX-PC-AppVer: 5012X-PC-Date: Fri, 31 Jul 2015 20:19:13 GMTX-PC-Hit: trueX-PC-Host: 10.100.101.110X-PC-Key: mk74xd4S_sldYFnGNXEiyVK7wBg-hanna-pettersson-a5eqX-ServedBy: ny1-prod6-web027X-Via: 1.1 ny1-prod-echo011

<!doctype html><html> …

Page 10: Dag 3: Python & Django

Django• Finns på Github:

https://github.com/django/django/

• 21065 commits av 947 personer

• Ett webbramverk - färdig pythonkod för att göra vanliga saker man behöver för att bygga en webbplats

• Skapat av Simon, Jacob och Adrian, tre utvecklare från en lokaltidning i Lawrence, Kansas

Page 11: Dag 3: Python & Django

Grundkoncept

• Projekt

• URL:er

• Views

• Templates

• Modeller

Page 12: Dag 3: Python & Django

URL:er

• http://example.com/quiz/klassiker/ <- bara delen efter domänen

• Ett sätt: Göra en lista på alla URL:er för vår sajt?

• Bättre: Sätta upp mönster för URL:erna

• quiz/<nånting>/

Page 13: Dag 3: Python & Django

Regular expressions!

• https://regex101.com/#python

• urlpatterns = [ ^quiz/[a-z-]+/$ ^quiz/[a-z-]+/question/[0-9]+/$ ^quiz/[a-z-]+/completed/$]

Page 14: Dag 3: Python & Django

Views

• Tar emot en request

• Svarar med en response

Page 15: Dag 3: Python & Django

views.py

from django.http import HttpResponse

def startpage(request): return HttpResponse(u"Du är just nu på startsidan")

def quiz(request): return HttpResponse(u"Du är just nu på quizsidan")

def question(request): return HttpResponse(u"Du är just nu på frågesidan")

def completed(request): return HttpResponse(u"Du är just nu på klarsidan")

Page 16: Dag 3: Python & Django

urls.py

urlpatterns = [url(r"^$", views.startpage),url(r"^quiz/[a-z-]+/$", views.quiz),url(r"^quiz/[a-z-]+/question/[0-9]/$", views.question),url(r"^quiz/[a-z-]+/completed/$", views.completed),

]

Page 17: Dag 3: Python & Django

http://example.com/quiz/klassiker/

quiz/klassiker/

url(r"^quiz/[a-z-]+/$", views.quiz)

def quiz(request): return HttpResponse(u"Du är just nu på quizsidan")

Du är just nu på quizsidan

urls.py

views.p

y

Page 18: Dag 3: Python & Django

Men VILKEN quiz?

url(r”^quiz/([a-z-]+)/$”, views.quiz)

from django.http import HttpResponse

def quiz(request, slug): return HttpResponse(u"Du är på " + slug + "sidan"

Page 19: Dag 3: Python & Django

http://example.com/quiz/klassiker/

quiz/klassiker/

url(r”^quiz/([a-z-]+)/$”, views.quiz)

def quiz(request, slug): return HttpResponse(u"Du är på ” + slug + ”sidan")

Du är just nu på klassikersidan

Page 20: Dag 3: Python & Django

Templates

• Vi vill ju skicka tillbaka vår HTML, inte bara text…

• return HttpResponse(u”text <b>här</b>”) ???

• Bättre: Templates!

Page 21: Dag 3: Python & Django

Template

<!doctype html><html><body>Välkommen till {{ quiz_slug }}-quizet</body></html>

Page 22: Dag 3: Python & Django

<!doctype html><html><body>Välkommen till {{ quiz_slug }}-quizet</body></html>

{”quiz_slug": "klassiker"}

<!doctype html><html><body>Välkommen till klassiker-quizet</body></html>

Page 23: Dag 3: Python & Django

Templates

return HttpResponse(u"text <b>här</b>")

context = {"quiz_slug": slug}return render(request, "quiz/quiz.html", context)

Page 24: Dag 3: Python & Django

Testdata

quizzes = { "klassiker": { "name": "Klassiska böcker", "description": "Hur bra kan du dina klassiker?" }, "fotboll": { "name": ”Största fotbollslagen", "description": "Kan du dina lag?" }, "kanda-hackare": { "name": "Världens mest kända hackare", "description": "Hackerhistoria är viktigt, kan du den?" },}

Page 25: Dag 3: Python & Django

Mer än bara sluggen

quizzes = { "klassiker": { "name": "Klassiska böcker", "description": "Hur bra kan du dina klassiker?" }, …}context = {"quiz": quizzes[slug]}return render(request, "quiz/quiz.html", context)

Välkommen till {{ quiz.name }}-quizet

Välkommen till Klassiska böcker-quizet

Page 26: Dag 3: Python & Django

Lista quizzes på startsidan?

def startpage(request): context = {"quizzes": quizzes} return render(request, "quiz/startpage.html", context)

{% for quiz_slug, quiz in quizzes.items %} <p>{{ quiz.name }}</p>{% endfor %}

quizzes = { "klassiker": { "name": "Klassiska böcker", "description": "Hur bra kan du dina klassiker?" }, …}

Page 27: Dag 3: Python & Django

Direktlänk till quiz?{% for quiz_slug, quiz in quizzes.items %} <p>{{ quiz.name }}</p>{% endfor %}

{% for quiz_slug, quiz in quizzes.items %} <p><a href="?">{{ quiz.name }}</a></p>{% endfor %}

{% for quiz_slug, quiz in quizzes.items %} <p><a href="{% url "quiz_page" quiz_slug %}”> {{ quiz.name }} </a></p>{% endfor %}

url(r”^quiz/([a-z-]+)/$”, views.quiz, name="quiz_page"),

<p><a href="/quiz/klassiker/"> Klassiska böcker</a></p>