21 Οκτωβρίου 2010
Προαπαιτούµενα Λίγες γνώσεις προγραµµατισµού Μια ιδέα από python Μια δόση γνώσεων ϐάσεων δεδοµένων
Προαπαιτούµενα Λίγες γνώσεις προγραµµατισµού Μια ιδέα από python Μια δόση γνώσεων ϐάσεων δεδοµένων Επιθυµητά: Να έχετε ϕτιάξει µια σελίδα µε ϐάση δεδοµένων µε HTML, XML, XSL, PHP και να τα µισήσατε ϑανάσιµα Λίγες γνώσεις από Monty Python
Μια ιστοσελίδα στην απλή µορφή της: <html> <head> <title>a page in the world wide web!</title> </head> <body> <p> Look ma! Im famous!!! I gotta wepbage thingy! <h1>weapons of the spanish Inquisitoin (there are 3):</h1> <ul> <li>surprise <li>fear <li>ruthless efficiency </ul> </body> </html> Καθόλου δυναµική.
Καλύτερα παραδείγµατα Σελίδες µε: περιεχόµενο που αλλάζει συχνά, π.χ. blog. περιεχόµενο που ενηµερώνεται αυτόµατα (π.χ. χρηµατιστήριο, καιρός κτλ.) χρήστες που ανεβάζουν περιεχόµενο
Βασική ιδέα Ιστορία Ο server, αντί να παραδίδει στατικές σελίδες, να τρέχει κώδικα που να τις παραγάγει δυναµικά.
Ιστορία Ιστορία.
1 Εξ ολοκλήρου σε python 2 DRY principle 3 Είναι διαχωρισµένο σε αυτόνοµα κοµµάτια (modular) 4 Ακολουθεί το µοντέλο MVC (το ονοµάζει MTV -,, ) Μοντέλο η ϐάση δεδοµένων. Αντιστοιχίζεται σε αντικείµενα της Python µέσω των οποίων η εφαρµογή επικοινωνεί µε αυτή. Οψη κώδικας που κάνει επιλογή και επεξεργασία των δεδοµένων που Ϲητάει ένας χρήστης της εφαρµογής (ένας επισκέπτης της ιστοσελίδας) Πρότυπο µια σελίδα που περιγράφει πως ϑα παρουσιαστούν τα δεδοµένα στο χρήστη Απλό παράδειγµα: απλή εφαρµογή σφυγµοµετρήσεων (κλεµµένη από το tutorial).
Ορισµός µοντέλου (models.py) from.db import models import datetime class Poll(models.): question = models.charfield(max_length=200) pub_date = models.datetimefield( date published ) def unicode (self): return self.question def was_published_today(self): return self.pub_date.date() == datetime.date.today() class Choice(models.): poll = models.foreignkey(poll) choice = models.charfield(max_length=200) votes = models.integerfield() def unicode (self): return self.choice
Αντικείµενα Αντιστοιχούν σε ένα πίνακα της ϐάσης ιαθέτουν τον manager objects, ο οποίος χρησιµοποιείται για queries στη ϐάση Περικλείουν όλη τη γνώση για τα δεδοµένα της εφαρµογής validation κτλ. Επιτρέπουν τη δηµιουργία, αλλαγή και διαγραφή εγγραφών από τη ϐάση µέσα από κώδικα python
URLs Πως όµως ϑα προσπελάσει τα δεδοµένα ο χρήστης της εφαρµογής;
URLs (urls.py) from.conf.urls.defaults import * urlpatterns = patterns(, (r ˆpolls/$, polls.views.index ), (r ˆpolls/(?P<poll_id>\d+)/$, polls.views.detail ), (r ˆpolls/(?P<poll_id>\d+)/results/$, polls.views.results ), (r ˆpolls/(?P<poll_id>\d+)/vote/$, polls.views.vote ) )
Τις αιτήσεις ϑα εξυπηρετήσει ένα view. Για παράδειγµα, την αίτηση για τη σελίδα /polls/, ϑα την εξυπηρετήσει το παρακάτω view: (views.py) from.http import HttpResponse def index(request): return HttpResponse("Hello, world. You re at the index.") Ο πελάτης ϑα δει µια σελίδα που ϑα γράφει Hello, world. You re at the index.
Κάνοντας το index χρήσιµο Θέλουµε το index να δείχνει µια λίστα µε τις τρέχουσες σφυγµοµετρήσεις: Σχήµα: Απαίσιο screenshot
Ενα πρώτο ϐήµα (views.py) from polls.models import Poll from.http import HttpResponse def index(request): latest_poll_list = Poll.objects.all().order_by( -pub_date )[:5] output = "<br />".join([p.question for p in latest_poll_list]) return HttpResponse(output)
Καλύτερα όµως µε templates (views.py) from.template import Context, loader from polls.models import Poll from.http import HttpResponse def index(request): latest_poll_list = Poll.objects.all().order_by( -pub_date )[:5] t = loader.get_template( polls/index.html ) c = Context({ latest_poll_list : latest_poll_list, }) return HttpResponse(t.render(c))
Το template (polls/index.html) {% if latest_poll_list %} <ul> {% for poll in latest_poll_list %} <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li> {% endfor %} </ul> {% else %} <p>no polls are available.</p> {% endif %}
Μερικά στοιχεία του template system του : Tags Τα tags υλοποιούν λειτουργίες όπως control-flow και κληρονοµικότητα. κ.ά. {{ variable }}: αντικαθίσταται µε την τιµή της µεταβλητής variable {% if condition %}... {% else %}... {% endif %}: λειτουργεί σαν if. {% for member in collection %}... {% endfor %}: λειτουργεί σαν for-each. {% cycle item1 item2 %}: κάθε ϕορά που συναντάται, αντικαθίσταται µε µία από τις τιµές της, κυκλικά. Χρησιµοποιείται µέσα σε for loops π.χ. για να παραγάγει εναλλασσόµενες γραµµές σε έναν πίνακα. {% block name %}, {% extends template path %}: χρησιµοποιούνται για ορισµό κληρονοµικότητας (για µια άλλη παρουσίαση)
Περισσότερα για τις µεταβλητές Μια µεταβλητή συχνά είναι dictionary ή εγγραφή από τη ϐάση δεδοµένων. Το template system αναγνωρίζει σύνταξη της µορφής variable.member.member... Σε κάθε τελεία, το δοκιµάζει µε τη σειρά: 1 Dictionary lookup 2 Attribute lookup 3 Method call 4 List-index lookup Παράδειγµα: σε ένα αντικείµενο Poll, µε όνοµα poll, poll.question είναι η ερώτηση του Poll.
Μερικά στοιχεία του template system του : Filters Τα filters αλλάζουν το περιεχόµενο µεταβλητών. κ.ά. {{ variable lower }}: µετατρέπει το περιεχόµενο της µεταβλητής σε µικρά γράµµατα. {{ variable filesizeformat }}: µετατρέπει αριθµούς σε human-readable µεγέθη αρχείων (1024 σε 1 ΜΒ κτλ.) {{ variable length }}: τυπώνει το µήκος της µεταβλητής (είτε είναι string είτε list ).
in a thousand words
Περισσότερες πληροφορίες: official site tutorial the book (second edition)
.