Upload
emil-stenstroem
View
105
Download
5
Embed Size (px)
Citation preview
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”
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
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
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%.
Dag 3: 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
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> …
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
Grundkoncept
• Projekt
• URL:er
• Views
• Templates
• Modeller
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>/
Regular expressions!
• https://regex101.com/#python
• urlpatterns = [ ^quiz/[a-z-]+/$ ^quiz/[a-z-]+/question/[0-9]+/$ ^quiz/[a-z-]+/completed/$]
Views
• Tar emot en request
• Svarar med en response
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")
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),
]
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
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"
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
Templates
• Vi vill ju skicka tillbaka vår HTML, inte bara text…
• return HttpResponse(u”text <b>här</b>”) ???
• Bättre: Templates!
Template
<!doctype html><html><body>Välkommen till {{ quiz_slug }}-quizet</body></html>
<!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>
Templates
return HttpResponse(u"text <b>här</b>")
context = {"quiz_slug": slug}return render(request, "quiz/quiz.html", context)
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?" },}
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
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?" }, …}
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>