我正在设计一个应用程序,它将包含 3-4 个作为独立进程运行并由合适的 IPC 链接的服务。该系统将有一个网络界面,我想使用那里的任何网络服务器。
应该在某个 URL 下访问 Web 界面,该 URL 允许同一 Web 服务器上的其他 URL 做完全不同的事情。我打算使用该 URL 下方的路径来指定 Web 界面应该做什么。它具有供网络上的其他应用程序使用以及供人类在浏览器中进行交互的设施。
袖手旁观,我的工作如下:
现在,我真正想要的是避免前两个步骤,或者如果我不能,避免第二个步骤,因为我担心我会在不必要的开销上浪费性能(来自其他应用程序的请求可能很频繁) )。
例如,PHP 可以打开到 MySQL 数据库的持久连接,该连接在脚本运行时存活下来并且下次不需要重新创建,尽管我不知道他们实际上是如何做到的。此外,据我所知,Apache 模块在服务器启动时加载一次,因此这可能会删除第一步,但会将我与 Apache 联系起来。
那么,将特定 URL 的处理程序挂接到不同网络服务器的好方法是什么?我不想处理 HTTP,否则我可能只是在第二台服务器上使用代理设置,但这似乎是在重新发明轮子。如果您认为 CGI 很好,并且有处理类似结构的大量请求的示例,请告诉我。
我使用的是 Firefox 3.6.10(OS X Intel),浏览器收集新的 cookie,而不是使旧的 cookie 过期(“删除”)。
这些 cookie 是通过 PerlCGI和CGI::Cookie模块创建和添加的。
我正在创建和添加一个 cookie,如下所示:
my $myNewCookie = new CGI::Cookie(-name => "$myCookieName",
-value => { 'key1' => $value1, 'key2' => $value2 },
-expires => '+8h',
-secure => 1
);
print redirect(-URL => "$hostURL$redirect",
-cookie => $myNewCookie);
Run Code Online (Sandbox Code Playgroud)
这是我试图让它们过期的方法:
sub clearCookie {
my $myOldCookie = cookie(-name => "$myCookieName",
-value => '',
-expires => '-1d',
-secure => 1);
print header(-cookie=>$myOldCookie);
# ...
}
Run Code Online (Sandbox Code Playgroud)
这是发生的事情:
我最近学习了cgi,并在vbox中设置了一个Ubuntu服务器.我写的第一个程序是使用vim通过ssh在Python中编写的.然后我在我的Windows 7工作站上安装了Eclipse并创建了完全相同的Perl文件; 只是一个简单的问候世界.
我试过运行它,我得到了500,而同一个目录(/ usr/lib/cgi-bin)中的Python代码显示正常.沮丧,我检查并三重检查权限,它开始于#!/ usr/bin/perl.我还检查了AddHandler是否设置为.pl.一切都设置得很好,一时兴起,我决定使用vim在服务器中编写完全相同的代码,就像我在Python文件中所做的那样.
瞧,它有效.我比较了他们,以为我疯了,他们完全一样.那么,这笔交易是什么?为什么Eclipse中的Windows 7中的文件与使用vim的Ubuntu服务器中生成的文件不同?他们有不同的二进制标题或什么?这确实会影响我的开发环境.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Testing.";
Run Code Online (Sandbox Code Playgroud)
Apache错误日志:
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] (2)No such file or directory: exec of '/usr/lib/cgi-bin/test.pl' failed
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] Premature end of script headers: test.pl
[Tue Aug 07 12:32:02 2012] [error] [client 192.168.1.8] File does not exist: /var/www/favicon.ico
Run Code Online (Sandbox Code Playgroud)
这是我得到的持续错误.
在CGI网页中,我有一个按钮,当按下提交表单和子程序时,它具有:
sub run {
&emailDebug("Started " .localtime);
system("(/tools/script1.pl &) ; (/tools/script2.pl &)");
&emailDebug("Ended " .localtime);
}
Run Code Online (Sandbox Code Playgroud)
它们都是在11:08:05开始(因此是花哨的命令),我自己在脚本中加上时间戳并通过电子邮件发送给自己.
第二次完成11:08:22和第一次11:08:36,但上面发送的电子邮件将显示11:08:06.
最有趣的是,只要两个脚本中的较长时间运行,页面就会加载大约30秒.
我不介意页面加载,但我不明白为什么它的行为像这样.在页面加载时,显然子程序run本身不会返回,但两封电子邮件几乎同时发送.
正在查看开发人员的代码.他在Python应用程序中做过我以前从未见过的事情.他的背景是PHP,只是学习python,所以我不知道这是否可能是他习惯使用的不同系统架构的延续.
他告诉我,此代码的目的是防止用户通过代码插入攻击应用程序.我很确定这对我们的用例来说是不必要的,因为我们从不将数据作为代码进行评估,但我只是想确认并询问社区.
# Import library
from cgi import escape
# Get information that the client submitted
fname = GET_request.get('fname', [''] )[0]
# Make sure client did not submit malicious code <- IS THIS NECESSARY?
if fname:
fname = escape(fname)
Run Code Online (Sandbox Code Playgroud)
当我将http://localhost:8888/cgi-bin/peoplecgi.py?action=Fetch&key=sue(sue 是搁置中的有效密钥)发送到下面的 cgi 脚本时,我得到以下信息(我也在使用 Python 3.3 的 OSX 上)。任何想法出了什么问题?
127.0.0.1 - - [04/Feb/2014 10:38:41] "GET /cgi-bin/peoplecgi.py?action=Fetch&key=sue HTTP/1.1" 200 -
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/http/server.py", line 1131, in run_cgi
os.execve(scriptfile, args, env)
OSError: [Errno 8] Exec format error: '/Users/rich/Google Drive/Code/Python/PP4E/Preview/cgi-bin/peoplecgi.py'
127.0.0.1 - - [04/Feb/2014 10:38:41] CGI script exit status 0x7f00
Run Code Online (Sandbox Code Playgroud)
我正在使用 O'Reilly 的 Python 编程第 4 版。这是问题基于示例 1-33。
weberver.py:
import os, sys
from http.server import HTTPServer, CGIHTTPRequestHandler
webdir = '/Users/rich/Google Drive/Code/Python/PP4E/Preview/'
port = 8888
os.chdir(webdir)
srvraddr = …Run Code Online (Sandbox Code Playgroud) 如何设置 lighttpd 以使环境变量可用于生成的进程?
我有一个通过 CGI 作为 URL 调用的可执行文件(例如http://.../cgi-bin/executable.bin)。
可执行文件需要加载库并读取/etc/profileusing中设置的环境变量export FOO=BAR。
当我尝试访问 URL 时,它会生成内部服务器错误 (500),这是由在/etc/profile.
当我运行python -m SimpleHTTPServer 8000或python -m CGIHTTPServer 8000在 cmd 中时,出现此错误:
没有名为 SimpleHTTPServer 的模块
或者
没有名为 CGIHTTPServer 的模块
有谁知道为什么会发生这种情况或测试 python cgi-scripts 的另一种方法?
我想使用inkscape 为我正在创建的应用程序生成自定义Google 标记。由于谷歌地图不直接支持 SVG 文件,我打算更改 svg 文件中的参数,然后将该文件重定向到 Inkscape,最后将导出的 png 打印到标准输出,以便 CGI 脚本可以使用它来发送结果到浏览器显示。
有人对如何实现这一目标有任何建议吗?
我正在尝试运行具有一些 Unicode 字符串的 python CGI 脚本。它在控制台中运行良好,但是当我在浏览器中运行它时,它会出现以下错误 -
UnicodeEncodeError: 'ascii' 编解码器无法对位置 198 中的字符 '\u2026' 进行编码:序号不在范围内 (128)
我试过这两个 -
encode('ascii','ignore') unicodedata.normalize('NFKD',var).encode('ascii', 'ignore').strip()
var 是保存 unicode 字符串的变量。
现在如何在浏览器中正确打印 Unicode 或 ascii?