Python Django 简单网站
我正在尝试用Django框架创建一个网站。我在Django项目的网站上看了教程,但里面有很多我不需要的信息。我有一些Python脚本,它们可以输出结果,我想把这些结果放到网上。我的问题是,怎么简单地管理Django,让它有一个链接可以启动脚本,并把输出显示在网页上?或者你能给我一个链接,让我可以了解这个吗?
谢谢。
6 个回答
使用mod_wsgi插件来搭配Apache服务器。
你可以这样做,看看一个现有的脚本是如何变成WSGI应用的。这是一个起点,帮助你理解WSGI接口是怎么工作的。
import sys
def myWSGIApp( environ, start_response ):
with file( "temp", "w" ) as output:
sys.stdout= output
execfile( "some script.py" )
sys.stdout= __stdout__
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
result= file( "temp", "r" )
return result
注意,你也可以很容易地重写你的脚本,使其符合WSGI标准。不过,这样做可能还不是最好的方法。
如果你有这样的代码:
if __name__ == "__main__":
main()
你只需要在每个脚本中添加类似的内容。
def myWSGIApp( environ, start_response ):
with file( "temp", "w" ) as output:
sys.stdout= output
main()
sys.stdout= __stdout__
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
result= file( "temp", "r" )
return result
这样每个脚本就可以作为WSGI应用被调用,并且可以接入基于WSGI的框架。
最好的方法是重写你的脚本,不要使用sys.stdout
,而是将输出写入一个作为参数传递给它们的文件。
你的服务器测试版本可以简单到这个程度。
from wsgiref.simple_server import make_server
httpd = make_server('', 8000, myWSGIApp)
一旦你为你的脚本创建了WSGI应用,你就可以创建一个更智能的WSGI应用,它可以:
解析URL,并更新环境变量,指定要运行的脚本名称。
用合适的环境运行你的WSGI应用。
想了解更多信息,可以查看http://docs.python.org/library/wsgiref.html。
然后你可以通过mod_wsgi
来配置Apache使用你的WSGI服务器。
详细信息可以查看http://code.google.com/p/modwsgi/。
大家说得都对。这种用法确实不太对。不过,如果你在把你的脚本改成正确的方式时需要一个临时解决方案:
import sys
from django.http import HttpResponse
def cgi_view(request, my_module):
__import__(my_module)
mod = sys.modules[my_module]
text = mod.main()
resp = HttpResponse(text)
# Then set your headers on resp
return resp
我就不详细讲怎么设置头部信息了,留给你自己去研究一下。抱歉有点懒,但我得去工作了。
附言:如果你的脚本没有把所有输出的函数放在一个叫 main() 的函数里,你可以用 subprocess 来获取输出。
“我有一些Python脚本,它们会输出结果,我想把这些结果放到网上。”
这不是Django的用途。你想做的事情可以用更简单的方法来实现,比如这样:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write("magic content goes here")
if __name__=="__main__":
try:
server = HTTPServer(("", 8080), Handler)
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
注意那行 self.wfile.write
。你在这里写的内容会显示在浏览器里。如果需要的话,你可以在 Handler
中使用 self.path
来检查请求了哪个文件。
这个方法在Python 2.6.4上测试过,用Chrome浏览器访问服务器。