我有一个在perl CGI中运行的大型Web应用程序.它运行正常,编写得很好,但是就像过去一样,所有的html都是在CGI调用中硬编码的,所以你可以想象,它很难保持,改进等等所以现在我想开始添加一些模板并与框架(催化剂或CGI ::应用程序)集成.我的问题是:这里有人有这样的经历吗?有什么我必须注意的事情吗?我知道使用这两个框架我可以运行原生CGI脚本,所以它很好,因为我可以同时运行这两个(CGI原生广告"框架"代码)而没有任何创伤.有小费吗?
我正在使用Catalyst框架编写Web应用程序.我还使用了一个名为TheSchwartz的作业队列.
我想要使用作业队列,因为我希望尽可能多的特定于应用程序的代码与Web应用程序接口代码分离.
基本上整个系统由三个主要部分组成:
因此理论上,GUI为爬虫创建作业,从而为"攻击组件"创建作业.
目前我在Catalyst中有一个Model,它实例化一个TheSchwartz对象,以便Web应用程序中的控制器可以将作业添加到作业队列中.
我还需要创建一些工作者脚本来持续监听(/检查数据库)新的作业,以便他们可以执行所需的操作.目前TheSchwartz的数据库特定内容是在Catalyst中的模型中,我认为我不能轻易访问Catalyst之外的内容?
我不想在模型中复制TheSchwartz作业队列的数据库连接数据,然后在我的作业工作者脚本中复制数据库连接数据.我应该在位于Catalyst外部的另一个类中包装TheSchwartz对象的创建,并在当前实例化TheSchwartz对象的模型中调用它吗?然后我也可以在工作脚本中使用它.或者我应该在配置文件中包含数据库数据并在需要时实例化新的TheSchwartz对象(在Catalyst /内部作业工作者脚本中)?
或者我只是在想这个?
一些内容丰富的Web应用程序架构文章的链接也可能很有用(我之前从未构建过一种复杂的复杂性).
干杯
我已经将Template :: Toolkit用于我的最后几个Catalyst项目,并且有一个我喜欢使用的设置,可以清晰地分离我的模板.现在我希望使用Text :: Xslate,但是我无法弄清楚我是否可以进行相同的设置.以下是我通常用于Template :: Toolkit的内容.
__PACKAGE__->config({
...
WRAPPER => 'site/wrapper',
...
});
Run Code Online (Sandbox Code Playgroud)
包装纸
[% content WRAPPER site/html + site/layout %]
Run Code Online (Sandbox Code Playgroud)
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>[% template.title or site.title %]</title>
<style type="text/css">
</style>
</head>
<body>
[% content %]
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
布局
<div id="header">[% PROCESS site/header %]</div>
<div id="content">
[% content %]
</div>
<div id="footer">[% PROCESS site/footer %]</div>`
Run Code Online (Sandbox Code Playgroud)
然后页眉和页脚都有自己的内容.我喜欢这个解决方案,因为所有内容都是干净利落的,我不会在内容中分解任何div标签,因为必须将开头标记放在标题中并关闭页脚.它看起来像TTerse语法有一些包装器功能,但我不确定是否允许我重新创建我通常做的.我也发现这个答案说你可以在理论上使用包装器,但实际上没有给出任何例子.
我正在使用Catalyst和DBIx :: Class :: Schema :: Loader在Catalyst中创建我的模型,如下所示:
script/myapp_create.pl model DB DBIC::Schema MyApp::Schema create=static overwrite_modifications=1 components=EncodedColumn dbi:mysql:mydb mydb pass
Run Code Online (Sandbox Code Playgroud)
不幸的是,加载器自动设置InflateColumn::DateTime为默认组件,我不想要.我想要数据库中的原始值.
__PACKAGE__->load_components("InflateColumn::DateTime", "EncodedColumn");
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何防止这种情况?
在测试了我的Catalyst应用程序并决定部署它之后,我想将其打包,以便我可以轻松地将其插入登台和活动服务器,管理依赖关系并通过软件包版本控制的灵活性轻松回滚.由于我的生产操作系统是Ubuntu,我认为将其打包为deb包将是最有意义的.
我预测我将不得不创建我的所有perl模块依赖项的第二个包,因为许多不是由我的发行版提供的,或者是独立打包它们 - 尽管这可能是很多工作.
有没有人有这样做的经验 - 或者一个理智的,类似的替代方案?
在Catalyst应用程序或模板中定义的数据具有正确的编码并且显示良好,但是从数据库中将所有非Latin1转换为?.我想问题应该在模型类中,这是这样的:
use strict;
use base 'Catalyst::Model::DBIC::Schema';
__PACKAGE__->config(
schema_class => 'vhinnad::Schema::DB',
connect_info => {
dsn => 'dbi:mysql:test',
user => 'user',
password => 'password',
{
AutoCommit => 1,
RaiseError => 1,
mysql_enable_utf8 => 1,
},
'on_connect_do' => [
'SET NAMES utf8',
],
}
);
1;
Run Code Online (Sandbox Code Playgroud)
我看到这里没有瑕疵,但有些事情一定是错的.我使用我的架构也测试脚本和数据编码良好,输出正确,但在Catalyst应用程序内我没有得到正确的编码.哪里可能有问题?
编辑
为了将来的参考,我把解决方案放在这里:我混合了连接信息的新旧风格.
旧式就像 (dsn, username, passw, hashref_options, hashref_other options)
新风格(dsn => dsn, username => username, etc),所以正确使用:
connect_info => {
dsn => 'dbi:mysql:test',
user => 'user',
password => 'password',
AutoCommit => …Run Code Online (Sandbox Code Playgroud) 所以我用来查看变量内容的方法是在我的模板工具包中使用Data :: Dumper:
[% USE Dumper %] [% Dumper.dump(varname) %]
但是我得到的结果有点乱 - 关于表关系,列类型和attrbitues等的所有信息.
我想知道是否有一种方法可以获得一个"干净"的变量内容 - 因为只有来自查询的当前结果+相关的结果集(即当我使用带有cakephp框架的php时,有一个'debug(varname)'命令提供了这样的结果,看起来像这样http://pastebin.com/Hut0LnAb).
在我的舞台服务器中,我想激活调试,以便客户端可以在应用程序进入生产服务器之前找到自己的错误.
但我只想要消息的第一部分,而不是请求或会话数据.
例如:无法渲染模板"templates/home.tt2:file error - templates/inc/heater:not found".
该消息足以让我和我的客户看到"标题"调用拼写错误.
请求为客户提供了大量无关信息,但也有大量内部开发信息,应该一直隐藏!
问候
我正在开发一个Catalyst/psgi应用程序,它可以很好地利用异步流,但不仅仅是一个简单的计时器(比如这里:http://www.catalystframework.org/calendar/2013/13),我有点儿难以理解如何实施更多"全球"事件.
通过全球事件,我的意思是:
如果我错了,请纠正我,但对我来说,这些似乎与上面链接的示例非常不同,这将给每个客户一个不同的计数器.我想让事件"全面发生".
我尝试过的一个例子(使用上面列表中的#2):
has 'write_fh' => ( is => 'rw', predicate => 'has_write_fh' );
sub events : Path('/stream') Args(0) {
my ( $self, $c ) = @_;
$c->res->body("");
$c->res->content_type('text/event-stream');
$self->write_fh( $c->res->write_fh() );
}
sub trigger : Path('/trigger') : Args(0) {
my ( $self, $c ) = @_;
$self->write_fh->write( *the event string* );
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它实际上比我预期的更进一步 - 事件确实被触发,但不可靠.打开两个浏览器,有时会将事件发送到一个,有时发送到另一个.
现在,我想我明白为什么这样做永远不会有效 - 遇到/触发的客户端,不知道正在观看/流的所有其他客户端,所以我尝试使用的write_fh没用.
但是,如果每个客户的请求都在其自己的包含气泡中,我如何从其他请求访问其流?
或者我完全走错了轨道......?
我有一个 Xcode 工作区,其中包含一个带有 iOS 应用程序目标的项目和另一个带有 Framework 目标的项目。框架目标依赖于另一个框架,该框架以以下形式集成xcframework:
使用常规OtherFramework.framework将需要将其链接到MyFramework然后嵌入其中,MyApp即使MyApp不需要框架本身。但是,当与 集成时xcframework,此项目将无法构建并出现No such module 'OtherFramework'错误。
项目设置:
OtherFramework.xcframework从MyApp目标中删除修复了构建问题,但随后会导致library not loaded错误,因为应用程序中不存在框架。
演示项目在这里:https : //github.com/msaps/XCFramework-Link-Issue
您打算如何xcframework在应用程序中链接 an并在依赖框架中链接?
pyckamil刚刚发布了这篇文章,详细解释了这个问题:everything wrong with XCFrameworks。
事实证明,XcodeProcessXCFrameworkLibrary对.framework从.xcframework活动构建架构中提取正确信息的步骤进行了优化。这只会运行一次,这会导致尝试链接同一框架的其他目标出现问题。
此问题已在 Xcode 12.0 中解决
catalyst ×10
perl ×9
dbix-class ×2
architecture ×1
cgi ×1
debian ×1
ios ×1
job-queue ×1
packaging ×1
psgi ×1
swift ×1
text-xslate ×1
ubuntu ×1
utf-8 ×1
xcframework ×1
xcode ×1