[Perl] PSGI 입문 제2장 CGI::Session을 PSGI로 무리하게 사용

18840 단어 PerlCgiplackPSGI

이 기사에는 문제가 있습니다.



여기을 읽어보십시오.

오늘의 주제 : CGI :: Session을 PSGI로 무리하게 사용



코 ## 오사라이
  • 전장 PSGI 입문 제1장 환경 변수의 일람을 낸다

  • 배경


  • 새로운 웹 애플리케이션을 작성할 때

  • PCGI 사용해야합니까 Mojolicious 사용해야하는지 고민했습니다.
  • 조사해 보면 세션에 큰 차이가 있었다
  • Plack 세션의 구현은 매우 간단합니다 1
  • Mojolicious 세션은 조금 특별합니다 2
  • 중간을 원해. CGI::Session 을 그대로 이식한 것 같은 것을 사용하고 싶다

  • 해보았다.



    결론부터 먼저 쓰면 이렇게 됩니다.

    Myapp.pl
    use strict;
    use warnings;
    use Carp;
    
    use Plack::App::Path::Router::PSGI;
    use Path::Router;
    use Plack::Request;
    
    use CGI::Session;
    my $session = CGI::Session->new( undef, undef, { Directory => './sessions' } ); # ダミーのセッション
    my $sid = $session->param('CGISESSID') || undef;
    $session->delete(); # ダミーはすぐ消す
    $session = CGI::Session->new( undef, $sid, { Directory => './sessions' } ); # 本セッション
    if ( $session->is_expired() ) { # 期限切れを消して再発行
        $session->delete();
        $session = CGI::Session->new( undef, undef, { Directory => './sessions' } );
    }else{
        $session->expire('+1d');
    }
    
    my $router = Path::Router->new;
    $router->add_route( '/' => target => \&root );
    $router->add_route( '/env' => target => \&env );
    
    # now create the Plack app
    my $app = Plack::App::Path::Router::PSGI->new( router => $router );
    $app->to_app();
    
    sub root {
        my $env = shift;
        my $req = Plack::Request->new($env);
        my %param = %{ $req->body_parameters };
        if( exists $param{'action'} and $param{'action'} eq 'forget' ) {
            $session->param( 'str', '' );
        }elsif( exists $param{'str'} ){
            $session->param( 'str', $param{'str'} );
        }
    
        my $str = $session->param('str') || '';
        return response( $env, <<"END");
    <html><body>
        <h1>セッション管理してみる</h1>
        <form method="POST" action="/" enctype="multipart/form-data">
            <input type="text" name="str" value="$str">
            <button type="submit" name="action" value="remember">記憶</button>
            <button type="submit" name="action" value="forget">消去</button>
        </form>
    </body></html>
    END
    }
    
    sub env {
        my $env = shift;
        my @str;
        while ( my ( $key, $value ) = each %$env ) {
            push @str, "$key = $value" unless ref $value;
        }
        return response( $env,
            join( "<br>\n", '<html><body><h1>環境変数一覧</h1>', sort(@str), '</body></html>')
        );
    }
    
    # サブルーチン
    sub response {
        my $env = shift;
        my $body = shift || croak 'empty body!';
        my %ARG = @_ if @_;
        my $status = $ARG{'-status'} || 200;
        croak "unvalid status: $status" if $status !~ /^\d{3}$/s;
        my $mime = $ARG{'-MIME'} || 'text/html; charset=utf-8';
        my $headers = $ARG{'-headers'} || {};
        my $req = Plack::Request->new($env);
        my $res = $req->new_response($status);
        $res->content_type($mime);
        $res->header(
            'Set-Cookie' => $session->cookie,
            %$headers
        );
        $res->body($body);
        $res->finalize;
    }
    

    결론, Set-Cookie 헤더에 $session->cookie 건네줄 뿐 3 뭐죠. 전혀, 과거의 자산 인계합니다. 전회 소개했다 환경 변수 목록이 몰래 /env로 라우팅됩니다. 점도 주목이에요!
    네, 간단하죠? 당신도 시작하자! PSGI!

    다음 장


  • PSGI 입문 3장 동적 라우팅 구현

  • 홍보



    이 기사는 자발적으로 유료 웹 서비스를 Perl로 쓰고 출시하는 것에 가까워서, 집착한 점이나 눈치채는 것을 공유하는 목적으로 쓰기 시작했습니다.

    이 QR 코드를 스마트폰으로 읽고,
    흥미를 가진 분은 h tps : // q로 w응. 메까지 꼭 들러 주세요!




    Plack::Middleware::Session에 따르면, expire()조차 단순한 delete 밖에 없다.

    GitHub 에 정중한 일본어 번역이 있습니다.

    Plack::Response 에는 cookies 메소드가 있지만, 어느 쪽인가 하면 원시 쿠키파의 사양으로, 세션 관리에는 적합하지 않다.

    좋은 웹페이지 즐겨찾기