Python Crash Course + Web Forms (CGI) CS370 SE Practicum, Cengiz - - PowerPoint PPT Presentation

python crash course web forms cgi
SMART_READER_LITE
LIVE PREVIEW

Python Crash Course + Web Forms (CGI) CS370 SE Practicum, Cengiz - - PowerPoint PPT Presentation

Python Crash Course + Web Forms (CGI) CS370 SE Practicum, Cengiz Gnay (Some slides courtesy of Eugene Agichstein and the Internets) CS370, Gnay (Emory) Python Intro + CGI Spring 2014 1 / 6 Agenda Lab sessions: Coming Tuesday 1/21 Can


slide-1
SLIDE 1

Python Crash Course + Web Forms (CGI)

CS370 SE Practicum, Cengiz Günay (Some slides courtesy of Eugene Agichstein and the Internets)

CS370, Günay (Emory) Python Intro + CGI Spring 2014 1 / 6

slide-2
SLIDE 2

Agenda

Lab sessions: Coming Tuesday 1/21 Can bring laptops? Or need to find alternate computer lab time:

1

Thu 5–6pm ?

CS370, Günay (Emory) Python Intro + CGI Spring 2014 2 / 6

slide-3
SLIDE 3

Computer Lab (E308A) Reservations

1 Mondays ◮ 2–5 pm and 6–7 pm 2 Tuesdays ◮ 4–6:15 pm 3 Weds ◮ 2–3 pm and 4–5 pm 4 Thursdays ◮ 11:30 am–12:30 pm and 4–5 pm 5 Fridays ◮ 11:45 am–12:35 pm, 2–3 pm, and 4–5 pm CS370, Günay (Emory) Python Intro + CGI Spring 2014 3 / 6

slide-4
SLIDE 4

Agenda (cont.)

Reading: Code Complete chapters 1–5 by next week

CS370, Günay (Emory) Python Intro + CGI Spring 2014 4 / 6

slide-5
SLIDE 5

Agenda (cont.)

Reading: Code Complete chapters 1–5 by next week Today: Python Crash Course Python for getting data from web forms (by using the common gateway interface – CGI)

CS370, Günay (Emory) Python Intro + CGI Spring 2014 4 / 6

slide-6
SLIDE 6

Python

1/17/2013 5

slide-7
SLIDE 7

6

Compiling vs. interpreting

  • Many languages require you to compile (translate) your

program into a form that the machine understands.

  • Python is instead directly interpreted into machine

instructions.

compile execute

  • utput

source code Hello.java byte code Hello.class interpret

  • utput

source code Hello.py

1/17/2013

slide-8
SLIDE 8

Python

  • Have your cake and eat it, too:

Productivity and readable code

  • VHLLs will gain on system

languages (John Ousterhout)

  • "Life is better without braces"

(Bruce Eckel)

1/17/2013 7

Guido van Rossum: creator of Python

slide-9
SLIDE 9

1/17/2013 8

Interactive “shell”

  • Great for learning the language
  • Great for experimenting with the library
  • Great for testing your own modules
  • Type statements or expressions at prompt:

>>> print "Hello, world" Hello, world >>> x = 12**2 >>> x/2 72 >>> # this is a comment

slide-10
SLIDE 10

1/17/2013 9

Numbers

  • The usual suspects
  • 12, 3.14, 0xFF, 0377, (-1+2)*3/4**5, abs(x), 0<x<=5
  • C-style shifting & masking
  • 1<<16, x&0xff, x|1, ~x, x^y
  • Integer division truncates :-(
  • 1/2 -> 0

# float(1)/2 -> 0.5

  • Long (arbitrary precision), complex
  • 2L**100 -> 1267650600228229401496703205376L
  • 1j**2 -> (-1+0j)
slide-11
SLIDE 11

1/17/2013 10

Strings

  • "hello"+"world"

"helloworld" # concatenation

  • "hello"*3

"hellohellohello" # repetition

  • "hello"[0]

"h" # indexing

  • "hello"[-1]

"o" # (from end)

  • "hello"[1:4]

"ell" # slicing

  • len("hello")

5 # size

  • "hello" < "jello"

1 # comparison

  • "e" in "hello"

1 # search

  • "escapes: \n etc, \033 etc, \xff etc"
  • 'single quotes' '''triple quotes''' r"raw strings"
slide-12
SLIDE 12

1/17/2013 11

Lists

  • a = [99, "bottles of beer", ["on", "the", "wall"]]
  • Flexible arrays, not Lisp-like linked lists
  • Same operators as for strings
  • a+b, a*3, a[0], a[-1], a[1:], len(a)
  • Item and slice assignment
  • a[0] = 98
  • a[1:2] = ["bottles", "of", "beer"]
  • > [98, "bottles", "of", "beer", ["on", "the", "wall"]]
  • del a[-1]

# -> [98, "bottles", "of", "beer"]

slide-13
SLIDE 13

1/17/2013 12

More list operations

>>> a = range(5) # [0,1,2,3,4] >>> a.append(5) # [0,1,2,3,4,5] >>> a.pop() # [0,1,2,3,4] 5 >>> a.insert(0, 5.5) # [5.5,0,1,2,3,4] >>> a.pop(0) # [0,1,2,3,4] 5.5 >>> a.reverse() # [4,3,2,1,0] >>> a.sort() # [0,1,2,3,4]

slide-14
SLIDE 14

1/17/2013 13

Dictionaries

  • Hash tables, "associative arrays"
  • d = {"duck": "eend", "water": "water"}
  • Lookup:
  • d["duck"] -> "eend"
  • d["back"] # raises KeyError exception
  • Delete, insert, overwrite:
  • del d["water"] # {"duck": "eend", "back": "rug"}
  • d["back"] = "rug" # {"duck": "eend", "back": "rug"}
  • d["duck"] = "duik" # {"duck": "duik", "back": "rug"}
slide-15
SLIDE 15

1/17/2013 14

More dictionary ops

  • Keys, values, items:
  • d.keys() -> ["duck", "back"]
  • d.values() -> ["duik", "rug"]
  • d.items() -> [("duck","duik"), ("back","rug")]
  • Presence check:
  • d.has_key("duck") -> 1; d.has_key("spam") -> 0
  • Values of any type; keys almost any
  • {"name":"Guido", "age":43, ("hello","world"):1,

42:"yes", "flag": ["red","white","blue"]}

slide-16
SLIDE 16

1/17/2013 15

Dictionary details

  • Keys must be immutable:

– numbers, strings, tuples of immutables

  • these cannot be changed after creation

– reason is hashing (fast lookup technique) – not lists or other dictionaries

  • these types of objects can be changed "in place"

– no restrictions on values

  • Keys will be listed in arbitrary order

– again, because of hashing

slide-17
SLIDE 17

1/17/2013 16

Tuples

  • key = (lastname, firstname)
  • point = x, y, z

# paren’s optional

  • x, y, z = point
  • lastname = key[0]
  • singleton = (1,)

# trailing comma!

  • empty = ()

# parentheses!

  • tuples vs. lists; tuples immutable
slide-18
SLIDE 18

1/17/2013 17

Variables

  • No need to declare
  • Need to assign (initialize)
  • use of uninitialized variable raises exception
  • Not typed

if friendly: greeting = "hello world" else: greeting = 12**2 print greeting

  • Everything is a variable:
  • functions, modules, classes
slide-19
SLIDE 19

1/17/2013 18

Reference semantics

  • Assignment manipulates references
  • x = y does not make a copy of y
  • x = y makes x reference the object y references
  • Very useful; but beware!
  • Example:

>>> a = [1, 2, 3]; b = a >>> a.append(4); print b [1, 2, 3, 4]

slide-20
SLIDE 20

1/17/2013 19

a 1 2 3 b a 1 2 3 b 4 a = [1, 2, 3] a.append(4) b = a a 1 2 3

Changing a shared list

slide-21
SLIDE 21

1/17/2013 20

a 1 b a 1 b a = 1 a = a+1 b = a a 1 2

Changing an integer

  • ld reference deleted

by assignment (a=...) new int object created by add operator (1+1)

slide-22
SLIDE 22

1/17/2013 21

Control structures

if condition: statements [elif condition: statements] ... else: statements while condition: statements for var in sequence: statements break continue

slide-23
SLIDE 23

1/17/2013 22

Grouping indentation

In Python:

for i in range(20): if i%3 == 0: print i if i%5 == 0: print "Bingo!" print "---"

In C:

for (i = 0; i < 20; i++) { if (i%3 == 0) { printf("%d\n", i); if (i%5 == 0) { printf("Bingo!\n"); } } printf("---\n"); }

Bingo!

  • 3
  • 6
  • 9
  • 12
  • 15

Bingo!

  • 18
slide-24
SLIDE 24

1/17/2013 23

Functions, procedures

def name(arg1, arg2, ...): "documentation" # optional statements return # from procedure return expression # from function

slide-25
SLIDE 25

1/17/2013 24

Example function

def gcd(a, b): "greatest common divisor" while a != 0: a, b = b%a, a # parallel assignment return b >>> gcd.__doc__ 'greatest common divisor' >>> gcd(12, 20) 4

slide-26
SLIDE 26

1/17/2013 25

Classes

class name: "documentation" statements

  • or-

class name(baseclass1, baseclass2, ...): ... Typically, statements contains method definitions: def name(self, arg1, arg2, ...): ... May also contain class variable assignments

slide-27
SLIDE 27

1/17/2013 26

Example class

class Stack: "A well-known data structure…" def __init__(self): # constructor self.items = [] def push(self, x): self.items.append(x) # the sky is the limit def pop(self): x = self.items[-1] # what happens if it’s empty? del self.items[-1] return x def empty(self): return len(self.items) == 0 # Boolean result

slide-28
SLIDE 28

1/17/2013 27

Using classes

  • To create an instance, simply call the class object:

x = Stack() # no 'new' operator!

  • To use methods of the instance, call using dot notation:

x.empty() # -> 1 x.push(1) # [1] x.empty() # -> 0 x.push("hello") # [1, "hello"] x.pop() # -> "hello" # [1]

  • To inspect instance variables, use dot notation:

x.items # -> [1]

slide-29
SLIDE 29

1/17/2013 28

Subclassing

class FancyStack(Stack): "stack with added ability to inspect inferior stack items" def peek(self, n): "peek(0) returns top; peek(-1) returns item below that; etc." size = len(self.items) assert 0 <= n < size # test precondition return self.items[size-1-n]

slide-30
SLIDE 30

1/17/2013 29

Subclassing (2)

class LimitedStack(FancyStack): "fancy stack with limit on stack size" def __init__(self, limit): self.limit = limit FancyStack.__init__(self) # base class constructor def push(self, x): assert len(self.items) < self.limit FancyStack.push(self, x) # "super" method call

slide-31
SLIDE 31

1/17/2013 30

Class & instance variables

class Connection: verbose = 0 # class variable def __init__(self, host): self.host = host # instance variable def debug(self, v): self.verbose = v # make instance variable! def connect(self): if self.verbose: # class or instance variable? print "connecting to", self.host

slide-32
SLIDE 32

1/17/2013 31

Instance variable rules

  • On use via instance (self.x), search order:

– (1) instance, (2) class, (3) base classes – this also works for method lookup

  • On assigment via instance (self.x = ...):

– always makes an instance variable

  • Class variables "default" for instance variables
  • But...!

– mutable class variable: one copy shared by all – mutable instance variable: each instance its own

slide-33
SLIDE 33

1/17/2013 32

Modules

  • Collection of stuff in foo.py file

– functions, classes, variables

  • Importing modules:

– import string; print string.join(L) – from string import join; print join(L)

  • Rename after import:

– import string; s = string; del string

slide-34
SLIDE 34

1/17/2013 33

Packages

  • Collection of modules in directory
  • Must have __init__.py file
  • May contain subpackages
  • Import syntax:

– from P.Q.M import foo; print foo() – from P.Q import M; print M.foo() – import P.Q.M; print P.Q.M.foo()

slide-35
SLIDE 35

1/17/2013 34

Catching exceptions

def foo(x): return 1.0/x def bar(x): try: print foo(x) except ZeroDivisionError, message: print "Can’t divide by zero:", message bar(0)

slide-36
SLIDE 36

1/17/2013 35

Try-finally: cleanup

f = open(file) try: process_file(f) finally: f.close() # always executed print "OK" # executed on success only

slide-37
SLIDE 37

1/17/2013 36

Raising exceptions

  • raise IndexError
  • raise IndexError("k out of range")
  • raise IndexError, "k out of range"
  • try:

something except: # catch everything print "Oops" raise # reraise

slide-38
SLIDE 38

1/17/2013 37

More on exceptions

  • User-defined exceptions

– subclass Exception or any other standard exception

  • Old Python: exceptions can be strings

– WATCH OUT: compared by object identity, not ==

  • Last caught exception info:

– sys.exc_info() == (exc_type, exc_value, exc_traceback)

  • Last uncaught exception (traceback printed):

– sys.last_type, sys.last_value, sys.last_traceback

  • Printing exceptions: traceback module
slide-39
SLIDE 39

1/17/2013 38

File objects

  • f = open(filename[, mode[, buffersize])

– mode can be "r", "w", "a" (like C stdio); default "r" – append "b" for text translation mode – append "+" for read/write open – buffersize: 0=unbuffered; 1=line-buffered; buffered

  • methods:

– read([nbytes]), readline(), readlines() – write(string), writelines(list) – seek(pos[, how]), tell() – fileno(), flush(), close()

slide-40
SLIDE 40

1/17/2013 39

Standard library

  • Core:

– os, sys, string, getopt, StringIO, struct, pickle, ...

  • Regular expressions:

– re module; Perl-5 style patterns and matching rules

  • Internet:

– socket, rfc822, httplib, htmllib, ftplib, smtplib, ...

  • Miscellaneous:

– pdb (debugger), profile+pstats – Tkinter (Tcl/Tk interface), audio, *dbm, ...

slide-41
SLIDE 41
slide-42
SLIDE 42

Python for Web Programming

More web programming next class Introduction: Common Gateway Interface (CGI)

◮ All dynamic web pages uses this CS370, Günay (Emory) Python Intro + CGI Spring 2014 6 / 6

slide-43
SLIDE 43

Python for Web Programming

More web programming next class Introduction: Common Gateway Interface (CGI)

◮ All dynamic web pages uses this

Submitting web form calls executable Executable produces HTML that shows up on “next” page Python is the executable in this example

CS370, Günay (Emory) Python Intro + CGI Spring 2014 6 / 6

slide-44
SLIDE 44

1/17/2013 42

A typical HTML form

<form method="POST" action="http://host.com/cgi-bin/test.py"> <p>Your first name: <input type="text" name="firstname"> <p>Your last name: <input type="text" name="lastname"> <p>Click here to submit form: <input type="submit" value="Yeah!"> <input type="hidden" name="session" value="1f9a2"> </form>

slide-45
SLIDE 45

1/17/2013 43

A typical CGI script

#!/usr/local/bin/python import cgi def main(): print "Content-type: text/html\n" form = cgi.FieldStorage() # parse query if form.has_key("firstname") and form["firstname"].value != "": print "<h1>Hello", form["firstname"].value, "</h1>" else: print "<h1>Error! Please enter first name.</h1>" main()

slide-46
SLIDE 46

1/17/2013 44

CGI script structure

  • Check form fields

– use cgi.FieldStorage class to parse query

  • takes care of decoding, handles GET and POST
  • "foo=ab+cd%21ef&bar=spam" -->

{'foo': 'ab cd!ef', 'bar': 'spam'} # (well, actually, ...)

  • Perform action

– this is up to you! – database interfaces available

  • Generate HTTP + HTML output

– print statements are simplest – template solutions available

slide-47
SLIDE 47

1/17/2013 45

Structure refinement

form = cgi.FieldStorage() if not form: ...display blank form... elif ...valid form...: ...perform action, display results (or next form)... else: ...display error message (maybe repeating form)...

slide-48
SLIDE 48

1/17/2013 46

FieldStorage details

  • Behaves like a dictionary:

– .keys(), .has_key() # but not others! – dictionary-like object ("mapping")

  • Items

– values are MiniFieldStorage instances

  • .value gives field value!

– if multiple values: list of MiniFieldStorage instances

  • if type(...) == types.ListType: ...

– may also be FieldStorage instances

  • used for file upload (test .file attribute)
slide-49
SLIDE 49

1/17/2013 47

Other CGI niceties

  • cgi.escape(s)

– translate "<", "&", ">" to "&lt;", "&amp;", "&gt"

  • cgi.parse_qs(string, keep_blank_values=0)

– parse query string to dictionary {"foo": ["bar"], ...}

  • cgi.parse([file], ...)

– ditto, takes query string from default locations

  • urllib.quote(s), urllib.unquote(s)

– convert between "~" and "%7e" (etc.)

  • urllib.urlencode(dict)

– convert dictionary {"foo": "bar", ...} to query string "foo=bar&..." # note asymmetry with parse_qs() above

slide-50
SLIDE 50

1/17/2013 48

Dealing with bugs

  • Things go wrong, you get a traceback...
  • By default, tracebacks usually go to the server's

error_log file...

  • Printing a traceback to stdout is tricky

– could happen before "Content-type" is printed – could happen in the middle of HTML markup – could contain markup itself

  • … to be continued
slide-51
SLIDE 51

1/17/2013 49

Reference URLs

  • Python websites

– http://www.python.org (official site) – http://starship.python.net (community)

  • Python tutorials on the Web:

– http://code.google.com/edu/languages/google-python-class/ – http://docs.python.org/tutorial/

  • Guido’s original slides on the web

– http://www.python.org/doc/essays/ppt/sd99east.ppt