0 / 0 / 0
Регистрация: 12.09.2015
Сообщений: 7
1

CGI: Session, tt_config, header

16.11.2018, 04:28. Показов 1412. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ, помогите, пожалуйста. Недавно начал изучать perl, но из-за тупости, есть пару вопросов, на которые не могу найти ответ.

1. При использовании CGI и CGI::Application::Plugin::TT как правильно вывести заголовок HTML документа?

Пробовал: print $q->header(-type => 'text/html', -charset => 'utf-8');
Но на cpan: Your application should *NEVER* print() to STDOUT. Using print() to send output to STDOUT (including HTTP headers) is exclusively the domain of the inherited run() method.

И при таком выводе получается такая ситуация что после вывода всей страницы выводится еще один заголовок.
Если удалить эту строчку - ошибка end script before the header.
Как сделать правильный вывод?

2. Нужно перенести
Perl
1
2
3
4
5
__PACKAGE__->tt_config( TEMPLATE_OPTIONS => {
                ABSOLUTE => 1,
                RELATIVE => 1,
        }
);
в App->new() в index.cgi
Но нигде не могу найти инфы как это будет.
Perl
1
App->new(__PACKAGE__->tt_config(TEMPLATE_OPTIONS => {ABSOLUTE => 1,RELATIVE => 1}))->run;
или
Perl
1
App->new->tt_config(TEMPLATE_OPTIONS => {ABSOLUTE => 1,RELATIVE => 1})->run;
Или это оба неправильных варианта?


3. CGI::Application::Plugin::Session

Правильно ли я понимаю что после конфигурации

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use CGI::Application::Plugin::Session;
use constant SESSION => "$Bin/session/";
...
sub cgiapp_init 
{
  my $self = shift;
  $self->session_config(
    CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>SESSION} ],
    DEFAULT_EXPIRY      => '+1w',
    COOKIE_PARAMS       => {
      -expires => '+24h',
      -path    => '/',
    },
    SEND_COOKIE         => 1,
  );
}
...
Передачи параметров в сессию

Perl
1
2
$self->session->param('name', $q->param('name'));
$self->session->param('email', $q->param('email'));
Происходит запись cookie пользователю и запись файла сессии на серваке в указанной мной директории

Далее когда пользователь с уже записанными "куками" и файлом сессии закроет и заново откроет страницу плагин сессии запросит автоматом куки пользователя и найдет сессию именно этого пользователя.

Т.е. в таком случае достаточно будет обратиться
Perl
1
2
my $session_name=$self->session->param('name');
my $session_email=$self->session->param('email');
И переменные будут содержать данные "именно того пользователя" или я не прав?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2018, 04:28
Ответы с готовыми решениями:

не запускаеться (CGI вместе с MySQL) под Apache: Premature end of script headers: c:/www/cgi-bin/catalog.cgi
такая трабла: вот что пишет Apache в Log: Premature end of script headers:...

Perl + SSI = ошибка invalid CGI ref 'http://сервер/cgi-bin/view_bag.pl' in ....
Вопрос такой: Скрипт view_bag.pl без ошибок выполняется в папке /cgi-bin/, при этом атрибуты файла...

При попытке отправить данные формы открывается страница с сообщением: 'The requested method POST is not allowed for the URL /cgi-bin/script.cgi.'
Имеется форма, начальный тег: <form method=post action='cgi-bin/script.cgi'> При попытке...

Что твориться с сессиями ? (strListingID = Session('ListingID'); strAccountID = Session('AccountID'); strActive = Session('Active'); )
-----------------------page1.asp-------------------------- Basicrs =...

2
0 / 0 / 0
Регистрация: 12.09.2015
Сообщений: 7
16.11.2018, 19:51  [ТС] 2
UPD: разобрался с первым и последними пунктами.
Помогите плс со вторым.
0
Невнимательный
 Аватар для ft4l
2784 / 1115 / 347
Регистрация: 08.02.2013
Сообщений: 6,377
Записей в блоге: 2
16.11.2018, 20:40 3
1. использовать методы специально предоставленные используемыми модулями.
Например header_add() из CGI::Application

2. __PACKAGE__ указано потому что обычне это используется внутри модулей.
Этот CGI::Application::Plugin::TT как-бы предоставляет модулям его использующим метод tt_config()
Не понял почему , но почему-то там предлагается использовать our, при объявлении $TEMPLATE_OPTIONS
Perl
1
2
3
4
5
6
    our $TEMPLATE_OPTIONS = {
        COMPILE_DIR => '/tmp/tt_cache',
        DEFAULT     => 'notfound.tmpl',
        PRE_PROCESS => 'defaults.tmpl',
    };
    __PACKAGE__->tt_config( TEMPLATE_OPTIONS => $TEMPLATE_OPTIONS );
м.б. чтобы создаавать над своим модулем ещё модули...

3. Думаю не совсем так, попробовал запустить, что-то вроде Пример использования CGI::Application::Plugin::Session
Например можно код модуля разместить непосредственно в index.pl
Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/perl
 
package MyApp;
use strict;
use warnings;
 
use base 'CGI::Application';
 
use CGI::Application::Plugin::TT;
use CGI::Session::Driver::file;
use CGI::Application::Plugin::Session;
 
our $TEMPLATE_OPTIONS = {
#        COMPILE_DIR => '/tmp/tt_cache',# Не понял на что влияет, создал папку пусто
#        Directory => '/tmp', # Тоже не помогает
# файлы создаются в   /tmp/systemd-private-18.....9-apache2.service-STnBXs/tmp     
#        DEFAULT     => 'notfound.tmpl',
#        PRE_PROCESS => 'defaults.tmpl',
        ABSOLUTE => 1,
        RELATIVE => 1,
    };
 
sub setup {
  my $self = shift;
  $self->tt_config( TEMPLATE_OPTIONS => $TEMPLATE_OPTIONS );
  $self->mode_param('step');
  $self->start_mode('on_start');
  
  $self->run_modes(
    on_start => \&on_start,
    on_save_addr => \&on_save_addr,
    on_close_session => \&on_close_session,
    AUTOLOAD => sub { return 'Запрошенной страницы не существует' }
  );
}
 
sub cgiapp_init {
  my $self = shift;
 
  # Configure the session
  $self->session_config(
    CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'/tmp'} ],
    DEFAULT_EXPIRY      => '+1w',
    COOKIE_PARAMS       => {
      -expires => '+24h',
      -path    => '/',
    },
    SEND_COOKIE         => 1,
  );
}
 
sub on_start {
  my $self = shift;
  my $q = $self->query();
  my $tt_params = {};
    
  $tt_params->{addr} = $self->session->param('addr');
  $tt_params->{block} = 'show_index_page';
 
  return $self->tt_process('/home/xxx/www/perl/test.tmpl', $tt_params);
}
 
sub on_save_addr {
  my $self = shift;
  my $tt_params = {};
  my $q = $self->query();
 
  $self->session->param('addr', $q->param('addr'));
  return $self->on_start;
}
 
sub on_close_session {
  my $self = shift;
  my $tt_params = {};
 
  $self->session_delete;
 
  $tt_params->{block} = 'show_close_session_page';
  return $self->tt_process('/home/xxx/www/perl/test.tmpl', $tt_params);
}
 
 
package main;
 
use strict;
use warnings;
 
# use MyApp;
 
my $App = MyApp->new(RELATIVE => 1);
$App->header_add(-type => 'text/html; charset=utf-8' );
#или скорее всего header_add() правильнее делать где-то в методах 
$App->run;
1;
и в той-же дирректории test.tmpl
Кликните здесь для просмотра всего текста

<!DOCTYPE html>
<html>
<head>
<!-- meta http-equiv="Content-Type" content="text/html; charset=utf-8" / -->
<title>session</title>
</head>

<body>
<h1>Сессии</h1>

[%- TRY -%]
[%-INCLUDE $block-%]
[%- CATCH -%]
Ошибочка вышла
[%- END -%]

</body>
</html>

[%-#-----------------------------------------%]
[%-BLOCK show_index_page-%]
[%-#-----------------------------------------%]

[%-IF addr-%]
<p>[%-addr-%]</p>
<form action="/" method="POST">
<input type="hidden" name="step" value="on_close_session">
<input value="Завершить сессию" type="submit">
</form>

[%-ELSE-%]
<p>Укажите почтовый адрес:</p>
<form action="/" method="POST">
<input type="hidden" name="step" value="on_save_addr">

<textarea name="addr" cols="40" rows="3"></textarea><br>
<input value="Сохранить адрес" type="submit">
</form>
[%-END-%]

[%-#-----------------------------------------%]
[%-END-%]


[%-#-----------------------------------------%]
[%-BLOCK show_close_session_page-%]
[%-#-----------------------------------------%]
<p>Cессия завершена.</p>

[%-#-----------------------------------------%]
[%-END-%]

// Тут у меня везде form action="/" потому-что запускал с помощью. ModPerl::PerlRun в конфигах Apache такое
Код
<VirtualHost *:80>
.........
DirectoryIndex index.pl
AddHandler perl-script .pl
PerlResponseHandler ModPerl::PerlRun
PerlOptions +ParseHeaders
.....
</VirtualHost>
Так вот не помогают накакие COMPILE_DIR или Directory => '/tmp' всёравно всё создаётся в каких-то /tmp/systemd-private.......
RELATIVE тоже не помогло , не понял как можно использовать относительные пути к шаблону

Добавлено через 7 минут
Перед package main забыл
1;
1
16.11.2018, 20:40
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2018, 20:40
Помогаю со студенческими работами здесь

Почему session('aaa') обнуляется при session.Abandon, а session.sessionid остается таким же ?
Народ помогите &lt;% response.write(session.sessionid) response.write(session('aaa'))...

Запуск CGI вне cgi-bin и запуск index.cgi
Никак не получается сделать настройку 1) Запуск CGI-программ ВНЕ /cgi-bin/ 2) Запуск index.cgi...

session/session.php on line 423 / session/session.php on line 426
Установил джумлу и появилась вот такая ошибка: Warning: session_start() : Cannot send session...

Ошибка 500 cgi, нужно запустить батник через cgi
Apache на Windows (!!) Если запускаю localhost/run.bat все работает исправно, скрипт простой,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
Как поменять цвет input placeholder с помощью CSS
bytestream 24.01.2025
В веб-разработке оформление элементов пользовательского интерфейса играет ключевую роль в создании привлекательного и интуитивно понятного дизайна. Особое внимание уделяется формам ввода данных, где. . .
Как перебрать все значения в перечислении (enum) в C#
bytestream 24.01.2025
Перечисление (enum) в языке программирования C# представляет собой специальный тип данных, который позволяет определить набор именованных констант. Этот мощный инструмент особенно полезен, когда. . .
Как обойтись без проверки на null, чтобы избежать NullPointerExce­ption в Java
bytestream 24.01.2025
NullPointerException (NPE) является одним из самых распространенных исключений в Java, создающих серьезные проблемы при разработке программного обеспечения. Данное исключение возникает при попытке. . .
Что лучше использовать в href ссылок в JavaScript: "#" или "javascript:voi­­d(0)­"
bytestream 24.01.2025
При разработке веб-приложений важную роль играет правильное использование HTML-ссылок в сочетании с JavaScript. Одним из ключевых аспектов является выбор корректного значения атрибута href для. . .
Как узнать индекс элемента списка по его значению в Python
hw_wired 24.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только манипулировать элементами списка, но и определять их точное местоположение. Индекс элемента представляет собой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru