Chinaunix

标题: 本人用Dancer框架写的个人网站源码(+1.3011版代码) [打印本页]

作者: aef25u    时间: 2010-07-22 11:14
标题: 本人用Dancer框架写的个人网站源码(+1.3011版代码)
本帖最后由 aef25u 于 2011-03-28 15:43 编辑

因最近有人反映代码有问题,检查后发现是由于Dancer版本更新引起的:
-------------------------------------------
Dancer最新版本-1.3011请下载此附件(2011-03-28更新): MyDancer.rar (42.7 KB, 下载次数: 350)
-------------------------------------------

这是本人用perl的Dancer+DBI+SQLite+TT实现的网站源码
此附件为旧版Dancer: dancer.rar (35.99 KB, 下载次数: 232)

运行环境:Windows XP、strawberry perl、IE

实现了:
    1、Template::Toolkit、SQLite、Authen::Simple:BI、Dancer::Session::Storable在dancer框架中的简单运用。
    2、javascript+css实现二级导航栏
    3、网站Perl代码着色显示
    4、post方法的注册表单、登陆表单和留言本。

内附(位于dancer目录下):
    start.bat  方便本机运行WEB服务器 (然后在IE中输入http://localhost:3000/)
    SQLite.pl  生成test.db数据库

1、dancer.pl
  1. #!/usr/bin/perl
  2. use DBI;
  3. use Dancer;
  4. use MyDancer;
  5. use Dancer::Plugin::Database;

  6. my @pages = qw(TtExample SqlExample  registerExample loginExample GuesBookExample configExample layoutTT);

  7. #与use MyDancer等同;
  8. #get '/', sub {
  9. #    layout 'main.tt';
  10. #    template 'home';
  11. #};

  12. get '/:page' => sub {
  13.     layout 'main.tt';
  14.     my ($page) = params->{page};
  15.     pass and return false unless grep /$page/, @pages;
  16.     template $page;
  17. };

  18. get '/tt/scalar', sub {
  19.     layout 'main.tt';   
  20.     template 'scalar' =>
  21.       { content => '欢迎您的到来!希望你也会和我一样喜欢上Perl与Dancer!', };
  22. };

  23. get '/tt/table', sub {
  24.     layout 'main.tt';
  25.     my $r = [ { a => 1, b => 2, c => 3, },
  26.               { a => 2, b => 4, c => 6, } ];
  27.     template 'table' => { r => $r, };
  28. };

  29. get '/tt/filter', sub {
  30.     layout 'main.tt';
  31.     template 'filter';
  32. };

  33. get '/Sql/dbiSqlTest', sub {
  34.     layout 'main.tt';
  35.     my $dbh =
  36.       DBI->connect( "dbi:SQLite:dbname=test.db",,,
  37.         { RaiseError => 1, AutoCommit => 1 } );
  38.     my $sth = $dbh->prepare( 'select * from test where id = 1' );
  39.     $sth->execute;
  40.     my @row_ary = $sth->fetchrow_array;
  41.     template 'dbiSqlTest' => { head => 'use DBI', content => $row_ary[1], };
  42. };

  43. get '/Sql/PluginSqlTest', sub {
  44.     layout 'main.tt';
  45.     my $sth = database->prepare( 'select * from test where id = 1' );
  46.     $sth->execute;
  47.     my @row_ary = $sth->fetchrow_array;
  48.     template 'PluginSqlTest',
  49.       {
  50.         head    => 'use Dancer::Plugin::Database',
  51.         content => $row_ary[1],
  52.       };
  53. };

  54. #表单注册
  55. get '/book/register' => sub {
  56.     layout 'login_main';
  57.     template
  58.       'register' => { path => 'GuestBook' },

  59. };

  60. post '/book/register' => sub {
  61.     my $sth =
  62.       database->prepare('SELECT * FROM authentication  WHERE username=?');
  63.     $sth->execute( params->{username} );
  64.     if ( $sth->fetch ) {
  65.         return "User had been registered, sorry";
  66.     }
  67.     $sth = database->prepare('INSERT INTO authentication  VALUES(NULL,?,?,?)');
  68.     $sth->execute(
  69.         params->{username},
  70.         params->{password},
  71.         params->{fmemail},
  72.     );

  73.     session user => params->{username};
  74.     redirect params->{path};

  75. };

  76. #GuestBook
  77. get '/book/GuestBook' => sub {
  78.     layout 'login_main';
  79.     my @myarray;
  80.     my $sth = database->prepare( 'select * from comments order by id asc' );
  81.     $sth->execute;
  82.     while(my @row_ary = $sth->fetchrow_array){
  83.     push @myarray, { user => $row_ary[1], info => $row_ary[2] };
  84.     }

  85.     template 'GuestBook' => {message=>\@myarray};  

  86. };

  87. post '/book/GuestBook' => sub {
  88.     my $username=session('user');
  89.     if (length params->{fmmsg} > 4096) {
  90.       return "Your comment is too long, sorry";
  91.     }
  92.     my $sth =
  93.       database->prepare('INSERT INTO comments  VALUES(NULL,?,?)');
  94.     $sth->execute(
  95.       $username,
  96.       params->{fmmsg},
  97.     );
  98.     session user => $username;
  99.     redirect 'GuestBook';

  100. };

  101. #表单登陆
  102. load_app 'Pamlogin';

  103. dance;
复制代码
2、Pamlogin.pm
  1. package Pamlogin;
  2. use Authen::Simple::DBI;
  3. use Dancer ':syntax';

  4. # will match '/book/*'
  5. prefix '/book';

  6. # will match '/book/login'
  7. get '/login' => sub {
  8.     layout 'login_main';
  9.     template
  10.       'login' => { path => 'GuestBook' },

  11. };

  12. post '/login' => sub {

  13.     my $dbi = Authen::Simple::DBI->new(
  14.         dsn       => 'dbi:SQLite:dbname=test.db',
  15.         statement => 'SELECT password FROM authentication WHERE username = ?'
  16.     );

  17.     if ( $dbi->authenticate( params->{username}, params->{password} ) ) {
  18.         session user => params->{username};
  19.         redirect params->{path};
  20.     }
  21.     else {
  22.         redirect 'login';
  23.     }
  24. };

  25. get '/logout' => sub {
  26.     session->destroy;
  27.     redirect 'GuestBook';
  28. };

  29. true;
复制代码

作者: 兰花仙子    时间: 2010-07-22 11:17
很好。。没用过dancer框架,下来学习下~~{:3_193:}
作者: aef25u    时间: 2010-07-22 11:21
回复 2# 兰花仙子


本人是门外汉,非计算机专业,学perl是兴趣,还请兰花仙子多多指教。
作者: ykredrum    时间: 2010-07-22 22:23
我晕,用cpan安装Dancer失败!
我好像试试
作者: pandaiam    时间: 2011-02-28 18:15
thanks a lot
作者: zhlong8    时间: 2011-02-28 18:16
good
作者: hp_truth    时间: 2011-03-01 09:33
多谢楼主分享, 好好学习
作者: iakuf    时间: 2011-03-01 10:28
太 tm 支持了,近来在让小弟翻译这个,打算项目中用这个
作者: suntoltti    时间: 2011-03-01 10:30
跑起来了,很好。谢谢分享
作者: txh_zyy    时间: 2011-03-01 11:39
我正在学Dancer,谢谢
作者: mitmax    时间: 2011-03-01 17:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: aef25u    时间: 2011-03-01 20:19
本帖最后由 aef25u 于 2011-03-01 20:21 编辑

回复 11# mitmax

安装  Template::Toolkit,  使用时用<%   %>而非[%  % ]
作者: mitmax    时间: 2011-03-03 11:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: aef25u    时间: 2011-03-04 16:58
本帖最后由 aef25u 于 2011-03-04 17:12 编辑

回复 13# mitmax
  1. while ( $sth->fetchrow_array ) {

  2.              $str .= { Type => "$Type", Ip => "$Monitor_Ipaddress", Name => "$ProjectName" } . ",";

  3.         }

  4. ......  

  5.       template 'Mysqldatabase' => { Mysql =>[$str], head => 'use DBI' };
复制代码
以上有错,你试试这样行不行,以下代码未经测试(自已注意将{}补齐):
  1. my @srt;

  2. while ( my @row_ary = $sth->fetchrow_array ) {
  3.             
  4.           push  @srt,{ Type => $row_ary[2], Ip => $row_ary[3], Name => $row_ary[4]} ;   
  5.            #或push  @srt,{ Type => "$Type", Ip => "$Monitor_Ipaddress", Name => "$ProjectName" } ;

  6.         }
  7. ......
  8.         #$re_srt做MysqlQuery()的返回值
  9.         my $re_srt=\@srt;
  10. ......  
  11.      
  12.       template 'Mysqldatabase' => { Mysql =>$status, head => 'use DBI' };
  13.    
复制代码

作者: snriyt    时间: 2011-03-27 19:10
  1. Use of uninitialized value in concatenation (.) or string at /usr/local/share/perl5/Dancer/Session/Storable.pm line 59.
复制代码

作者: aef25u    时间: 2011-03-27 20:21
回复 15# snriyt

模块内部错误,你用cpanm试着再装一下Dancer::Session::Storable。如果不行我也解决不了。
那你就将Dancer.pl数第2行load_app 'Pamlogin注释掉。不过这样留言本注册、登录相关页面就打不开了。
作者: aef25u    时间: 2011-03-28 00:33
本帖最后由 aef25u 于 2011-03-28 00:37 编辑

回复 15# snriyt

检查了下是因为Dancer版本更新引起的错误,请重新下载网站源码,位于1楼的MyDancer附件。
启动文件与数据库文件都调整到:MyDancer/bin内了。

另网站内容仍为旧版Dancer建站的过程,与新版比可能会有差异,MyDancer附件中未做修改,所以仅供参考。
作者: snriyt    时间: 2011-03-28 19:10
ok
作者: snriyt    时间: 2011-03-28 19:25
  1. Error 500
  2. runtime error

  3. Warning caught during route execution: Use of uninitialized value in concatenation (.) or string at /usr/local/share/perl5/Dancer/Session/Storable.pm line 59.

  4. /usr/local/share/perl5/Dancer/Session/Storable.pm around line 59

  5. 56
  6. 57 sub session_file {
  7. 58     my ($id) = @_;
  8. 59     return path(
  9. 60         setting('session_dir'),
  10. 61         setting('session_name') . "_$id.stor"
  11. 62     );
复制代码

作者: snriyt    时间: 2011-03-28 19:26
这个模块是我强制安装上的,安装时测试不通过,有问题不?
作者: longjinjiu    时间: 2011-03-28 22:00
Hi aef25u,
我也碰到"Template is needed by Dancer::Template::TemplateToolkit"错误,怎么解决呢.
作者: snriyt    时间: 2011-03-28 22:45
回复 21# longjinjiu

cpan  install Dancer::Template::TemplateToolkit
作者: longjinjiu    时间: 2011-03-28 23:04
问题是Dancer::Template::TemplateToolkit已经装上了
作者: 2gua    时间: 2011-03-29 08:18
嘢,还真有实践Dancer的,赞一个。
作者: aef25u    时间: 2011-03-29 18:24
回复 21# longjinjiu

cpan App::cpanminus
然后cpanm Template::Toolkit
作者: kingwmj    时间: 2011-03-29 21:48
高手啊。。学习了。
作者: 骡子先生    时间: 2011-03-30 16:25
我在ubuntu上搭建环境,报错。

Error 500
runtime error

Warning caught during route execution: Use of uninitialized value in concatenation (.) or string at /usr/local/share/perl/5.10.0/Dancer/Session/Storable.pm line 59.

/usr/local/share/perl/5.10.0/Dancer/Session/Storable.pm around line 59

56
57 sub session_file {
58     my ($id) = @_;
59     return path(
60         setting('session_dir'),
61         setting('session_name') . "_$id.stor"
62     );

Stack

main in app.pl l. 125
Dancer in /usr/local/share/perl/5.10.0/Dancer.pm l. 331
Dancer::Handler in /usr/local/share/perl/5.10.0/Dancer/Handler.pm l. 171
Dancer::Handler::Standalone in /usr/local/share/perl/5.10.0/Dancer/Handler/Standalone.pm l. 41
HTTP::Server::Simple in /usr/local/share/perl/5.10.0/HTTP/Server/Simple.pm l. 271
HTTP::Server::Simple in /usr/local/share/perl/5.10.0/HTTP/Server/Simple.pm l. 307
HTTP::Server::Simple in /usr/local/share/perl/5.10.0/HTTP/Server/Simple.pm l. 402
HTTP::Server::Simple:SGI in /usr/local/share/perl/5.10.0/HTTP/Server/Simple/PSGI.pm l. 103
HTTP::Server::Simple:SGI in /usr/local/share/perl/5.10.0/HTTP/Server/Simple/PSGI.pm l. 103
Dancer::Handler in /usr/local/share/perl/5.10.0/Dancer/Handler.pm l. 95
Dancer::Handler in /usr/local/share/perl/5.10.0/Dancer/Handler.pm l. 71
Dancer::Handler in /usr/local/share/perl/5.10.0/Dancer/Handler.pm l. 72
Dancer::Renderer in /usr/local/share/perl/5.10.0/Dancer/Renderer.pm l. 23
Dancer::Renderer in /usr/local/share/perl/5.10.0/Dancer/Renderer.pm l. 120
Dancer::Route in /usr/local/share/perl/5.10.0/Dancer/Route.pm l. 155
Dancer::Route in /usr/local/share/perl/5.10.0/Dancer/Route.pm l. 225
Dancer::Object in /usr/local/share/perl/5.10.0/Dancer/Object.pm l. 15
Dancer::Error in /usr/local/share/perl/5.10.0/Dancer/Error.pm l. 29
Dancer::Error in /usr/local/share/perl/5.10.0/Dancer/Error.pm l. 223

Settings

{
  engines  => {},
  plugins  => {
    Database  => {
      password  => 'Hidden (looks potentially sensitive)',
      dsn  => 'dbi:SQLite:dbname=test.db',
      dbi_params  => {
        AutoCommit  => '1',
        RaiseError  => '1'
      },
      username  => ''
    }
  },
  import_warnings  => 1,
  appname  => 'MyDancer',
  views  => '/home/zoomi/MyDancer/views',
  layout  => 'main.tt',
  session  => 'Storable',
  confdir  => '/home/zoomi/MyDancer',
  public  => '/home/zoomi/MyDancer/public',
  show_errors  => '1',
  session_dir  => '/home/zoomi/MyDancer/sessions',
  server  => '0.0.0.0',
  log  => 'core',
  daemon  => 0,
  logger  => 'console',
  warnings  => '1',
  template  => 'template_toolkit',
  access_log  => 1,
  traces  => 0,
  charset  => '',
  appdir  => '/home/zoomi/MyDancer',
  handlers  => {},
  port  => '3000',
  environment  => 'development',
  content_type  => 'text/html',
  apphandler  => 'Standalone',
  auto_reload  => '0'
}


Note: Values of 1 sensitive-looking keys hidden

Session

{
  id  => '443435309633286072277630253886202695'
}

Environment

{
  SCRIPT_NAME  => '',
  SERVER_NAME  => '0.0.0.0',
  'psgi.multiprocess'  => 0,
  HTTP_ACCEPT_ENCODING  => 'gzip,deflate',
  PATH_INFO  => '/',
  HTTP_CONNECTION  => 'keep-alive',
  CONTENT_LENGTH  => undef,
  REQUEST_METHOD  => 'GET',
  HTTP_ACCEPT  => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'psgi.multithread'  => 0,
  HTTP_ACCEPT_CHARSET  => 'GB2312,utf-8;q=0.7,*;q=0.7',
  QUERY_STRING  => '',
  HTTP_USER_AGENT  => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16',
  SERVER_PORT  => '3000',
  HTTP_COOKIE  => undef,
  HTTP_ACCEPT_LANGUAGE  => 'zh-cn,zh;q=0.5',
  REMOTE_ADDR  => '10.60.10.44',
  CONTENT_TYPE  => undef,
  HTTP_KEEP_ALIVE  => '115',
  SERVER_PROTOCOL  => 'HTTP/1.1',
  'psgi.streaming'  => 1,
  'psgi.errors'  => *::STDERR,
  REQUEST_URI  => '/',
  'psgi.version'  => [
    1,
    1
  ],
  'psgi.nonblocking'  => 0,
  'psgix.io'  => bless( \*Symbol::GEN16, 'FileHandle' ),
  'psgi.url_scheme'  => 'http',
  'psgi.run_once'  => 0,
  HTTP_HOST  => '10.60.30.24:3000',
  'psgi.input'  => $VAR1->{'psgix.io'}
}

Powered by Dancer 1.3020
作者: snriyt    时间: 2011-03-30 17:43
ls的跟我的错误一样
作者: billcool    时间: 2011-08-20 17:45
谢谢分享,有没有更详细的说明,拓补图

如,自己写的代码放在什么地方,然后TT在那..........
作者: zhlong8    时间: 2011-08-20 18:57
Hi aef25u,
我也碰到"Template is needed by Dancer::Template::TemplateToolkit"错误,怎么解决呢.
longjinjiu 发表于 2011-03-28 22:00



    你们几个都是 Template 模块没安装
作者: aef25u    时间: 2011-08-20 21:46
谢谢分享,有没有更详细的说明,拓补图

如,自己写的代码放在什么地方,然后TT在那..........
billcool 发表于 2011-08-20 17:45


跑起来后看网页上的内容,里边有描述,虽然不是很具体清晰,但有提到。
作者: iakuf    时间: 2011-08-20 23:19
嘢,还真有实践Dancer的,赞一个。
2gua 发表于 2011-03-29 08:18


现在见到不少应用在使用 Dancer 了。公司几个小项目都使用的这个
作者: iakuf    时间: 2011-08-20 23:21
跑起来后看网页上的内容,里边有描述,虽然不是很具体清晰,但有提到。
aef25u 发表于 2011-08-20 21:46


看看 TT 的基本教程。。。

最基本的,我们需要先创建一个应用,他是非常容易的,直接通过 dancer 的命令。这会生成一些常见的文件夹,都是你的应用所需要的。

$ dancer -a bookstore

下面我简单来讲一下一个 Web 应用所需要的文件夹的作用,这个 dancer -a 的命令都会帮你生成好



三个最常用的文件

    bookstore/lib/bookstore.pm  # 这个目录是我们最常用的,我们的程序就写在这个 lib 中,默认写在 bookstore.pm 中,dancer 会自动帮你建个 pm 文件和项目名一样的
    bookstore/config.yml            # 配置文件
    bookstore/bin/app.pl             # 应用启动时的启动文件,他会自动以模块加载你写的应用。默认 3000 端口

几个常用的目录

    bookstore/views                 # 标准 MVC 中的 view 模板就放这个目录
    bookstore/public/css          # public 是放静态文件的 css 中放 css
    bookstore/public/javascripts   # 这个是放 js 脚本的
作者: iakuf    时间: 2011-08-20 23:23
回复  longjinjiu

cpan  install Dancer::Template::TemplateToolkit
snriyt 发表于 2011-03-28 22:45


使用 cpanm 来安装 Dancer 吧,对这种项目和模块,使用 cpanm 无限的方便
  1. cpanm Dancer::Template::TemplateToolkit
复制代码

作者: 2gua    时间: 2011-08-21 14:18
现在见到不少应用在使用 Dancer 了。公司几个小项目都使用的这个
iakuf 发表于 2011-08-20 23:19



    好,改天瞅瞅去。
作者: 515413928    时间: 2011-08-22 05:16
学习一下
作者: nixiaoweihunter    时间: 2011-11-05 11:22
最近也试了一下,有点问题,dancer用的是哪个WEB服务器?怎么修改3000的端口?
作者: qibotang    时间: 2012-02-10 10:38
谢谢 试试
作者: wendaozhe    时间: 2012-02-15 11:49
正在学习dancer,刚好用得着。
作者: 小perl    时间: 2012-04-18 20:36
注册时显示:Can't call method "run" on an undefined value at C:/strawberry/perl/site/lib/Dancer/Route.pm line 212.
212             return $next_route->run($request);

是什么原因呢?Perl版本是Strawberry Perl 5.14.2  ,WinXp
作者: jeromest    时间: 2012-05-03 11:20
回复 1# aef25u


    楼主,是否可以留下一个你的网络联系方式(比如QQ或者MSN),我最近在学习Dancer框架,但学校里面基本没人学习Perl,望楼主不吝赐教,谢谢了!
作者: jeromest    时间: 2012-05-03 11:52
回复 40# 小perl


    请问您的这个问题有解决吗?我也是用的草莓版本Perl,遇到同样的问题,但是现在没有得到解决,因为刚开始学习Perl,使用希望得到指导,谢谢啦!
作者: 小perl    时间: 2012-05-04 08:34
回复 42# jeromest


    还没有,我也只是门外汉。
作者: TimChern    时间: 2012-05-15 20:38
hi,最近在考虑是否从catalyst转到dancer,请问一下dancer能支持部署在iis上吗,看cpan上是不支持的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2