Upcoming SlideShare
×

# Web2py Code Lab

3,248 views
2,964 views

Published on

Published in: Technology
11 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
Your message goes here
• Be the first to comment

Views
Total views
3,248
On SlideShare
0
From Embeds
0
Number of Embeds
203
Actions
Shares
0
137
0
Likes
11
Embeds 0
No embeds

No notes for slide

### Web2py Code Lab

1. 1. Code Lab +Colin Su @littleq0903
2. 2. Python Fundamentals
3. 3. Installing Python http://python.org/downloads/ Python 2.7.x Mac OS X & Linux - no installation needed, it's built-in
4. 4. Hidden Documentation help() dir()
5. 5. Types str - String list - List tuple - Tuple dict - Dictionary
6. 6. String encode(): Unicode -> Speciﬁc Encoding decode(): Speciﬁc Encoding -> Unicode Python uses Ascii & Unicode >>> a = 'this is an ASCII string' >>> b = u'This is a Unicode string' >>> a = b.encode('utf8')
7. 7. List list is not array, is more like container mutable container >>> a = [1, 2, 3] >>> print type(a) <type 'list'> >>> a.append(8) >>> a.insert(2, 7) >>> del a[0] >>> print a [2, 7, 3, 8] >>> print len(a) 4
8. 8. List - Iteration List is iterable, you can loop over it >>> a = [1, 2, 3] >>> for i in a: print i 1 2 3
9. 9. Tuple immutable version of List >>> a = (1, 2, 3) >>> print a[1] 2 >>> a[1] = 5 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
10. 10. Dictionary store a mapping between a set of keys and a set of values >>> d = {'user':'bozo', 'pswd':1234} ! >>> d['user'] 'bozo' ! >>> d['pswd'] 1234 ! >>> d['bozo'] ! Traceback (innermost last): File '<interactive input>' line 1, in ? KeyError: bozo
11. 11. whlie >>> i = 0 >>> while i < 10: i = i + 1 >>> print i 10
12. 12. if ... elif ... else >>> for >>> >>> >>> >>> >>> >>> zero one other i in range(3): if i == 0: print 'zero' elif i == 1: print 'one' else: print 'other'
13. 13. try ... except ... else ... ﬁnally >>> try: >>> a = 1 / 0 >>> except Exception, e: >>> print 'oops: %s' % e >>> else: >>> print 'no problem here' >>> finally: >>> print 'done' oops: integer division or modulo by zero done >>> try: >>> raise SyntaxError >>> except ValueError: >>> print 'value error' >>> except SyntaxError: >>> print 'syntax error' syntax error all statement for exception handling exception can be vary
14. 14. Functions >>> def f(a, b): return a + b >>> print f(4, 2) 6
15. 15. Functions - default value >>> def f(a, b=2): return a + b, a - b >>> x, y = f(5) >>> print x 7 >>> print y 3
16. 16. Function Argument Packaging arguments could be packaged into list or dictionary * - position based arguments ** - name based arguments >>> def f(*a, **b): return a, b >>> x, y = f(3, 'hello', c=4, test='world') >>> print x (3, 'hello') >>> print y {'c':4, 'test':'world'}
17. 17. Function Argument Unpackaging Vice versa, arguments could be extracted for functions >>> def f(a, b): return a + b >>> c = (1, 2) >>> print f(*c) 3 >>> def f(a, b): return a + b >>> c = {'a':1, 'b':2} >>> print f(**c) 3
18. 18. Lambda anonymous function Python features that function as ﬁrst-class object >>> a = lambda b: b + 2 >>> print a(3) 5
19. 19. Class __init__ as constructor >>> class MyClass(object): >>> z = 2 >>> def __init__(self, a, b): >>> self.x = a >>> self.y = b >>> def add(self): >>> return self.x + self.y + self.z >>> myinstance = MyClass(3, 4) >>> print myinstance.add() 9
20. 20. Class - Special Attributes, Methods, Operators __len__ for len() __getitem__ for indexing retrieve __setitem__ for indexing setting >>> >>> >>> >>> >>> >>> >>> 4 >>> >>> [3, class MyList(object): def __init__(self, *a): self.a = list(a) def __len__(self): return len(self.a) def __getitem__(self, i): return self.a[i] def __setitem__(self, i, j): self.a[i] = j b = MyList(3, 4, 5) print b[1] b.a[1] = 7 print b.a 7, 5]
21. 21. import import which, use which >>> import random >>> print random.randint(0, 9) ! 5 import all >>> from random import * >>> print randint(0, 9) ! import renaming >>> import random as myrand >>> print myrand.randint(0, 9)
22. 22. Datetime library for dealing with time-related operation >>> import datetime >>> print datetime.datetime.today() 2008-07-04 14:03:90 >>> print datetime.date.today() 2008-07-04
23. 23. Web2py Overview
24. 24. Download web2py http://www.web2py.com/init/default/download Windows & Mac OS X - Packaged Executive Linux - python web2py.py
25. 25. Admin Panel Choose admin password every time Start server Keep it open
26. 26. Your First web2py Website Application Administrative interface
27. 27. Administrative Interface Installed Application Management Install & Create New Application Deployment Debug Code Editing
28. 28. Pre-installed Applications admin - the one you're using right now examples - documentation and a replica of oﬃcial website welcome - referred as the skeleton of applications
29. 29. Let's Create a New Application "New simple application" -> Create
30. 30. Components In a Application Models: the data representation Controllers: application logic and workﬂow Views: the data presentation, the interface to users Languages: i18n, internalization Modules: Python modules belongs to this application Static ﬁles: image ﬁles, CSS ﬁles, JavaScript ﬁles... Plugins: extensions of applications
31. 31. URL Mapping http://localhost:8000/<application>/<controller>/<handler> Example http://localhost:8000/mywebsite/default/index Application "mywebsite" Controller "default.py" Handler "def index(): ..."
32. 32. Templates Python Dictionary ! { } "first_name": "Colin", "last_name" : "Su" HTML Template <!DOCTYPE html> <html> <head> <title>Hello Title</title> </head> <body> <h1>Hello, I'm {{=first_name }} {{=last_name }}</h1> </body> </html> Rendered HTML <!DOCTYPE html> <html> <head> <title>Hello Title</title> </head> <body> <h1>Hello, I'm Colin Su</h1> </body> </html>
33. 33. Default Template controllers/default.py -> index() <=> views/default/index.html You can change it by response.view = 'default/something.html'
34. 34. Code Labs
35. 35. Code Lab 0: Make Your Own Controller Create codelab_ﬁrst.py in Controllers Create codelab_ﬁrst/index.html in Views GO EDITING!
36. 36. Return a Dictionary Try to return a customized dictionary Click "exposes: index" codelab_ﬁrst.py ! def index(): my_dict = { "message": "this is message", "massage": "this is massage" } return my_dict
37. 37. Now Template's Turn Print your variables out by {{=var}} codelab_ﬁrst/index.html ! {{extend 'layout.html'}} <h2> {{=message}} </h2> <h3> {{=massage}} </h3>
38. 38. Debugging a View {{=BEAUTIFY(response._vars)}} to print out all variables {{=response.toolbar()}} to enable a debug tool bar
39. 39. Code Lab 1: Say My Name codelab_saymyname.py in Controllers codelab_saymyname/ask.html in Views codelab_saymyname/say.html in Views
40. 40. The Cleanest Controller Ever! Directly return {} since we don't deal with it codelab_saymyname.py ! def ask(): return {} ! def say(): return {} !
41. 41. Create a Form "action" points to "say" with a <input> named "visitor_name" codelab_saymyname/ask.html ! {{extend 'layout.html'}} <h1> What's Your Name? </h1> <form action="say"> <input name="visitor_name" /> <input type="submit" /> </form> !
42. 42. Let it go say Get POST parameters by request.vars.var_name codelab_saymyname/say.html ! {{extend 'layout.html'}} <h1> Hello {{=request.vars.visitor_name}} </h1> ! ! !
43. 43. Core Components
44. 44. web2py Libraries are exposed to the handlers as global objects Ex. request, response, BEAUTIFY... source code ﬁles are in gluon folder web2py/gluon gluon/__init__.py gluon/admin.py gluon/cache.py gluon/cfs.py gluon/compileapp.py gluon/contenttype.py gluon/dal.py gluon/decoder.py gluon/fileutils.py gluon/globals.py ! gluon/highlight.py gluon/restricted.py gluon/html.py gluon/rewrite.py gluon/http.py gluon/rocket.py gluon/import_all.py gluon/sanitizer.py gluon/languages.py gluon/serializers.py gluon/main.py gluon/settings.py gluon/myregex.py gluon/shell.py gluon/newcron.py gluon/sql.py gluon/portalocker.py gluon/sqlhtml.py gluon/reserved_sql_keywords.py gluon/streamer.py gluon/template.py gluon/storage.py gluon/tools.py gluon/utils.py gluon/validators.py gluon/widget.py gluon/winservice.py gluon/xmlrpc.py
45. 45. web2py APIs - Global Objects request - all conﬁguration in HTTP request response - all conﬁguration in HTTP response session cache
46. 46. request Object extends Python dict class basically a dictionary, but can be accessed as attributes  request.vars or request['vars'] if an attribute does not exist, it returns None instead of an exception read-only dictionary
47. 47. Key Attributes in request Object Dictionary-liked  Boolean  request.cookies  request.is_local  request.env  request.is_https  request.vars  request.ajax request.get_vars  request.post_vars Datetime  request.now  String  request.utcnow request.application  request.controller  request.function  request.extension (more...)
48. 48. response Object extends the same super class of request it's a read-write dictionary (request is read-only) usually aﬀects the browser behavior
49. 49. Key Attributes in response Object Dictionary-liked  Functions  response.cookies  response.ﬂash()  response.headers  response.toolbar()  response.meta  response.write() response._vars  ! Strings  response.title  response.js  response.delimiters []  response.view  response.status  (more...)
50. 50. Session also the Storage class (same of request, response) the same user + the same time of login session
51. 51. Operating Sessions storing into session Python ! ! session.myvariable = "hello" ! retrieving from session Python ! a = session.myvariable
52. 52. Operating Sessions Drops oﬀ all sessions Python ! ! session.forget(response) ! Made sessions only be transferred under HTTPS protocol Python ! session.secure()
53. 53. Caching cache has two attributes: cache.ram, cache.disk format: cache(<name>, <function>)
54. 54. Caching in Memory Python ! def cache_in_ram(): import time t = cache.ram('time', lambda: time.ctime(), time_expire=5) return dict(time=t, link=A('click me', _href=request.url)) the output of lambda: time.ctime() is cached for 5 secs 'time' is used as the caching key
55. 55. Responding HTTP() redirect() URL()
56. 56. HTTP() It's an exception, need to be raised determine the http responding status code   e.g. 404, 500 HTTP(<status code>, <message>) Python ! def page_not_found(): raise HTTP(404, 'my message')
57. 57. redirect() redirect(<URL to redirect>) Python ! def index(): redirect("http://www.google.com")
58. 58. URL() generates internal URL path for actions or static ﬁles all arguments will be parsed automatically Python ! URL('f') >>> "/[application]/[controller]/f" ! URL('f', args=['x', 'y'], vars=dict(z='t')) >>> "/[application]/[controller]/f/x/y?z=t"
59. 59. If you want to redirect to any application Python ! redirect(URL('f', args=['x', 'y'], vars=dict(z='t')))
60. 60. The Views
61. 61. HTML Helpers generate any HTML tag in Python format _ preﬁxed argument as html attribute Template ! {{=DIV('thisisatest', _id='123', _class='myclass')}} ! -> <div id="123" class="myclass">thisisatest</div>
62. 62. Template Basic Syntax for ... in while if ... elif ... else try ... except ... else ... ﬁnally def .... return
63. 63. for ... in {{pass}} as ending Template Rendered ! ! {{items = ['a', 'b', 'c']}} <ul> {{for item in items:}}<li>{{=item}}</li>{{pass}} </ul> <ul> <li>a</li> <li>b</li> <li>c</li> </ul> !
64. 64. while the condition expression needs to be given Template Rendered ! ! {{k = 3}} <ul> {{while k > 0:}}<li>{{=k}}{{k = k - 1}}</ li>{{pass}} </ul> <ul> <li>3</li> <li>2</li> <li>1</li> </ul> !
65. 65. if ... elif ... else Template Rendered ! ! {{ import random k = random.randint(0, 100) }} <h2> {{=k}} {{if k % 4 == 0:}}is divisible by 4 {{elif k % 2 == 0:}}is even {{else:}}is odd {{pass}} </h2> <h2> 64 is divisible by 4 </h2> ! !
66. 66. try ... except ... else ... ﬁnally Template Rendered ! ! {{try:}} Hello {{= 1 / 0}} {{except:}} division by zero {{else:}} no division by zero {{finally}} <br /> {{pass}} Hello division by zero <br /> !
67. 67. def ... return Template Rendered ! ! {{def itemize(link):}} <li><a href="http://{{=link}}">{{=link}}</a></li> {{return}} <ul> {{itemize('www.google.com')}} </ul> <ul> <li><a href="http:/www.google.com">www.google.com</ a></li> </ul>
68. 68. Database
69. 69. Abstraction Layer In web2py, database operation has been abstracted into Python objects No SQL needed, but the conception of SQL is still important deﬁne your models in Models ﬁles
70. 70. Connection SQLite is ﬁle-based database which is widely used in development scheme: sqlite://<filename> Python ! db = DAL('sqlite://storage.db') !
71. 71. Creating Tables db.define_table(table_name, field1, field2 ... ) Python ! db.define_table( 'purchase', Field('buyer_id', db.person), Field('product_id', db.product), Field('quantity', 'integer'), format = '%(quantity)s %(product_id)s -> %(buyer_id)s') !
72. 72. Query conditions as query, connected with a "|" Python ! my_query = (db.mytable.myfield != None) | (db.mytable.myfield > 'A') rows = db(my_query).select() ! for row in rows: print row.myfield ! !
73. 73. Insert db.<table>.insert db.<table>.bulk_insert Python ! >>> db.person.insert(name="Alex") 1 >>> db.person.insert(name="Bob") 2 ! >>> db.person.bulk_insert([{'name':'Alex'}, {'name':'John'}, {'name':'Tim'}]) [3,4,5]
74. 74. Transaction db.commit() db.rollback() rollback will ignore all operations since the last commit
75. 75. Transaction Example commit one more time to make changes to database Python ! db.commit() try: db.person.insert(name="bob") except: db.rollback() else: db.commit() !
76. 76. Practice & Resource of Web2py
77. 77. Practices From the online web2py book 03 Overview 04 The core 05 The views 06 The database abstraction layer 07 Forms and validators
78. 78. Resources Quick Examples (Snippets)  http://www.web2py.com/examples/default/examples Online Book (free)  http://web2py.com/books/default/chapter/29/00/preface Python Cheat-sheet  http://rgruet.free.fr/PQR26/PQR2.6_modern_a4.pdf
79. 79. Open Source Project Contribution
80. 80. Discussion is important mailing list documentation IRC Channel STFW & RTFM & GIYF
81. 81. Git version control system coding history distributed version control Github http://www.slideshare.net/littleq0903/introduction-to-git-10706480
82. 82. Google Summer of Code Sahana is the accepted organization again and again and again.... Google pays you if you spend your summer for coding Idea Page Idea -> Proposal -> get a mentor -> coding https://developers.google.com/open-source/soc/
83. 83. Thanks Good luck to your development