我见过CGI/Perl的每个例子基本上是一堆包含HTML的打印语句,这似乎不是编写CGI应用程序的最佳方式.有一个更好的方法吗?谢谢.
编辑:我决定使用CGI :: Application和HTML :: Template,并使用以下教程: http://docs.google.com/View?docid=dd363fg9_77gb4hdh7b.谢谢!
所以我遵循这个指南:http://technotes.1000lines.net/?p = 23我正在完成这些步骤.我有一个使用Debian Etch的VPN(slicehost.com),用nginx为一个网站(静态到目前为止)提供服务.我使用wget下载FastCGI,我做了通常的make make install例程.
所以我想因为FastCGI无法正常运行CGI脚本,所以你必须使用某种类型的perl包装来解释perl.
现在我运行这个脚本
http://technotes.1000lines.net/fastcgi-wrapper.pl
我遇到了一个人在提交脚本的页面上遇到的完全相同的问题:
http://www.ruby-forum.com/topic/145858
(我不是一个红宝石人,那里没有任何红宝石定向)
我一直在接受
# bind/listen: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我不知道如何继续.我很感激任何帮助,我可以提供任何人需要的更多细节.
Moose是一个梦幻般的对象框架.麻烦的是,与它的依赖关系一起,它是非常大的.我们的分析表明,在我们的平台上,只需加载Moose就会在非持久性CGI应用程序脚本上产生5-6秒的开销.这对于这些一次性应用程序来说是不可接受的.
相比之下,当我们使用持久性流程系统(例如FCGI)时,这种启动开销被消除(或者更确切地说,只发生一次),一切都很顺利.我们遇到的问题是我们无法保证所有代码都始终在持久进程下运行.
我们调查使用鼠标作为Moose的功能有限的替代品,但事实证明(如本答案所述)这不是一个可行的选择.我们编写的任何与Moose一起工作的库都无法以微妙但重要的方式使用Mouse.而且我们真的不想分叉我们所有的模块,以便我们可以在持久环境中支持Moose,而在"vanilla"CGI中支持Mouse.
鉴于此,我们有以下选择:
哪个选项最好?我们现在正倾向于2,如果我们必须得到像香草CGI一样的东西,我们就会把它吸收.其他框架怎么样?我们应该关注哪些更轻量级的东西?
我只需要编写一个简单的python CGI脚本来解析包含JSON的POST请求的内容.这只是测试代码,因此我可以测试客户端应用程序,直到实际服务器准备就绪(由其他人编写).
我可以读取cgi.FieldStorage()并转储keys()但是包含JSON的请求主体无处可寻.
我也可以转储os.environ(),它提供了很多信息,除了我没有看到包含请求体的变量.
任何输入赞赏.
克里斯
我想关闭STDOUT以防止我的代码输出我需要进一步计算但不想在我的网页上的特定图像.
所以我想关闭STDOUT,做我必须做的代码,然后重新打开STDOUT将内容输出到网页.(不是文件)
我尝试的是:
close STDOUT;
# my code here
open STDOUT;
Run Code Online (Sandbox Code Playgroud)
这不起作用......
谢谢
我使用Flask框架编写了一个小应用程序.我尝试使用cgi来托管这个.在文档之后,我创建了一个包含以下内容的.cgi文件:
#!/usr/bin/python
from wsgiref.handlers import CGIHandler
from yourapplication import app
CGIHandler().run(app)
Run Code Online (Sandbox Code Playgroud)
运行该文件会导致以下错误:
...
文件"/usr/lib/pymodules/python2.7/werkzeug/routing.py",第1075行,在bind_to_environ中wsgi_server_name = environ.get('HTTP_HOST',environ ['SERVER_NAME'])
KeyError:'SERVER_NAME'
状态:500内部服务器错误
内容类型:text/plain
Content-Length:59
在我的应用程序中,我设置:
app.config['SERVER_NAME'] = 'localhost:5000'
Run Code Online (Sandbox Code Playgroud)
当我使用Flask开发服务器运行应用程序时,它运行得非常好.你可以告诉我,我对这些东西很新,我已经找到了其他有类似错误但没有运气的人.所有帮助表示赞赏.
我想在共享托管环境中运行Python CGI.我按照Flask的例子,提出了一个小应用程序,如下所示:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
@app.route("/pi")
def pi():
return "3.1416"
if __name__ == "__main__":
app.run()
Run Code Online (Sandbox Code Playgroud)
我的.htaccess包含:
Options +ExecCGI
AddHandler cgi-script .cgi .py .rb
DirectoryIndex index.cgi index.htm
Run Code Online (Sandbox Code Playgroud)
我的index.cgi是
#!/usr/bin/env python
from wsgiref.handlers import CGIHandler
from firstflask import app
CGIHandler().run(app)
Run Code Online (Sandbox Code Playgroud)
它成功地将该路径映射/到index(),但它未能映射路径/pi来pi(),而不是返回404错误.我想我会错过一些明显的东西.谢谢您的帮助.
如果在控制台中运行此代码 - 它运行良好(它是俄语),但如果在Apache2服务器上运行它像cgi - 它失败:<type 'exceptions.UnicodeEncodeError'>: 'ascii' codec can't encode characters in position 8-9: ordinal not in range(128).代码是:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import cgitb
cgitb.enable()
print "Content-Type: text/html;charset=utf-8"
print
s=u'Nikolja \u043d\u0435 \u0421\u0430\u0440\u043a\u043e\u0437\u0438!'
print s#.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
是的,解决方案是取消注释.encode('utf-8'),但我花了更多的时间来理解为什么不会发生,我无法看到答案.
我正在尝试在配置我的服务器后运行一个简单的cgi脚本.
我的脚本看起来像这样:
print "Content-type: text/html"
print
print "<html><head><title>CGI</title></head>"
print "<body>"
print "hello cgi"
print "</body>"
print "</html>"
Run Code Online (Sandbox Code Playgroud)
当我转到我的脚本网址时,http://127.0.0.1/~flybywire/cgi-bin/main.py我得到:
内部服务器错误
服务器遇到内部错误或配置错误,无法完成您的请求.
在error.log我得到以下内容:
[error] (8)Exec format error: exec of '/home/flybywire/www/cgi-bin/main.py' failed
[error] [client 127.0.0.1] Premature end of script headers: main.py
其他信息: Apache/2.2.8 (Ubuntu) DAV/2 SVN/1.4.6 Server at 127.0.0.1 Port 80
我正在尝试在IIS 7.5上设置Mercurial.我有一个web.config用于忽略该maxAllowedContentLength属性的应用程序目录,我根本无法让IIS接受它!我在全球,本地和各个层面尝试过千种不同的方式.它默认为30MB并且拒绝让我推动大于此的变更集.它甚至没有关闭连接,它只是达到30MB并完全停止.这不是超时问题,我尝试从本地计算机推送到其IP地址.
这到底是怎么回事?
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python27\python.exe -u "%s"" resourceType="Unspecified" requireAccess="Script" />
</handlers>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
<rewrite>
<rules>
<rule name="rewrite to hgwebdir" patternSyntax="Wildcard">
<match url="*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="hgweb.cgi/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
<!-- I don't know if this is supposed to work... it doesn't matter where I put the settings. -->
<location path="*"> …Run Code Online (Sandbox Code Playgroud)