Python Django 简单网站

4 投票
6 回答
945 浏览
提问于 2025-04-15 19:03

我正在尝试用Django框架创建一个网站。我在Django项目的网站上看了教程,但里面有很多我不需要的信息。我有一些Python脚本,它们可以输出结果,我想把这些结果放到网上。我的问题是,怎么简单地管理Django,让它有一个链接可以启动脚本,并把输出显示在网页上?或者你能给我一个链接,让我可以了解这个吗?

谢谢。

6 个回答

1

使用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应用,它可以:

  1. 解析URL,并更新环境变量,指定要运行的脚本名称。

  2. 用合适的环境运行你的WSGI应用。

想了解更多信息,可以查看http://docs.python.org/library/wsgiref.html

然后你可以通过mod_wsgi来配置Apache使用你的WSGI服务器。

详细信息可以查看http://code.google.com/p/modwsgi/

1

大家说得都对。这种用法确实不太对。不过,如果你在把你的脚本改成正确的方式时需要一个临时解决方案:

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 来获取输出。

4

“我有一些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浏览器访问服务器。

撰写回答