我有这个python cgi脚本,检查它是否从同一个IP多次访问,如果一切正常,读取一个大文件格式磁盘(11MB),然后将其作为下载返回.
它有效,但性能很糟糕.瓶颈似乎是一遍又一遍地读取这个巨大的文件:
def download_demo():
"""
Returns the demo file
"""
file = open(FILENAME, 'r')
buff = file.read()
print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" % (os.path.split(FILENAME)[-1], len(buff), buff)
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它更快?我想过使用ram磁盘来保存文件,但必须有一些更好的解决方案.使用mod_wsgi而不是cgi脚本帮助?我能将大文件保存在apache的内存空间吗?
任何帮助是极大的赞赏.
我有一个调用scriptB.cgi的scriptA.cgi.
scriptB.cgi需要一个参数.
我在scriptA.cgi里面都尝试过,我试过了:
`perl -l scriptB.cgi foo="toast is good" `;
Run Code Online (Sandbox Code Playgroud)
以及
@args = ("perl", "-l", "scriptB.cgi", "foo=\"toast is good\"");
system(@args);
Run Code Online (Sandbox Code Playgroud)
当我从命令行调用scriptA.cgi时,它按预期工作.但是当我通过浏览器调用scriptA.cgi时,脚本执行了.执行但是它无法读取传入的参数并将foo打印为空.
是否有一种不那么丑陋的方式从另一个调用一个cgi并传入params?
scriptB不一定是cgi,如果使用直接的.pl和args更容易做到这一点,我也很乐意这样做......但是arg必须是带空格的带引号的字符串.
欢迎所有的想法.
我试图通过URL 将参数传递给这个CGI表单(http://www.westegg.com/inflation/),所以我不必手动输入它们,这样我就可以通过其他方式生成URL为了更快的使用.
以下是该网站的CGI表单代码:
<form action="infl.cgi" method="post">
Enter the amount of money: <input name="money" type="text" size="9">
<p>
Enter the initial year (1800-2008):
<input name="first" type="text" size="4" maxlength="4">
<p>
Enter the final year (1800-2008):
<input name="final" type="text" size="4" maxlength="4" value="2007">
<p>
<center>
<input type="submit" value="Submit">
</center>
</form>
Run Code Online (Sandbox Code Playgroud)
我试过通过"?"传递参数 和"&"语法,但这些都不起作用:
http://www.westegg.com/inflation/infl.cgi?money=1&first=1800&last=1900
http://www.westegg.com/inflation/infl.cgi?money="1.00"&first="1800"&last="1900"
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助 :)
我正在编写一个简单的Python CGI脚本来抓取网页并在Web浏览器中显示HTML文件(就像代理一样).这是脚本:
#!/usr/bin/env python3.0
import urllib.request
site = "http://reddit.com/"
site = urllib.request.urlopen(site)
site = site.read()
site = site.decode('utf8')
print("Content-type: text/html\n\n")
print(site)
Run Code Online (Sandbox Code Playgroud)
从命令行运行时,此脚本可以正常工作,但是当它通过Web浏览器查看时,它会显示一个空白页面.这是我在Apache的error_log中得到的错误:
Traceback (most recent call last):
File "/home/public/projects/proxy/script.cgi", line 11, in <module>
print(site)
File "/usr/local/lib/python3.0/io.py", line 1491, in write
b = encoder.encode(s)
File "/usr/local/lib/python3.0/encodings/ascii.py", line 22, in encode
return codecs.ascii_encode(input, self.errors)[0]
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 33777: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud) 我的一个朋友有一个静态网站.她想添加一个允许人们注册课程的注册表.使用ROR或Wordpress等重新创建网站不在范围内.我们还希望用户使用相同的域,无论他或她是在查看静态页面还是动态页面.
我可以想到用CGI做这个最不具侵入性的方法,最好是使用Ruby.但是,我真的不喜欢编写CGI代码,而且我更喜欢使用Sinatra和ROR等框架.
在这种情况下,是否真的可以使用高级框架?如果是这样,那么它是否比它的价值更麻烦?
提前致谢!
use API;
use Database;
use Routines;
use Encode qw/encode decode/;
use CGI;
use CGI::Carp;
use File::Basename;
Run Code Online (Sandbox Code Playgroud)
伙计们,先谢谢你们.大声笑
如何设置Perl在OSX上的Apache httpd.conf文件中查找模块的位置?
我通过CPAN安装了几个模块,这些模块已成功安装
/opt/local/lib/perl5/site_perl/5.8.9
Run Code Online (Sandbox Code Playgroud)
我可以通过验证 perldoc perllocal
如果我perl -V在命令行上运行,我得到(以及其他目录):
@INC:
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level
/opt/local/lib/perl5/site_perl/5.8.9
Run Code Online (Sandbox Code Playgroud)
但是,当我通过Apache运行perl脚本作为CGI时,我得到的错误是我use找不到的模块.@INC中包含的目录列表与我的本地perl配置不匹配.
[error] [client 127.0.0.1] Can't locate Spreadsheet/ParseExcel.pm in @INC (
@INC contains:
/Library/Perl/Updates/5.8.8
/System/Library/Perl/5.8.8/darwin-thread-multi-2level
/System/Library/Perl/5.8.8
/Library/Perl/5.8.8/darwin-thread-multi-2level
/Library/Perl/5.8.8
/Library/Perl
/Network/Library/Perl/5.8.8/darwin-thread-multi-2level
...
Run Code Online (Sandbox Code Playgroud)
在OSX上运行perl作为CGI时@INC如何设置 - 以及如何覆盖它?
我有一个用perl编写的工具,供我公司的不同用户使用.每个用户都有自己的磁盘空间,并在磁盘空间中运行该工具.这没有任何问题,工作正常.下一步,我想通过Web启用该工具并创建一个Web应用程序,用户可以通过该应用程序运行此工具,我遇到的问题是,该工具始终作为单个用户运行.我通过身份验证知道用户名,有没有办法以运行Web应用程序的用户身份运行该工具?
我想知道如何在我的perl设置中添加一个新目录,以便搜索要包含的模块?
当我运行这一行时:
perl -w /var/www/cgi-bin/upload.cgi
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Can't locate config.pm in @INC (@INC contains: . /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8) at /var/www/cgi-bin/upload.cgi line 5.
BEGIN failed--compilation aborted at /var/www/cgi-bin/upload.cgi line 5.
Run Code Online (Sandbox Code Playgroud)
我搜索了Google,显然我应该将其/var/www/cgi-bin作为文件夹包含在内,以便Perl可以找到并包含它.
更多信息
以下是该计划的前几行:
use strict;
use lib '.';
use XFSConfig; #this was fixed by using -I command line switch
use XUpload; # this returns as an error!!!
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use LWP::UserAgent;
Run Code Online (Sandbox Code Playgroud) 我有一个代码
module Main where
import Text.Printf
main = printf "%s%s" ("Content-type: text/html; charset=utf-8\n\n" :: String ) ("And ??????? ????????" :: String)
Run Code Online (Sandbox Code Playgroud)
如果我在终端执行它,我有我想要的:
Content-type: text/html; charset=utf-8
And ??????? ????????
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将其作为cgi-program执行时,我只是And(因为在这个词之后我有西里尔字符并且他们不想显示).
有没有问题,当我使用putStr $ fromString的Data.ByteString.Char8和Data.ByteString.UTF8,所以我不认为有一个与我LAMPP服务器有问题.我也包含AddDefaultCharset utf-8在httpd.conf中.
而我想要做的就是读取带有特殊符号的模板文件%s,%d等等,然后在帮助下printf,根据查询字符串和显示,将它们(符号)替换为我需要的符号.
我这样做只是为了好玩,我希望这个问题只用纯Haskell解决.