Serwer WWW na przykªadzie Django cz.3

Podobne dokumenty
Serwer WWW na przykªadzie Django

Kurs rozszerzony języka Python

Kurs rozszerzony języka Python

Laboratorium 2. def detail(request, question_id): return HttpResponse("Patrzysz na pytanie %s." % question_id)

Wprowadzenie do Internetu Zajęcia 5

Aplikacje WWW. Krzysztof Ciebiera. 3 kwietnia 2014

Przykład programu w PHP. Wykład10.PHP ciągdalszy,str.1

Baza danych do przechowywania użytkowników

Obiektowe bazy danych

Chatter Aplikacja internetowa

Szablon główny (plik guestbook.php) będzie miał postać:

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI


Rejestracja i Logowania - PHP/MySQL

Dokumentacja smsapi wersja 1.4

Internetowe bazy danych

ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP

Aplikacje internetowe - laboratorium

Zajęcia 13 wykorzystanie MySQL w PHP cz. 2

Laboratorium 1 Wprowadzenie do PHP

Aplikacje WWW - laboratorium

EPI: Interfejs Graczny 2008/2009 dania HTTP oraz obsªuga stanu

Modele. Najcz. Metoda unicode definiuje sposób wyświetlania obiektu w postaci tekstowej. BooleanField - pole logiczne, True/False

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Quiz Aplikacja internetowa

Internetowe bazy danych

Przykładowa integracja systemu Transferuj.pl

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Kurs rozszerzony języka Python

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Systemy internetowe Wykład 3 PHP

Podstawowe wykorzystanie Hibernate

Protokół HTTP. 1. Protokół HTTP, usługi www, model request-response (żądanie-odpowiedź), przekazywanie argumentów, AJAX.

Sieci Komputerowe. Laboratorium 5 - usługi sieciowe cz. 1 Maciej Szymański 28 kwietnia 2014

Zaawansowane bazy danych i hurtownie danych studia zaoczne II stopnia, sem. I

Plan wykładu. 1. Protokół FTP. 2. Protokół HTTP, usługi www, model request-response (żądanie-odpowiedź), przekazywanie argumentów, AJAX.

Programowanie internetowe

Lista ToDo Aplikacja internetowa

Przykładowa integracja systemu tpay.com KIP S.A. ul. Św. Marcin 73/ Poznań.

Architektury Usług Internetowych. Laboratorium 1. Servlety

Języki programowania wysokiego poziomu. PHP cz.3. Formularze

Studium Podyplomowe Aplikacje i Us ugi Internetowe Tworzenie witryn internetowych 2012/2013. CakePHP część II

Formularze w PHP dla początkujących

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Aplikacje internetowe

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

MEAN Stack - uwierzytelnienie

Testy aplikacji webowych

E.14 Bazy Danych cz. 19 SQL i PHP współpraca przez stronę internetową

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Dane - pobieranie, przekazywanie i przechowywanie. dr Beata Kuźmińska-Sołśnia

Aplikacje WWW - laboratorium

KUP KSIĄŻKĘ NA: PRZYKŁADOWY ROZDZIAŁ KOMUNIKATY DLA UŻYTKOWNIKA

MEAN Stack - uwierzytelnienie

Aplikacje www laboratorium

Współpraca PHP z MySql cz.2

Formularze. 1. Formularz HTML

HTTP W 5-CIU PYTANIACH MICHAŁ KOPACZ

MVC w praktyce tworzymy system artykułów. cz. 2

Zagrożenia trywialne. Zagrożenia bezpieczeństwa aplikacji internetowych. Parametry ukryte. Modyfikowanie parametrów wywołania

SIECI KOMPUTEROWE I BAZY DANYCH

Programowanie w Internecie

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

mysql> UPDATE user SET Password=PASSWORD('pass') WHERE user='root'; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

Na początku utworzymy formularz w czystym języku HTML i przetestujemy go za pomocą przeglądarki WWW.

KUP KSIĄŻKĘ NA: PRZYKŁADOWY ROZDZIAŁ KOMUNIKATY DLA UŻYTKOWNIKA I ROLE UŻYTKOWNIKÓW

INSTALACJA I KONFIGURACJA SERWERA PHP.

Zaawansowany kurs języka Python

Formularze HTML. dr Radosław Matusik. radmat

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Podstawy JavaScript ćwiczenia

Współpraca PHP z MySql

FORMULARZE Formularz ma formę ankiety, którą można wypełnić na stronie. Taki formularz może być np. przesłany pocztą elektroniczną .

Ćwiczenie: JavaScript Cookies (3x45 minut)

Aplikacje WWW - laboratorium

Bazy Danych i Usługi Sieciowe

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Język PHP. Studium Podyplomowe Sieci Komputerowe i Aplikacje Internetowe. v1.7, 2007/11/23

SMS Kod Automatyczny

Wykład 5: PHP: praca z bazą danych MySQL

Podstawy (X)HTML i CSS

AUDYT DOSTĘPNOŚCI STRONY INTERNETOWEJ

Podstawy programowania (PHP/Java)

BRAMKA HTTP SMS XML Dokumentacja techniczna. wersja 3.32

Zajęcia 11 wykorzystanie MySQL w PHP

RSA w PHP: chronimy nasze dane przy użyciu kryptografii asymetrycznej

Michał Bielecki, KNI 'BIOS'

OPT Open Power Template. System szablonów OPT. Przykładowy skrypt oraz szablon OPT OPT API

Infrastruktura aplikacji WWW

INTRO. {27. Lipca} Jeśli chcesz podszkolić się w obsłudze arkuszy kalkulacyjnych, zapraszam na szkolenie z EXCELA w Poznaniu:

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład VII

Technologie Informacyjne

Dokument hipertekstowy

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

Ćwiczenie laboratoryjne. Komunikacja z serwerem w języku PHP

SSK - Techniki Internetowe

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Transkrypt:

Serwer WWW na przykªadzie Django cz.3 Krzysztof Ciebiera 20 kwietnia 2010 Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 1 / 34

1 Formularze 2 Ciasteczka 3 Sesje 4 U»ytkownicy Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 2 / 34

Najprostszy formularz def search(request): query = request.get.get('q', '') if query: qset = (Q(title icontains=query)... ) results = Book.objects.filter(qset).distinct() else: results = [] return render_to_response("books/search.html", { "results": results, "query": query }) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 3 / 34

Formularz - u»ycie <title>search{% if query %} Results{% endif %}... <h1>search</h1> <form action="." method="get"> <label for="q">search: </label> <input type="text" name="q" value="{{ query escape }}"> <input type="submit" value="search">... {% if query %} <h2>results for "{{ query escape }}":</h2> {% if results %} <ul> {% for book in results %} <li>{{ book escape }}</l1> {% endfor %} Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 4 / 34

Idealny formularz W formularzu wprowadza si dane, które s opisane (np. <label>) Dane s werykowane W przypadku bª du u»ytkownik mo»e poprawi dane Formularz wy±wietla si wielokrotnie, a» wszystkie dane s poprawne Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 5 / 34

forms.py from django import newforms as forms TOPIC_CHOICES = ( ('general', 'General enquiry'), ('bug', 'Bug report'), ('suggestion', 'Suggestion'), ) class ContactForm(forms.Form): topic = forms.choicefield(choices=topic_choices) message = forms.charfield() sender = forms.emailfield(required=false) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 6 / 34

Widok from forms import ContactForm def contact(request): form = ContactForm() return render_to_response('contact.html', {'form': form}) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 7 / 34

Szablon <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>contact us</title></head> <body> <h1>contact us</h1> <form action="." method="post"> <table> {{ form.as_table }} </table> <p><input type="submit" value="submit"></p> </form> </body> </html> Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 8 / 34

Jak to wygl da Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 9 / 34

forms.py from django import newforms as forms TOPIC_CHOICES = ( ('general', 'General enquiry'), ('bug', 'Bug report'), ('suggestion', 'Suggestion'), ) class ContactformForm(forms.Form): topic = forms.choicefield(choices=topic_choices) message = forms.charfield(widget = forms.textarea()) sender = forms.emailfield(required=false) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 10 / 34

Jak to wygl da Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 11 / 34

Walidacja def contact(request): if request.method == 'POST': form = ContactForm(request.POST) else: form = ContactForm() return render_to_response('contact.html', {'form': form}) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 12 / 34

Zachowanie 1 def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): topic = form.clean_data['topic'] message = form.clean_data['message'] sender = form.clean_data.get('sender', 'noreply@example.com') Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 13 / 34

Zachowanie 2 send_mail( 'Feedback from your site, topic: %s' % topic, message, sender, ['administrator@example.com'] ) return HttpResponseRedirect('/contact/thanks/') else: form = ContactForm() return render_to_response('contact.html', {'form': form}) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 14 / 34

Wªasna walidacja class ContactForm(forms.Form): topic = forms.choicefield(choices=topic_choices) message = forms.charfield(widget=forms.textarea()) sender = forms.emailfield(required=false) def clean_message(self): message = self.clean_data.get('message', '') num_words = len(message.split()) if num_words < 4: raise forms.validationerror("not enough words!") return message Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 15 / 34

Inne wykorzystanie formularzy from models import Publisher from django.newforms import form_for_model PublisherForm = form_for_model(publisher) ==== def add_publisher(request): if request.method == 'POST': form = PublisherForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/add_publisher/thanks/ Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 16 / 34

Odczytywanie ciasteczek def show_color(request): if "favorite_color" in request.cookies: return HttpResponse("Your favorite color is %s" % \ request.cookies["favorite_color"]) else: return HttpResponse("You don't have a favorite color.") Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 17 / 34

Ustawianie ciasteczek def set_color(request): if "favorite_color" in request.get: response = HttpResponse("Your favorite color is now %s" request.get["favorite_color"]) response.set_cookie("favorite_color", request.get["favorite_color"]) return response else: return HttpResponse("You didn't give a favorite color." Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 18 / 34

Werykacja ciasteczek def login(request): if request.method == 'POST': if request.session.test_cookie_worked(): request.session.delete_test_cookie() return HttpResponse("You're logged in.") else: return HttpResponse("Please enable cookies and try request.session.set_test_cookie() return render_to_response('foo/login_form.html') Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 19 / 34

Atrybuty ciasteczek max_age czas wa»no±ci w sekundach expires data wa»no±ci w formacie "Wdy, DD-Mth-YY HH:MM:SS GMT" path ±cie»ka domain domena wa»no±ci np..mimuw.edu.pl secure czy wolno przekazywa ciastko tylko po HTTPS Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 20 / 34

Sesje # Ustawianie: request.session["fav_color"] = "blue" # Odczyt fav_color = request.session["fav_color"] # Kasowanie del request.session["fav_color"] # Sprawdzanie if "fav_color" in request.session:... Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 21 / 34

Jak dziaªaj sesje S cz ±ci aplikacji django.contrib.sessions S zapisywane w bazie danych >>> from django.contrib.sessions.models import Session >>> s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceea >>> s.expire_date datetime.datetime(2005, 8, 20, 13, 35, 12) Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 22 / 34

Kiedy sesje s modykowane # Sesja jest modyfikowana request.session['foo'] = 'bar' # Sesja jest modyfikowana del request.session['foo'] # Sesja jest modyfikowana request.session['foo'] = {} # Sesja NIE jest modyfikowana bo zmienia si # request.session['foo'] a nie request.session. request.session['foo']['bar'] = 'baz' Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 23 / 34

Techniczne szczegóªy W sesji mo»na zapisa wszystko, co da si zapicklowa. Sesje przechowywane s w tabeli django_session. Dane odczytywane s na» danie Ciasteczko jest ustawiane tylko w przypadku takiej konieczno±ci. Sesje s oparte w caªo±ci na ciasteczkach, w przeciwie«stwie do PHP i JSP. Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 24 / 34

U»ytkownicy Users u»ytkownicy strony Permissions logiczne (tak/nie) uprawnienia do poszczególnych czynno±ci Groups nadawanie uprawnie«caªej grupie osób Messages wiadomo±ci dla u»ytkowników Proles rozszerzanie obiektów opisuj cych u»ytkowników Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 25 / 34

Jak dziaªaja mechanizm uprawnie«aplikacja django.contrib.auth if request.user.is_authenticated(): # Do something for authenticated users. else: # Do something for anonymous users. Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 26 / 34

U»ytkownik 1 username nazwa 30 znaków rst_name, last_name opcjonalne 30 znaków Email opcjonalny Password wymagane, przechowywany hash is_sta dost p do admin is_active aktywny, czy mo»e si logowa is_superuser ma wszystkie uprawnienia last_login kiedy si logowaª date_joined kiedy zaªo»one konto Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 27 / 34

U»ytkownik 2 is_authenticated() czy si zalogowaª is_anonymous() czy nie jest anonimowy get_full_name() imie, spacja, nazwisko set_password(passwd) ustawia hasªo check_password(passwd) sprawdza get_group_permissions() uprawnienia wynikaj ce z grup get_all_permissions() wszystkie uprawnienia. has_perm(perm) sprawdza uprawnienie Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 28 / 34

U»ytkownik 3 has_perms(perm_list) sprawdza wszystkie uprawnienia has_module_perms(app_label) sprawdza jakiekolwiek uprawnienie w aplikacji get_and_delete_messages() wiadomo±ci dla u»ytkownika email_user(subj, msg) wysyªa email get_prole() dodatkowe pola Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 29 / 34

Grupy i uprawnienia myuser.groups = group_list # ustawia myuser.groups.add(group1, group2,...) # dodaje myuser.groups.remove(group1, group2,...) # usuwa myuser.groups.clear() # usuwa z wszystkich grup # Uprawnienia podobnie myuser.permissions = permission_list myuser.permissions.add(permission1, permission2,...) myuser.permissions.remove(permission1, permission2,...) myuser.permissions.clear() Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 30 / 34

Logowanie from django.contrib import auth def login(request): username = request.post['username'] password = request.post['password'] user = auth.authenticate(username=username, password=password) if user is not None and user.is_active: auth.login(request, user) return HttpResponseRedirect("/account/loggedin/") else: return HttpResponseRedirect("/account/invalid/") Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 31 / 34

Wylogowanie from django.contrib import auth def logout(request): auth.logout(request) return HttpResponseRedirect("/account/loggedout/") Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 32 / 34

Szablon logowania {% block content %} {% if form.errors %} <p class="error">sorry, that's not a valid username or password</p> {% endif %} <form action='.' method='post'> <label for="username">user name:</label> <input type="text" name="username" value="" id="username"> <label for="password">password:</label> <input type="password" name="password" value="" id="password"> <input type="submit" value="login" /> <input type="hidden" name="next" value="{{ next escape }}" /> Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 33 / 34

Co z niezalogowanym from django.http import HttpResponseRedirect def my_view(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/login/?next=%s' % request.path) #... ==== from django.contrib.auth.decorators import login_required @login_required def my_view(request): #... Krzysztof Ciebiera () Serwer WWW na przykªadzie Django cz.3 20 kwietnia 2010 34 / 34