Krzysztof Ciebiera na podstawie http://www.djangobook.com/ Django cz.1 Krzysztof Ciebiera na podstawie http://www.djangobook.com/
Jak działa CGI? import MySQLdb print "Content-Type: text/html" print print "<html><head><title>Books</title></head>" print "<body>" print "<h1>Books</h1>" print "<ul>" connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') cursor = connection.cursor() cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10")
Jak działa CGI? for row in cursor.fetchall(): print "<li>%s</li>" % row[0] print "</ul>" print "</body></html>" connection.close()
Wady CGI Dlaczego musimy się łączyć w ten sposób z bazą danych? Czy sami powinniśmy pamiętać o Content-Type i zamknięciu bazy danych? Jak używać tego samego kodu w różnych konfiguracjach? Co ma robić projektant stron, nie znający pythona?
Model MVC model – zawiera opis danych widok – zawiera logikę mapowanie – mówi jaki url uruchamia którą funkcję szablon – pokazuje jak to wyświetlać
Model # models.py (the database tables) from django.db import models class Book(models.Model): name = models.CharField(maxlength=50) pub_date = models.DateField()
Widok # views.py (the business logic) from django.shortcuts import render_to_response from models import Book def latest_books(request): book_list = Book.objects.order_by('- pub_date')[:10] return render_to_response('latest_books.html', {'book_list': book_list})
Mapowanie # urls.py (the URL configuration) from django.conf.urls.defaults import * import views urlpatterns = patterns('', (r'latest/$', views.latest_books), )
Szablon # latest_books.html (the template) <html><head><title>Books</title></head> <body> <h1>Books</h1> <ul> {% for book in book_list %} <li>{{ book.name }}</li> {% endfor %} </ul> </body></html>
Jak uruchomić Django? Potrzebny jest python django-admin.py startproject mysite __init__.py manage.py settings.py urls.py python manage.py runserver 8080
Najprostsza aplikacja from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) Ale skąd system wie, że tą funkcję trzeba uruchomić?
Mapowanie aplikacji from django.conf.urls.defaults import * from mysite.views import current_datetime urlpatterns = patterns('', (r'^time/$', current_datetime), )
Wyrażenia regularne . (kropka) cokolwiek \d cyfra [A-Z] wielka litera [a-z] mała litera [A-Za-z] jakakolwiek litera + jeden lub więcej [^/] wszystko oprócz ukośnika * zero lub więcej {1,3} między jeden a trzy
Jak to działa Django importuje settings.py Ustawia ROOT_URLCONF UrlConf odpowiada za przekazanie żądania do widoku (mamy słabe wiązania) Widok odpowiada za zwrócenie HttpResponse Naprawdę to jest odrobinkę bardziej skomplikowane!
Dynamiczne URL mapowanie from django.conf.urls.defaults import * from mysite.views import current_datetime, hours_ahead urlpatterns = patterns('', (r'^time/$', current_datetime), (r'^time/plus/(\d{1,2})/$', hours_ahead), )
Dynamiczne URL obsługa def hours_ahead(request, offset): offset = int(offset) dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html) Komunikaty o błędach są sensowne!