CGI en mod_perl

Spreker: Juerd
Duur: 45 minuten ruim een uur

Dutch Perl Workshop 2004

Werkt waarschijnlijk alleen goed in Mozilla (?:Fire(?:Bird|Fox))? (F11 voor full screen) en andere op Gecko gebaseerde browsers. Bovendien gebruik ik een lettertype dat vast bijna niemand heeft :) De slides zijn gemaakt door een scriptje(text/plain) dat een groot semi-html-bestand gebruikt als bron en alles aan de hand van dit template in losse bestanden zet. The English translation is here.

Inhoud

HTTP

HTTP request

HTTP response

HTTP-misbruik

HTML forms

<form method="POST" action="test.cgi">

HTML > CGI

CGI

Een CGI-script

CGI + HTML

#!/usr/bin/perl -w
use strict;

use CGI;

my $cgi = CGI->new;
print $cgi->header;

if ($cgi->request_method eq 'POST') {
    doe iets;
    print <<'END_OF_HTML';
[[[html>
[[[head>
[[[title>Bedankt![[[/title>
[[[/head>
[[[body>
Hartelijk bedankt voor uw aanmelding!
U ontvangt spoedig een bevestiging
per e-mail.
[[[/body>
[[[/html>
END_OF_HTML
} else {
    print <<'END_OF_HTML';
[[[html>
[[[head>
[[[title>Aanmelden[[[/title>
[[[/head>
[[[body>
Vul onderstaande velden in:[[[br>
Gewenste gebruikersnaam: [[[input type=text name=user>
Wachtwoord: [[[input type=password name=pass>[[[br> Nogmaals: [[[input type=password name=pass> [[[hr> Naam: [[[input type=text name=naam>[[[br> Adres: [[[input type=text name=adres>[[[br> Postcode: [[[input type=text name=postcode>[[[br> Woonplaats: [[[input type=text name=woonplaats> [[[hr> Telefoonnummer: [[[input type=text name=telefoon>[[[br> E-mailadres: [[[input type=text name=mail>[[[br> Homepage URL: [[[input type=text name=url> [[[hr> [[[input type=submit value="Aanvraag versturen"> [[[/body> [[[/html> END_OF_HTML }

CGI.pm kan HTML maken

CGI > Templates

Pagina's in bestanden

#!/usr/bin/perl -w
use strict;

use CGI;
use File::Slurp;

my $cgi = CGI->new;
print $cgi->header;

if ($cgi->request_method eq 'POST') {
    doe iets;
    print read_file 'bedankt.html';
} else {
    print read_file 'aanmelden.html';
}

Flexibeler met templates

Voorbeeld

#!/usr/bin/perl -w
use strict;

use CGI;
use HTML::Template;

my $cgi = CGI->new;
print $cgi->header;

if ($cgi->request_method eq 'POST') {
    doe iets;
    my $template = HTML::Template->new(
        filename => 'bedankt.html'
    );
    $template->param(mail => $cgi->param('mail'));
    print $template->output
} else {
    print read_file 'aanmelden.html';
}

Templating modules

Templates > Wizards

Gebruikersinterface

Wizards: voordelen

Wizards: nadelen

CGI::Application

Wizards > Sessies

POST-problemen

Oplossing: sessies

Een sessie...

Sessies zijn vooral handig voor:

Sessie-id meegeven

Modules

Sessies > Cookies

Cookies

Cookie headers

Cookie maken

use CGI::Cookie;

my $cookie = CGI::Cookie->new(
    -name    => 'session',
    -value   => $session_id,
    -domain  => '.example.com',
    -path    => '/',
    -expires => '+3M'  # 3 maanden
);

print $cgi->header(
    -cookie => $cookie
);

Cookie uitlezen

use CGI::Cookie;

my %cookies = CGI::Cookie->fetch;

Cookies > mod_perl

mod_perl

Eindeloze interpreter: nadelen

Problemen voorkomen

use strict;

Stomme vraag

Wanneer mag je in mod_perl of een module use strict; overslaan?

Stomme vraag

Wanneer mag je in mod_perl of een module use strict; overslaan?

Als je die vraag niet zelf kunt beantwoorden:

NOOIT!

Waarom strict?

CGI scripts in mod_perl

mod_perl

CGI scripts in mod_perl

Overgaan op mod_perl

mod_perl is CGI compatible

... by default

$r

CGI vs mod_perl

mod_perl 'scripts'

Apache::Registry

Een eigen handler

Voorbeeld

package Apache::MijnHandler
use Apache::Constants qw(OK);

sub handler {
    my $r = shift;

    $r->send_http_header('text/plain');
    $r->print('voorbeeld');
    
    return OK;
}

1;

httpd.conf

PerlModule Apache::MijnHandler
  • bijvoorbeeld voor *.qhtml:
    <Files *.qhtml>
    PerlHandler Apache::MijnHandler
    </Files>
  • bijvoorbeeld voor 1 lokatie (ter vervanging van script)
    <Location /foo/bar>
    PerlHandler Apache::MijnHandler
    </Location>
  • Oppassen in mod_perl

    Modules in mod_perl

    mod_perl alternatieven

    mod_perl > einde

    CPAN

    Besproken modules

    Links

    Einde