SlideShare a Scribd company logo
Web2py:
Web development like a boss
Francisco Gama Tabanez Ribeiro
Agenda
‣ my path on web dev - lessons learned
‣ web2py web framework:
‣ intro
‣ internals
‣ live demo - building a WiKi
‣ resources
view source
web2py:Web development like a boss
web2py:Web development like a boss
web2py:Web development like a boss
1999 - Lisbon,
Portugal
web2py:Web development like a boss
web2py:Web development like a boss
1
0 1 11 01
01
0 0
1
5 years later...
PHP?
Python is well designed, PHP is not:
Although it’s perfectly possible to write good
code in PHP,
it’s much easier to write great code in Python
from Why PHP Is Fun and Easy But Python Is Marriage
Material
Perl?
• LUKE: Is Perl better than Python?
• YODA: No... no... no. Quicker, easier, more seductive.
• LUKE: But how will I know why Python is better than Perl?
• YODA:You will know. . .
When your code you try to read six months from now.
Ruby?
Beautiful is better than ugly.
[...]
Although practicality beats purity.
from The Zen of Python
web2py:Web development like a boss
web2py:Web development like a boss
?
?
lessons learned (1/2)
• rapid turnaround
• secure by design
• web development is mostly about visual UI’s
• relies mostly on user interaction & feedback
• convention over configuration
• flexible as in hackable
lessons learned (2/2)
• fast and efficient but mostly scalable and stable
• different things come in different places
• plays well with others
• backward compatibility assured
• live community & support resources
• fun
web2py:Web development like a boss
Welcome to the club!
founder: Massimo Di Pierro
main contributors: +80
users: +2000
Install and run...
Install and run...
curl -O http://www.web2py.com/examples/static/web2py_src.zip
why?
• easy to run, install and play with
• python based
• web IDE included
• web based database admin
• no dependencies, no configuration required
• multiple platform (GAE, EC2, Jython...)
why?
• Open source (LGPLv3 license)
• web2py applications have no license constraints
• web2py allows application bytecode compilation
• always backward compatible
• deployment-friendly...
deployment..
• always backward
compatible
• integrates well with web
servers (cgi, fcgi,
mod_python, mod_wsgi)
• error logging and
ticketing support
• Database Abstraction
Layer integrated
• integrated versioning
• integrated self-update
capability
• multiple caching
methods
• testing methods and
debug shell
what else?
• secure (against XSS, Injection flaws, RFI)
• SSL and multiple authentication methods
• enforces good Software Engineering practices (MVC,
Server-side form validation, postbacks...)
• Internationalization support
• HTML/XML, RSS/ATOM, RTF, PDF, JSON, AJAX
(includes jQuery), XML-RPC, CSV, REST, WIKI, Flash/
AMF, and Linked Data (RDF)
Web based
Admin Interface
Hello World
def hello1():
return "Hello World"
controllers/simple_examples.py
Olá Mundo
(Translation)
def hello2():
return T("Hello World")
controllers/simple_examples.py
Controller-View
def hello3():
return dict(message=T("Hello World"))
{{extend 'layout.html'}}
<h1>{{=message}}</h1>
controllers/simple_examples.py
views/hello3.html
View
{{extend 'layout.html'}}
<h1>{{=message}}</h1>
<html>
<head>
<title>example</title>
</head>
<body>
{{include}}
</body>
</html>
views/
views/hello3.html
Web2py: flow
Web2py: inside
Web2py: inside
Python
Web2py: inside
Python
rocket
(SSL enabled web server)
API for third party servers
(Apache,...)
Web2py: inside
Python
rocket
(SSL enabled web server)
API for third party servers
(Apache,...)
Core libraries
(HTTP request/response, session,
auth, services, DAL,...)
Contrib
(simplejson, markdown,
memcache, pyrtf, rss,...)
Web2py: inside
Python
rocket
(SSL enabled web server)
API for third party servers
(Apache,...)
Core libraries
(HTTP request/response, session,
auth, services, DAL,...)
User Applications
admin welcome user app
Contrib
(simplejson, markdown,
memcache, pyrtf, rss,...)
examples
Web2py: inside
Python
rocket
(SSL enabled web server)
API for third party servers
(Apache,...)
Core libraries
(HTTP request/response, session,
auth, services, DAL,...)
User Applications
admin welcome user app
Contrib
(simplejson, markdown,
memcache, pyrtf, rss,...)
examples
web2py app inside
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
models
controllers
views
translations
static data
plugins & modules
appadmin
data
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
SQlite
MySQL
PostgreSQL
Oracle
MSSQL
DB2
Firebird
MyBase
Informix
Google App Engine
Database types:
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
string
text
integer
double
date
datetime
time
boolean
password
upload
blob
reference
list:string
list:interger
list:reference
Field types:
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
db.recipe.title.requires=IS_NOT_EMPTY()
db.recipe.category.requires=IS_IN_DB(db,'category.id','category.name')
db.category.name.requires=IS_NOT_IN_DB(db,'category.name')
db.recipe.description.default='Fill your recipe in here...'
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
db = SQLDB(‘sqlite://data.db’)
db.define_table(‘category’,
Field(‘name’))
db.define_table(‘recipe’,
Field(‘title’),
Field(‘category’,db.category),
Field(‘description’,‘text’))
db.recipe.title.requires=IS_NOT_EMPTY()
db.recipe.category.requires=IS_IN_DB(db,'category.id','category.name')
db.category.name.requires=IS_NOT_IN_DB(db,'category.name')
db.recipe.description.default='Fill your recipe in here...'
IS_DATE
IS_DATETIME
IS_DATETIME_IN_RANGE
IS_DATE_IN_RANGE
IS_DECIMAL_IN_RANGE
IS_EMAIL
IS_EMPTY_OR
IS_EQUAL_TO
IS_EXPR
IS_FLOAT_IN_RANGE
IS_GENERIC_URL
IS_HTTP_URL
IS_IMAGE
IS_INT_IN_RANGE
IS_IN_DB
IS_IN_SET
IS_IN_SUBSET
IS_IPV4
IS_LENGTH
IS_LIST_OF
IS_LOWER
IS_MATCH
IS_NOT_EMPTY
IS_NOT_IN_DB
IS_NULL_OR
IS_SLUG
IS_STRONG
IS_TIME
IS_UPLOAD_FILENAME
IS_UPPER
IS_URL
IS_ALPHANUMERIC
Validators:
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
def index():
return dict(recipes=db().select(db.recipe.ALL))
def add():
form=SQLFORM(db.recipe)
if form.accepts(request.vars):
redirect(URL(r=request,f='index'))
return dict(form=form)
def show():
recipes=db(db.recipe.id==request.args[0]).select()
if not len(recipes):
redirect(URL(r=request,f='index'))
return dict(recipe=recipes[0])
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
in file views/default/add.html:
{{extend 'layout.html'}}
<h1>{{T(‘New recipe’)}}</h1>
{{=form}}
in file views/default/index.html:
{{extend 'layout.html'}}
<h1> {{T(‘List all recipes’)}} </h1>
<table>
{{for recipe in recipes:}}
<tr><td>{{=A(T(recipe.title),_href=URL(r=request,f='sh
ow', args=recipe.id))}}</td></tr>
{{pass}}
</table>
in file views/default/show.html:
{{extend 'layout.html'}}
<h1> {{=T(recipe.title)}}
{{=db.recipe.category.represent(recipe.category)}}
</h1>
<pre> {{=recipe.description}}</pre>
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
T(‘New recipe’)
T(‘List all recipes’)
T(recipe.title)
‘Nova receita’
‘Nouvelle receité’
...
‘Listar receitas’
‘Lister receité’
...
‘bitoque’
‘duple cliché’
...
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
images
css
js
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
ways to extend your apps:
• modules are good way to import external
code
• plugins are applications subsets - a small
application “inside” your application
web2py app inside
models
controllers
views
translations
static data
plugins & modules
appadmin
data
web2py app inside
• databases (SQlite, MySQL, PostgreSQL,
Oracle, MSSQL, DB2, Firebird, MyBase,
Informix, Google App Engine)
• metadata for automatic migrations
• cache
models
controllers
views
translations
static data
plugins & modules
appadmin
data
default web based interface to your data
web2py app inside
web2py URL parsing
http://www.myhost.com:8000/myapp/default/index.html/a/b/c?name=Max
request.application = “myapp”
request.controller = “default”
request.function = “index”
request.extension = “html”
request.args = [‘a’,’b’,’c’]
request.vars.name = “Max”
Environment variables
are in request.env
equivalent to
request.vars[‘name’]
• functions in controllers return dicts() into views
• controller methods are exposed to views with the
same name which is also used in the URL
• input validators (forms) are defined in the model as
integrity constraints (requires)
• DAL automatically creates the id field in your tables
• model code has full application scope
remember..
remember..
• you can use your editor of choice
• you can use DAL separately
• in controller functions you can redefine the target
view with response.view=”theme/myview.html”
• web2py shell is your friend
• recommended - start your files with:
# coding: utf8
sessions
<html>
<head></head>
<body>
<h1>{{=message}}</h1>
<h2>Number of visits: {{=counter}}</h2>
</body>
</html>
def index():
session.counter = (session.counter or 0) + 1
return dict(message="Hello from MyApp", counter=session.counter)
inside controller:
inside view:
Overview
DAL select()
db(query).select(
field1, field2, ...,
left=[db.table.on(query)],
orderby=field|~field,
groupby=field|field
limitby=(0,10),
cache=(cache.ram,5000))
Examples:
rows = db(db.recipe).select()
rows = db(db.recipe.id>0).select(
db.recipe.title, db.recipe.category,
orderby = db.recipe.category,
distinct=True)
# christmas recipes from 2000
query1 = db.recipe.created_in.year()>2000
query2 = db.recipe_created_in.month()<10
rows = db(query1 & query2).select()
DAL select()
db(query).select(
field1, field2, ...,
left=[db.table.on(query)],
orderby=field|~field,
groupby=field|field
limitby=(0,10),
cache=(cache.ram,5000))
Examples:
rows = db(db.recipe).select()
rows = db(db.recipe.id>0).select(
db.recipe.title, db.recipe.category,
orderby = db.recipe.category,
distinct=True)
# christmas recipes from 2000
query1 = db.recipe.created_in.year()>2000
query2 = db.recipe_created_in.month()<10
rows = db(query1 & query2).select()
equivalent to:
rows = db(db.recipe.id>0).select(db.recipe.ALL)
DAL select()
db(query).select(
field1, field2, ...,
left=[db.table.on(query)],
orderby=field|~field,
groupby=field|field
limitby=(0,10),
cache=(cache.ram,5000))
Examples:
rows = db(db.recipe).select()
rows = db(db.recipe.id>0).select(
db.recipe.title, db.recipe.category,
orderby = db.recipe.category,
distinct=True)
# christmas recipes from 2000
query1 = db.recipe.created_in.year()>2000
query2 = db.recipe_created_in.month()<10
rows = db(query1 & query2).select()
equivalent to:
rows = db(db.recipe.id>0).select(db.recipe.ALL)
queries can be combined with and(&), or(|) and not(~)
DAL operations
• Insert:
db.category.insert(name=‘soup’)
• Update:
db(db.category.name==‘soup’).update(name=‘french soups’)
• Delete:
db(db.category.name==‘french soups’).delete()
• Count:
db(db.category.name.like(‘%soup%’)).count()
DAL operations
• Insert:
db.category.insert(name=‘soup’)
• Update:
db(db.category.name==‘soup’).update(name=‘french soups’)
• Delete:
db(db.category.name==‘french soups’).delete()
• Count:
db(db.category.name.like(‘%soup%’)).count()
Other operators:
.max(), .min(), .sum(), .bel
ongs(), .like(),...
DAL operations
• Insert:
db.category.insert(name=‘soup’)
• Update:
db(db.category.name==‘soup’).update(name=‘french soups’)
• Delete:
db(db.category.name==‘french soups’).delete()
• Count:
db(db.category.name.like(‘%soup%’)).count()
Other operations:
transactions, inner joins, left outer joins, nested selects, self-references, many2many, ...
Other operators:
.max(), .min(), .sum(), .bel
ongs(), .like(),...
Forms
• SQLFORM() / SQLFORM.factory()
• FORM()
• CRUD()
• <form></form>
HTML helpers (form)
def display_form():
form=FORM('Your name:',
INPUT(_name='name', requires=IS_NOT_EMPTY()),
INPUT(_type='submit'))
if form.accepts(request.vars, session):
response.flash = form.vars.name +', thank you'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill the form'
return dict(form=form)
...
<div class="flash">{{=response.flash or ''}}</div>
{{=form}}
...
inside controller:
inside view:
Components
LOAD()
{{=LOAD(‘controller’,‘function’, ajax=True)}}
Components
LOAD()
{{=LOAD(‘controller’,‘function’, ajax=True)}}
supports auth signatures
web2py Shell
python web2py.py -S myapplication -M
HTML helpers
• BEAUTIFY(whatever)
• URL('application', 'controller', 'function',
args=['x', 'y'], vars=dict(z='t'))
• much more... /application/controller/function/x/y?z=t
Authentication &
Authorization (Role-based)
Authentication &
Authorization (Role-based)
doc_id = db.document.insert(body = 'top secret')
agents = auth.add_group(role = 'Secret Agent')
auth.add_membership(agents, james_bond)
auth.add_permission(agents, 'read', secrets)
auth.has_permission('read', secrets, doc_id, james_bond)
auth.has_permission('update', secrets, doc_id, james_bond)
auth.is_logged_in()
Authentication &
Authorization (Role-based)
@auth.requires_login()
@auth.requires_membership(agents)
@auth.requires_permission('read', secrets)
@auth.requires_permission('delete', 'any file')
@auth.requires(auth.user_id==1 or request.client=='127.0.0.1')
@auth.requires_permission('add', 'number')
you also have:
agents = auth.add_group(role = 'Secret Agent')
auth.add_membership(agents, james_bond)
auth.add_permission(agents, 'read', secrets)
@service.csv
@service.rss
@service.xml
def list_recipes():
return db(db.recipe).select()
@service.run
@service.csv
@service.rss
@service.json
@service.jsonrpc
@service.xml
@service.xmlrpc
@service.soap
@service.amfrpc3('domain')
Services
http://myhost/application/controller/list_recipes.xml
@service.csv
@service.rss
@service.xml
def list_recipes():
return db(db.recipe).select()
@service.run
@service.csv
@service.rss
@service.json
@service.jsonrpc
@service.xml
@service.xmlrpc
@service.soap
@service.amfrpc3('domain')
Services
http://myhost/application/controller/list_recipes.xml
.csv
...
.json
@service.csv
@service.rss
@service.xml
def list_recipes():
return db(db.recipe).select()
@service.run
@service.csv
@service.rss
@service.json
@service.jsonrpc
@service.xml
@service.xmlrpc
@service.soap
@service.amfrpc3('domain')
Services
http://myhost/application/controller/list_recipes.xml
.csv
...
.json
Errors (ticketing)
errors/exceptions are logged into tickets
Other
• Cron
• Routes
• Plugins
• Modules
• Grids
Caching in functions:
@cache("key",cache.ram,5000)
def f(): return dict()
Caching actions/views:
@cache(request.env.path_info,5000,cache.ram)
def action():
return response.render(response.view,dict())
could be:
cache.ram, cache.disk, cache.memcache
demoWiki
demoWiKi app
(features)
• add pages
• show pages
• edit pages
• versioning
• authentication
(local and remote)
• internationalization
• comments
(with/without AJAX)
demoWiKi app
(model)
web2py in real life
Francisco Costa
Documentation (1/2)
• online book (www.web2py.com/book)
• book (printed version - amzn.to/vzjiqT)
• screencasts (www.vimeo.com)
• interactive examples (default app)
• AlterEgo (FAQ - www.web2py.com/AlterEgo)
Documentation (2/2)
• epydoc
(www.web2py.com/examples/static/epydoc/)
• API:
(www.web2py.com/book/default/chapter/
04#API)
Community (1/2)
• free web2py appliances
(www.web2py.com/appliances)
• code snippets (www.web2pyslices.com)
• groups:
• users - http://groups.google.com/group/web2py/
• developers - http://groups.google.com/group/web2py-developers
Community (2/2)
• #web2py (IRC channel at irc.freenode.net)
• twitter (http://twitter.com/web2py)
• user voice (http://web2py.uservoice.com)
• web2py websites (www.web2py.com/
poweredby)
• web2py plugins (www.web2py.com/plugins/)
Thank you
childish wont-let-go nickname: blackthorne
blackthorne (geek)
bthorne_daily (social)
francisco@ironik.org
(PGP key: 0xBDD20CF1)
http://www.digitalloft.org
(homepage)
web2py app defaults
• menu
• web2py_ajax (jQuery)
• auth, mail, download and services
• english default lang translation
• generic view
Ad

More Related Content

What's hot (20)

Building a Dynamic Website Using Django
Building a Dynamic Website Using DjangoBuilding a Dynamic Website Using Django
Building a Dynamic Website Using Django
Nathan Eror
 
Filling the flask
Filling the flaskFilling the flask
Filling the flask
Jason Myers
 
Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18
Lar21
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
Haiqi Chen
 
Flask patterns
Flask patternsFlask patterns
Flask patterns
it-people
 
Flask – Python
Flask – PythonFlask – Python
Flask – Python
Max Claus Nunes
 
Wt unit 5
Wt unit 5Wt unit 5
Wt unit 5
team11vgnt
 
Overview of PHP and MYSQL
Overview of PHP and MYSQLOverview of PHP and MYSQL
Overview of PHP and MYSQL
Deblina Chowdhury
 
PHP 7 Crash Course - php[world] 2015
PHP 7 Crash Course - php[world] 2015PHP 7 Crash Course - php[world] 2015
PHP 7 Crash Course - php[world] 2015
Colin O'Dell
 
Building Content Types with Dexterity
Building Content Types with DexterityBuilding Content Types with Dexterity
Building Content Types with Dexterity
David Glick
 
Laravel 5
Laravel 5Laravel 5
Laravel 5
Sudip Simkhada
 
Datagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and BackgridDatagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and Backgrid
eugenio pombi
 
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREYBUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
CodeCore
 
ACL in CodeIgniter
ACL in CodeIgniterACL in CodeIgniter
ACL in CodeIgniter
mirahman
 
Php on the Web and Desktop
Php on the Web and DesktopPhp on the Web and Desktop
Php on the Web and Desktop
Elizabeth Smith
 
Salesforce CLI Cheat Sheet
Salesforce CLI Cheat Sheet Salesforce CLI Cheat Sheet
Salesforce CLI Cheat Sheet
Keir Bowden
 
Rest in flask
Rest in flaskRest in flask
Rest in flask
Yehor Nazarkin
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
ZendCon
 
Kyiv.py #17 Flask talk
Kyiv.py #17 Flask talkKyiv.py #17 Flask talk
Kyiv.py #17 Flask talk
Alexey Popravka
 
Jumpstart Django
Jumpstart DjangoJumpstart Django
Jumpstart Django
ryates
 
Building a Dynamic Website Using Django
Building a Dynamic Website Using DjangoBuilding a Dynamic Website Using Django
Building a Dynamic Website Using Django
Nathan Eror
 
Filling the flask
Filling the flaskFilling the flask
Filling the flask
Jason Myers
 
Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18Flask - Backend com Python - Semcomp 18
Flask - Backend com Python - Semcomp 18
Lar21
 
Django Architecture Introduction
Django Architecture IntroductionDjango Architecture Introduction
Django Architecture Introduction
Haiqi Chen
 
Flask patterns
Flask patternsFlask patterns
Flask patterns
it-people
 
PHP 7 Crash Course - php[world] 2015
PHP 7 Crash Course - php[world] 2015PHP 7 Crash Course - php[world] 2015
PHP 7 Crash Course - php[world] 2015
Colin O'Dell
 
Building Content Types with Dexterity
Building Content Types with DexterityBuilding Content Types with Dexterity
Building Content Types with Dexterity
David Glick
 
Datagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and BackgridDatagrids with Symfony 2, Backbone and Backgrid
Datagrids with Symfony 2, Backbone and Backgrid
eugenio pombi
 
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREYBUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
BUILDING MODERN PYTHON WEB FRAMEWORKS USING FLASK WITH NEIL GREY
CodeCore
 
ACL in CodeIgniter
ACL in CodeIgniterACL in CodeIgniter
ACL in CodeIgniter
mirahman
 
Php on the Web and Desktop
Php on the Web and DesktopPhp on the Web and Desktop
Php on the Web and Desktop
Elizabeth Smith
 
Salesforce CLI Cheat Sheet
Salesforce CLI Cheat Sheet Salesforce CLI Cheat Sheet
Salesforce CLI Cheat Sheet
Keir Bowden
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
ZendCon
 
Jumpstart Django
Jumpstart DjangoJumpstart Django
Jumpstart Django
ryates
 

Viewers also liked (20)

Using web2py's DAL in other projects or frameworks
Using web2py's DAL in other projects or frameworksUsing web2py's DAL in other projects or frameworks
Using web2py's DAL in other projects or frameworks
Bruno Rocha
 
Web2py
Web2pyWeb2py
Web2py
Lucas D
 
Luis Grangeia IBWAS
Luis Grangeia IBWASLuis Grangeia IBWAS
Luis Grangeia IBWAS
Luis Grangeia
 
Plantillas para la creación de material docente accesible con herramientas of...
Plantillas para la creación de material docente accesible con herramientas of...Plantillas para la creación de material docente accesible con herramientas of...
Plantillas para la creación de material docente accesible con herramientas of...
Mireia Alcala
 
LaTeX sin dolor.
LaTeX sin dolor.LaTeX sin dolor.
LaTeX sin dolor.
Walter Vargas
 
5-Beamer: Creación de presentaciones con LaTeX
5-Beamer: Creación de presentaciones con LaTeX5-Beamer: Creación de presentaciones con LaTeX
5-Beamer: Creación de presentaciones con LaTeX
Digna González
 
Desenvolvendo mvp com python
Desenvolvendo mvp com pythonDesenvolvendo mvp com python
Desenvolvendo mvp com python
Bruno Rocha
 
Gestión de datos de investigación: trabajo cooperativo en las bibliotecas de ...
Gestión de datos de investigación: trabajo cooperativo en las bibliotecas de ...Gestión de datos de investigación: trabajo cooperativo en las bibliotecas de ...
Gestión de datos de investigación: trabajo cooperativo en las bibliotecas de ...
CSUC - Consorci de Serveis Universitaris de Catalunya
 
Leadership Step-by-Step #1
Leadership Step-by-Step #1Leadership Step-by-Step #1
Leadership Step-by-Step #1
Hugo Macedo
 
Didgeridoo and Education
Didgeridoo and EducationDidgeridoo and Education
Didgeridoo and Education
Rodrigo Viterbo
 
Pitch Like a Boss
Pitch Like a BossPitch Like a Boss
Pitch Like a Boss
Inês Silva
 
Pensar Digital
Pensar DigitalPensar Digital
Pensar Digital
Rui Rocha Costa
 
Easypay generica en
Easypay generica enEasypay generica en
Easypay generica en
Joaquim Silva
 
Set n'match
Set n'matchSet n'match
Set n'match
Pedro Santos
 
Como produzir um artigo de referencia para a wikipedia (manuel de sousa)
Como produzir um artigo de referencia para a wikipedia (manuel de sousa)Como produzir um artigo de referencia para a wikipedia (manuel de sousa)
Como produzir um artigo de referencia para a wikipedia (manuel de sousa)
Manuel de Sousa
 
ShopAlikePT_March2016_PT_Presentation
ShopAlikePT_March2016_PT_PresentationShopAlikePT_March2016_PT_Presentation
ShopAlikePT_March2016_PT_Presentation
Pedro de Almeida
 
Bash Introduction
Bash IntroductionBash Introduction
Bash Introduction
André Santos
 
Scheduled releases @ Commit Porto 2016
Scheduled releases @ Commit Porto 2016Scheduled releases @ Commit Porto 2016
Scheduled releases @ Commit Porto 2016
Fábio Oliveira
 
[Brazil] guia internet_marketing (1)
[Brazil] guia internet_marketing (1)[Brazil] guia internet_marketing (1)
[Brazil] guia internet_marketing (1)
Ricardo Belchior
 
Using web2py's DAL in other projects or frameworks
Using web2py's DAL in other projects or frameworksUsing web2py's DAL in other projects or frameworks
Using web2py's DAL in other projects or frameworks
Bruno Rocha
 
Plantillas para la creación de material docente accesible con herramientas of...
Plantillas para la creación de material docente accesible con herramientas of...Plantillas para la creación de material docente accesible con herramientas of...
Plantillas para la creación de material docente accesible con herramientas of...
Mireia Alcala
 
5-Beamer: Creación de presentaciones con LaTeX
5-Beamer: Creación de presentaciones con LaTeX5-Beamer: Creación de presentaciones con LaTeX
5-Beamer: Creación de presentaciones con LaTeX
Digna González
 
Desenvolvendo mvp com python
Desenvolvendo mvp com pythonDesenvolvendo mvp com python
Desenvolvendo mvp com python
Bruno Rocha
 
Leadership Step-by-Step #1
Leadership Step-by-Step #1Leadership Step-by-Step #1
Leadership Step-by-Step #1
Hugo Macedo
 
Didgeridoo and Education
Didgeridoo and EducationDidgeridoo and Education
Didgeridoo and Education
Rodrigo Viterbo
 
Pitch Like a Boss
Pitch Like a BossPitch Like a Boss
Pitch Like a Boss
Inês Silva
 
Como produzir um artigo de referencia para a wikipedia (manuel de sousa)
Como produzir um artigo de referencia para a wikipedia (manuel de sousa)Como produzir um artigo de referencia para a wikipedia (manuel de sousa)
Como produzir um artigo de referencia para a wikipedia (manuel de sousa)
Manuel de Sousa
 
ShopAlikePT_March2016_PT_Presentation
ShopAlikePT_March2016_PT_PresentationShopAlikePT_March2016_PT_Presentation
ShopAlikePT_March2016_PT_Presentation
Pedro de Almeida
 
Scheduled releases @ Commit Porto 2016
Scheduled releases @ Commit Porto 2016Scheduled releases @ Commit Porto 2016
Scheduled releases @ Commit Porto 2016
Fábio Oliveira
 
[Brazil] guia internet_marketing (1)
[Brazil] guia internet_marketing (1)[Brazil] guia internet_marketing (1)
[Brazil] guia internet_marketing (1)
Ricardo Belchior
 
Ad

Similar to web2py:Web development like a boss (20)

Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1
Henry S
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfony
Francois Zaninotto
 
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
François-Guillaume Ribreau
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
Python - A Comprehensive Programming Language
Python - A Comprehensive Programming LanguagePython - A Comprehensive Programming Language
Python - A Comprehensive Programming Language
TsungWei Hu
 
Introduction to Flask Micro Framework
Introduction to Flask Micro FrameworkIntroduction to Flask Micro Framework
Introduction to Flask Micro Framework
Mohammad Reza Kamalifard
 
My Saminar On Php
My Saminar On PhpMy Saminar On Php
My Saminar On Php
Arjun Kumawat
 
Next Generation Spring MVC with Spring Roo
Next Generation Spring MVC with Spring RooNext Generation Spring MVC with Spring Roo
Next Generation Spring MVC with Spring Roo
Stefan Schmidt
 
Php Frameworks
Php FrameworksPhp Frameworks
Php Frameworks
Ryan Davis
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
Antonio Peric-Mazar
 
Codeigniter
CodeigniterCodeigniter
Codeigniter
minhrau111
 
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
Phil Wilkins
 
SOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class LibrariesSOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class Libraries
Vagif Abilov
 
JavaScript on the server - Node.js
JavaScript on the server - Node.jsJavaScript on the server - Node.js
JavaScript on the server - Node.js
Rody Middelkoop
 
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Tom Johnson
 
Introduction to PHP - SDPHP
Introduction to PHP - SDPHPIntroduction to PHP - SDPHP
Introduction to PHP - SDPHP
Eric Johnson
 
Life outside WO
Life outside WOLife outside WO
Life outside WO
WO Community
 
Yii2 by Peter Jack Kambey
Yii2 by Peter Jack KambeyYii2 by Peter Jack Kambey
Yii2 by Peter Jack Kambey
k4ndar
 
Node.js: The What, The How and The When
Node.js: The What, The How and The WhenNode.js: The What, The How and The When
Node.js: The What, The How and The When
FITC
 
Intro to CakePHP
Intro to CakePHPIntro to CakePHP
Intro to CakePHP
Walther Lalk
 
Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1
Henry S
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfony
Francois Zaninotto
 
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
François-Guillaume Ribreau
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
Python - A Comprehensive Programming Language
Python - A Comprehensive Programming LanguagePython - A Comprehensive Programming Language
Python - A Comprehensive Programming Language
TsungWei Hu
 
Next Generation Spring MVC with Spring Roo
Next Generation Spring MVC with Spring RooNext Generation Spring MVC with Spring Roo
Next Generation Spring MVC with Spring Roo
Stefan Schmidt
 
Php Frameworks
Php FrameworksPhp Frameworks
Php Frameworks
Ryan Davis
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
Antonio Peric-Mazar
 
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
Phil Wilkins
 
SOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class LibrariesSOLID Programming with Portable Class Libraries
SOLID Programming with Portable Class Libraries
Vagif Abilov
 
JavaScript on the server - Node.js
JavaScript on the server - Node.jsJavaScript on the server - Node.js
JavaScript on the server - Node.js
Rody Middelkoop
 
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Survival Strategies for API Documentation: Presentation to Southwestern Ontar...
Tom Johnson
 
Introduction to PHP - SDPHP
Introduction to PHP - SDPHPIntroduction to PHP - SDPHP
Introduction to PHP - SDPHP
Eric Johnson
 
Yii2 by Peter Jack Kambey
Yii2 by Peter Jack KambeyYii2 by Peter Jack Kambey
Yii2 by Peter Jack Kambey
k4ndar
 
Node.js: The What, The How and The When
Node.js: The What, The How and The WhenNode.js: The What, The How and The When
Node.js: The What, The How and The When
FITC
 
Ad

Recently uploaded (20)

Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025
Splunk
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
SOFTTECHHUB
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In FranceManifest Pre-Seed Update | A Humanoid OEM Deeptech In France
Manifest Pre-Seed Update | A Humanoid OEM Deeptech In France
chb3
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
Semantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AISemantic Cultivators : The Critical Future Role to Enable AI
Semantic Cultivators : The Critical Future Role to Enable AI
artmondano
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
Electronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploitElectronic_Mail_Attacks-1-35.pdf by xploit
Electronic_Mail_Attacks-1-35.pdf by xploit
niftliyevhuseyn
 
Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025
Splunk
 
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-UmgebungenHCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
HCL Nomad Web – Best Practices und Verwaltung von Multiuser-Umgebungen
panagenda
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
AI EngineHost Review: Revolutionary USA Datacenter-Based Hosting with NVIDIA ...
SOFTTECHHUB
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 

web2py:Web development like a boss