Web Development with Flask and the Raspberry Pi Leading by Example CUAUHTEMOC CARBAJAL ITESM CEM 22/04/2014



Similar documents
CIS 192: Lecture 10 Web Development with Flask

CIS 192: Lecture 10 Web Development with Flask

Flask Documentation. Release

Modern Web Application Framework Python, SQL Alchemy, Jinja2 & Flask

Server-side Development using Python and SQL

Terms and Definitions for CMS Administrators, Architects, and Developers

Elgg 1.8 Social Networking

Creating a generic user-password application profile

Esigate Module Documentation

Flask Web Development. Miguel Grinberg

CommonSpot Content Server Version 6.2 Release Notes

Managing your accounts

Developing ASP.NET MVC 4 Web Applications MOC 20486

Chapter 5 Configuring the Remote Access Web Portal

Developing ASP.NET MVC 4 Web Applications

latest Release 0.2.6

Manage Workflows. Workflows and Workflow Actions

WebIOPi. Installation Walk-through Macros

QualysGuard WAS. Getting Started Guide Version 4.1. April 24, 2015

AdRadionet to IBM Bluemix Connectivity Quickstart User Guide

Outline. Lecture 18: Ruby on Rails MVC. Introduction to Rails

IBM Unica emessage Version 8 Release 6 February 13, User's Guide

Working With Virtual Hosts on Pramati Server

TIBCO ActiveMatrix Service Bus Getting Started. Software Release 2.3 February 2010

BASIC CLASSWEB.LINK INSTALLATION MANUAL

Developing ASP.NET MVC 4 Web Applications Course 20486A; 5 Days, Instructor-led

Ruby on Rails is a web application framework written in Ruby, a dynamically typed programming language The amazing productivity claims of Rails is

SEO Deployment Best Practices

Evaluation. Chapter 1: An Overview Of Ruby Rails. Copy. 6) Static Pages Within a Rails Application

Mojolicious. Marcos Rebelo

LifeSize UVC Video Center Deployment Guide

Vodafone Hosted Services. Getting your . User guide

FileMaker Server 12. FileMaker Server Help

Load testing with. WAPT Cloud. Quick Start Guide

Monitor Your Home With the Raspberry Pi B+

Slides from INF3331 lectures - web programming in Python

Advanced Tornado TWENTYONE Advanced Tornado Accessing MySQL from Python LAB

Web+Center Version 7.x Windows Quick Install Guide 2 Tech Free Version Rev March 7, 2012

Site Configuration Mobile Entrée 4

socketio Documentation

The Django web development framework for the Python-aware

Creating an with Constant Contact. A step-by-step guide

Expanded contents. Section 1. Chapter 2. The essence off ASP.NET web programming. An introduction to ASP.NET web programming

One of the fundamental kinds of Web sites that SharePoint 2010 allows

Sitecore InDesign Connector 1.1

How to Re-Direct Mobile Visitors to Your Library s Mobile App

Advanced Web Development SCOPE OF WEB DEVELOPMENT INDUSTRY

Social Media in Signatures

SECURE MOBILE ACCESS MODULE USER GUIDE EFT 2013

Content Management System

Recreate your Newsletter Content and Layout within Informz (Workshop) Monica Capogna and Dan Reade. Exercise: Creating two types of Story Layouts

Ipswitch Client Installation Guide

Web Application Development

ultimo theme Update Guide Copyright Infortis All rights reserved

WESTERNACHER OUTLOOK -MANAGER OPERATING MANUAL

TIBCO Spotfire Automation Services 6.5. User s Manual

HOW TO CREATE THEME IN MAGENTO 2

Quick Start Guide. Installation and Setup

How To Test Your Web Site On Wapt On A Pc Or Mac Or Mac (Or Mac) On A Mac Or Ipad Or Ipa (Or Ipa) On Pc Or Ipam (Or Pc Or Pc) On An Ip

Chapter 6 Virtual Private Networking Using SSL Connections

CME 193: Introduction to Scientific Python Lecture 8: Unit testing, more modules, wrap up

Shop by Manufacturer Custom Module for Magento

FileMaker Server 13. FileMaker Server Help

Facebook Twitter YouTube Google Plus Website

Force.com Sites Implementation Guide

CrownPeak Platform Dashboard Playbook. Version 1.0

Administrator s Guide

Virtual Office Module. View Calendar. Add Personal Event. Add Global Event. View All. View Personal

Getting Started Guide with WIZ550web

RoboMail Mass Mail Software

Cache Configuration Reference

Web [Application] Frameworks

Your Blueprint websites Content Management System (CMS).

7 Why Use Perl for CGI?

Code::Blocks Student Manual

WebSpy Vantage Ultimate 2.2 Web Module Administrators Guide

SPHOL326: Designing a SharePoint 2013 Site. Hands-On Lab. Lab Manual

WEBMAIL User s Manual

Kentico Site Delivery Checklist v1.1

Beginning Web Development with Node.js

FileMaker Server 10 Help

FileMaker Server 14. FileMaker Server Help

Administration Quick Start

How To Build An Intranet In Sensesnet.Com

Training module 2 Installing VMware View

Electronic Ticket and Check-in System for Indico Conferences

CSC9B2 Spring 2015 Web Design Practical 1: Introduction to HTML 5

BlackBerry Enterprise Service 10. Version: Configuration Guide

Ciphermail for BlackBerry Quick Start Guide

User-password application scripting guide

Nginx 1 Web Server Implementation

Oracle Forms Services Secure Web.Show_Document() calls to Oracle Reports Server 6i

JOB READY ASSESSMENT BLUEPRINT WEB DESIGN - PILOT. Test Code: 3750 Version: 01

Xtreeme Search Engine Studio Help Xtreeme

WIRIS quizzes web services Getting started with PHP and Java

Installing and using XAMPP with NetBeans PHP

IERG 4080 Building Scalable Internet-based Services

Quick Start Guide. 1 Copyright 2014 Samanage

Using Internet or Windows Explorer to Upload Your Site

Transcription:

Web Development with Flask and the Raspberry Pi Leading by Example CUAUHTEMOC CARBAJAL ITESM CEM 22/04/2014

Introduction Flask: lightweight web application framework written in Python and based on the Werkzeug WSGI toolkit and Jinja2 template engine Web application framework (WAF) : software framework designed to support the development of dynamic websites, web applications, web services and web resources. Aims to alleviate the overhead associated with common activities performed in web development. For example, many frameworks provide libraries for database access, templating frameworks and session management, and they often promote code reuse.

Introduction Web Server Gateway Interface: specification for simple and universal interface between web servers and web applications or frameworks for the Python programming language. Werkzeug WSGI toolkit: started as a simple collection of various utilities for WSGI applications and has become one of the most advanced WSGI utility modules. It includes a powerful debugger, fully featured request and response objects, HTTP utilities to handle entity tags, cache control headers, HTTP dates, cookie handling, file uploads, a powerful URL routing system and a bunch of community contributed addon modules. Jinja:template engine for the Python programming language

Dynamic web page generation Pages are assembled on the fly as and when they are requested. Most server side languages as PHP, JSP and ASP powered sites do this technology by actively encourages dynamic content creation. Generating pages dynamically allows for all sorts of clever applications, from e-commerce, random quote generators to full on web applications such as Hotmail.

Static web page generation HTML pages are pre-generated by the publishing software and stored as flat files on the web server, ready to be served. This approach is less flexible than dynamic generation in many ways and is often ignored as an option as a result, but in fact the vast majority of content sites consist of primarily static pages and could be powered by static content generation without any loss of functionality to the end user.

Flask microframework Flask: keeps the core simple but extensible: There is no database abstraction layer, form validation, or any other components where third-party libraries already exist to provide common functionality. However, Flask supports extensions, which can add such functionality into an application as if it was implemented in Flask itself. There are extensions for object-relational mappers, form validation, upload handling, various open authentication technologies, and more.

Comparison to other frameworks Time allocated to: PHP-based Python-based

Handling HTTP methods The most common keyword argument to app.route is methods, giving Flask a list of HTTP methods to accept when routing (default: GET) GET: used to reply with information on resource POST: used to receive from browser/client updated information for resource PUT: like POST, but repeat PUT calls on a resource should have no effect DELETE: removes the resource HEAD: like GET, but replies only with HTTP headers and not content OPTIONS: used to determine which methods are available for resource

Installation RPi In order to install Flask, you ll need to have pip installed pip. If you haven t already installed pip, it s easy to do: pi@raspberrypi ~ $ sudo apt-get install python-pip After pip is installed, you can use it to install flask and its dependencies: pi@raspberrypi ~ $ sudo pip install flask

Flask is fun! # hello-flask.py from flask import Flask app = Flask( name ) @app.route('/') def hello_world(): return "Hello World!" Note: don t call your file flask.py if you are interested in avoiding problems. if name == ' main ': app.run(debug=true) TERMINAL 1 $ python hello-flask.py * Running on http://127.0.0.1:5000/ * Restarting with reloader TERMINAL 2 $ midori & $ Gtk-Message: Failed to load module "canberra-gtk-module" $ sudo apt-get install libcanberra-gtk3-module $ midori &

hello-flask

hello-flask app = Flask( name ) When we create an instance of the Flask class, the first argument is the name of the application's module or package When using a single module, use name because this will work regardless of whether name equals ' main ' or the actual import name

hello-flask app.run() The app.run() function runs the application on a local server This will only be visible on your own computer! We will talk about deployment later

Debugging When testing, use app.run(debug=true) Now the server will reload itself on code changes Additionally, you will see error messages in the browser But never leave this on in production!

hello-flask @app.route('/') def hello_world(): return "Hello World!" The app.route('/') decorator tells Flask to call the hello_world() function when the relative URL '/' is accessed. The hello_world() function returns the web page (in this case, a simple string) to be displayed.

More routing

Variable Rules To add variable parts to a URL, use <variable_name> The variables are passed as arguments to the function @app.route('/user/<username>') def greet_user(username): return "Hello %s!" % username

hello-flask3

Variable Rules Multiple URLs can route to the same function: @app.route('/name/<first>') @app.route('/name/<first>/<last>') def greet_name(first, last=none): name = first +' '+ last if last else first return "Hello %s!" % name

hello-flask4

Why we need templates? Let's consider we want the home page of our app to have a heading that welcomes the logged in user. An easy option to output a nice and big heading would be to change our view function to output HTML, maybe something like this:

Why we need templates?

Templating Generating HTML from within Python is not fun, and actually pretty cumbersome because you have to do the HTML escaping on your own to keep the application secure. Consider how complex the code will become if you have to return a large and complex HTML page with lots of dynamic content. And what if you need to change the layout of your web site in a large app that has dozens of views, each returning HTML directly? This is clearly not a scalable option.

Templating Templates to the rescue A web template system uses a template engine to combine web templates to form finished web pages, possibly using some data source to customize the pages or present a large amount of content on similar-looking pages. Flask uses a templating system called Jinja.

Jinja is beautiful! Philosophy: keep the logic of your application separate from the layout or presentation of your web pages Jinja2 allows you to use most of the Python syntax that you are used to, inside of your templates, helping you generate either text or code in a powerful, yet flexible way. We just wrote a mostly standard HTML page, with the only difference that there are some placeholders for the dynamic content enclosed in {{... }} sections. template view function

Rendering Templates To render a template you can use the render_template() method. All you have to do is provide the name of the template and the variables you want to pass to the template engine as keyword arguments. Here s a simple example of how to render a template: Flask will look for templates in the templates folder.

Control statements in templates The Jinja2 templates also support control statements, given inside {%...%} blocks. <!doctype html> <title>hello from Flask</title> {% if name %} <h1>hello {{ name }}!</h1> {% else %} <h1>hello World!</h1> {% endif %}

template-name

hello-template #hello-template.py from couier flask import Flask, render_template import datetime app = Flask( name ) @app.route("/") def hello(): now = datetime.datetime.now() timestring = now.strftime("%y-%m-%d %H:%M") templatedata = { 'title' : 'HELLO!', 'time': timestring } return render_template('main.html', **templatedata) if name == " main ": app.run(host='0.0.0.0', port=80, debug=true)

hello-template RPi $ sudo python hello-template.py PC

Adding a favicon A favicon is an icon used by browsers for tabs and bookmarks. This helps to distinguish your website and to give it a unique brand. How to add a favicon to a flask application? First, of course, you need an icon. It should be 16 16 pixels and in the ICO file format. This is not a requirement but a de-facto standard supported by all relevant browsers. Put the icon in your static directory as favicon.ico. Now, to get browsers to find your icon, the correct way is to add a link tag in your HTML. So, for example: <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}"> That s all you need for most browsers.

Adding a favicon main.html modified from hello-template Python hello-template.py

Template Inheritance The most powerful part of Jinja is template inheritance. Template inheritance allows you to build a base skeleton template that contains all the common elements of your site and defines blocks that child templates can override. Sounds complicated but is very basic. It s easiest to understand it by starting with an example.

Base Template This template, which we ll call template.html, defines a simple HTML skeleton document. It s the job of child templates to fill the empty blocks with content.

Child templates

$ python inheritance.py view file

RPi: hello-gpio Connect two Pushbuttons to GPIO24 and GPIO25 Figure 1 Figure 2 The GPIO.BOARD option specifies that you are referring to the pins by the numbers printed on the board (e.g. P1) and within the green circles in Figure 1. The GPIO.BCM option means that you are referring to the pins by the "Broadcom SOC channel" number, these are the numbers after "GPIO" within the green rectangles in Figure 1.

RPi: hello-gpio File: hello-gpio.py (part 1) File: hello-gpio.py (part 2)

RPi: hello-gpio RPi $ sudo python hello-gpio.py

PC RPi: hello-gpio

RPi: weblamp Connect two LEDs to GPIO24 and GPIO25 GPIO24 coffee maker GPIO25 lamp

RPi: weblamp File: weblamp.py (part 1)

RPi: weblamp File: weblamp.py (part 2) File: weblamp.py (part 3)

RPi: weblamp File: main.html

RPi: weblamp RPi $ sudo python weblamp.py PC