AWS re:Invent 2016: Chalice: A Serverless Microframework for Python (DEV308)
Micropage in microtime using microframework
-
Upload
radek-benkel -
Category
Technology
-
view
3.907 -
download
1
description
Transcript of Micropage in microtime using microframework
6
name: Radosław Benkel
nick: singles
www: http://www.rbenkel.me
twitter: @singlespl *
* and I have nothing in common with http://www.singles.pl ;]
17
����������� ������������������ "640K����������� ������������������ ought����������� ������������������ to����������� ������������������ be����������� ������������������ enough����������� ������������������ for����������� ������������������ anyone."
18
����������� ������������������ "640K����������� ������������������ ought����������� ������������������ to����������� ������������������ be����������� ������������������ enough����������� ������������������ for����������� ������������������ anyone."
BTW.����������� ������������������ Probably����������� ������������������ he����������� ������������������ didn't����������� ������������������ say����������� ������������������ that:HTTP://QUOTEINVESTIGATOR.COM/2011/09/08/640K-ENOUGH/
"OK,����������� ������������������ OK,����������� ������������������ I����������� ������������������ want����������� ������������������ meat!"
19
read����������� ������������������ as:����������� ������������������ "Show����������� ������������������ me����������� ������������������ some����������� ������������������ code����������� ������������������ please"
Little����������� ������������������ framework����������� ������������������ =����������� ������������������
little����������� ������������������ amount����������� ������������������ of����������� ������������������ "meat"
20
I'LL USE
21
http://www.slimframework.com/
BUT THERE ARE OTHERS:
22
http://flightphp.com/
http://www.limonade-php.net
http://silex.sensiolabs.org/
24
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() { echo 'Hello World from base route.'; });
$app->run();
BASE ROUTING
25
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() { echo 'Hello World from base route.'; });
//param "name" is required$app->get('/hello_to/:name', function($name) { echo 'Hello World to ' . $name;});
$app->run();
REQUIRED PARAM
26
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() { echo 'Hello World from base route.'; });
//when using optional params, you have to define default value for function param$app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name;});
$app->run();
OPTIONAL PARAM
27
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); //create link for route $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;});
$app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name;})->name('hello'); //using name for route
$app->run();
NAMED ROUTES
28
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;});
$app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+')); //use only letters as param 'name'
$app->run();
ROUTE CONDITIONS
29
<?php
require 'Slim/Slim.php';
$app = new Slim();
/* ... */
$app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+'));
//redirect to default hello page$app->get('/redirect', function() use ($app) { $app->redirect($app->urlFor('hello'));});
$app->run();
REDIRECT
30
<?php
require 'Slim/Slim.php';
$app = new Slim();
/* ... */
$app->get('/hello_to(/:name)', function($name = null) { if ($name === null) { $name = 'John Doe'; } echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+'));
//redirect to default hello page as 301, not 302 which is default$app->get('/redirect', function() use ($app) { $app->redirect($app->urlFor('hello'), 301);});
$app->run();
REDIRECT WITH STATUS
31
MIDDLEWARE
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() { //this will be executed before main callable echo "Hello, I'm middleware <br>"; }, function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;});/* ... */$app->run();
32
MIDDLEWARE
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() { //this will be executed before main callable echo "Hello, I'm middleware <br>"; }, function() { //this will be executed before main callable echo "And I'm second middleware <br>"; }, function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;});/* ... */$app->run();
33
MIDDLEWARE
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() { //this will be executed before main callable echo "Hello, I'm middleware <br>"; }, function() { //this will be executed before main callable echo "And I'm second middleware <br>"; }, function() use ($app) { echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('name' => 'Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;});/* ... */$app->run();
And����������� ������������������ so����������� ������������������ on����������� ������������������ -����������� ������������������ everything����������� ������������������ before����������� ������������������ last����������� ������������������ callable����������� ������������������ is����������� ������������������ middleware
34
VIEW
<?php//file index.php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() use ($app) { $url = $app->urlFor('hello', array('name' => 'Jimmy')); //default path is "__DIR__ . /templates" return $app->render('view.php', compact('url')); });/* ... */$app->run();
Hello World from base route. <br>Oh, link to hello page for Jimmy is <a href="<?php echo $url?>"><?php echo $url?></a>
35
HTTP CACHE - ETAG
<?php
require 'Slim/Slim.php';
$app = new Slim();
/* ... */
$app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } //auto ETag based on some id - next request with the same name will return 304 Not Modified $app->etag($name); echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+'));
/* ... */
$app->run();
36
HTTP CACHE - TIME BASED
<?php
require 'Slim/Slim.php';
$app = new Slim();
/* ... */
$app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } $app->lastModified(1327305485); //cache based on time echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+'));
/* ... */
$app->run();
37
FLASH MESSAGE
<?php
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/', function() use ($app) { $url = $app->urlFor('hello', array('name' => 'Jimmy')); return $app->render('view.php', compact('url'));});
//redirect to default page with flash message which will be displayed once$app->get('/redirect', function() use ($app) { $app->flash('info', "You were redirected"); $app->redirect($app->request()->getRootUri());});
$app->run();
<?php echo $flash['info'] ?>Hello World from base route. <br>Oh, link to hello page for Jimmy is <a href="<?php echo $url?>"><?php echo $url?></a>
38
CUSTOM 404<?php
require 'Slim/Slim.php';
$app = new Slim();
//define custom 404 page$app->notFound(function() { echo "I'm custom 404";});
$app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } $possibleNames = array('Leonard', 'Sheldon', 'John Doe'); //when name not found, force 404 page if (array_search($name, $possibleNames) === false) { $app->notFound(); } echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+'));
$app->run();
39
CUSTOM 404<?php
require 'Slim/Slim.php';
$app = new Slim();
//define custom 404 page$app->notFound(function() { echo "I'm custom 404";});
$app->get('/hello_to(/:name)', function($name = null) use ($app) { if ($name === null) { $name = 'John Doe'; } $possibleNames = array('Leonard', 'Sheldon', 'John Doe'); //when name not found, force 404 page if (array_search($name, $possibleNames) === false) { $app->notFound(); } echo 'Hello World to ' . $name;})->name('hello') ->conditions(array('name' => '[A-Za-z]+'));
$app->run();
Custom����������� ������������������ error����������� ������������������ page����������� ������������������ (500)����������� ������������������ also����������� ������������������ possible
40
REST PATHS #1
<?php
require 'Slim/Slim.php';
$app = new Slim();//method name maps to HTTP method$app->get('/article'), function(/* ... */) {});$app->post('/article'), function(/* ... */) {});$app->get('/article/:id/'), function(/* ... */) {});$app->put('/article/:id/'), function(/* ... */) {});$app->delete('/article/:id/'), function(/* ... */) {});
41
REST PATHS #2
<?php
require 'Slim/Slim.php';
$app = new Slim();
//same as previous one$app->map('/article'), function() use ($app) { if ($app->request()->isGet()) { /* ... */ } else if ($app->request()->isPost() { /* ... */ }) else { /* ... */ }})->via('GET', 'POST');$app->map('/article/:id/'), function($id) use ($app) { //same as above})->via('GET', 'PUT', 'DELETE');
43
http://www.slimframework.com/documentation/stable
"But����������� ������������������ I����������� ������������������ can't����������� ������������������ use����������� ������������������ PHP����������� ������������������ 5.3.����������� ������������������ What����������� ������������������ then?"
44
45
PHP 5.2
<?php
require 'Slim/Slim.php';$app = new Slim();
function index() { global $app; echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;}
//last param must return true for is_callable call, so that it's valid$app->get('/', 'index');
/* ... */
$app->run();
46
PHP 5.2
<?php
require 'Slim/Slim.php';$app = new Slim();
function index() { global $app; echo 'Hello World from base route.<br>'; $url = $app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link;}
//last param must return true for is_callable call, so that it's valid$app->get('/', 'index');
/* ... */
$app->run();
Somebody����������� ������������������ said,����������� ������������������ that:����������� ������������������ "everytime,����������� ������������������ when����������� ������������������ you����������� ������������������ use����������� ������������������ global,����������� ������������������ unicorn����������� ������������������ dies"����������� ������������������ ;)����������� ������������������
47
Source: http://tvtropes.org/pmwiki/pmwiki.php/Main/DeadUnicornTrope
So����������� ������������������ ok,����������� ������������������ second����������� ������������������ approach:
48
49
PHP 5.2
<?php
class Controller { public static $app; public static function index() { echo 'Hello World from base route.<br>'; $url = self::$app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }}
require 'Slim/Slim.php';
$app = new Slim();Controller::$app = $app;
//last param must return true for is_callable call, so that it's also valid$app->get('/', array('Controller', 'index'));/* ... */$app->run();
But����������� ������������������ IMHO����������� ������������������ this����������� ������������������ one����������� ������������������ is����������� ������������������ the����������� ������������������ best����������� ������������������ solution:
50
51
PHP 5.2<?php
class Controller { protected $_app; public function __construct(Slim $app) { $this->_app = $app; } public function index() { echo 'Hello World from base route.<br>'; $url = $this->_app->urlFor('hello', array('Jimmy')); $link = sprintf('<a href="%s">%s</a>', $url, $url); echo 'Oh, link to hello page for Jimmy is ' . $link; }}
require 'Slim/Slim.php';
$app = new Slim();$controller = new Controller($app);
//last param must return true for is_callable call, so that it's also valid$app->get('/', array($controller, 'index'));/* ... */$app->run();
SO, DO YOU REALLY NEED THAT ?
52
Source: http://www.rungmasti.com/2011/05/swiss-army-knife/