PythonDjango简单站点

PythonDjango简单站点,python,django,Python,Django,我正在尝试使用Django框架创建站点。我查看了Django项目网站上的教程,但包含了很多我不需要的信息。我有提供输出的python脚本,我需要在web上有这个输出。我的问题是,如何简单地管理Django,使其具有启动脚本并在web上提供其输出的链接,或者您提供我可以在其中阅读有关此内容的链接 谢谢。Django不是这样工作的。做这个教程,你会节省很多时间和挫折 我有提供输出的python脚本,我需要在web上有这个输出 Django是干什么的?在python上使用CGI脚本(可能已经有了)或W

我正在尝试使用Django框架创建站点。我查看了Django项目网站上的教程,但包含了很多我不需要的信息。我有提供输出的python脚本,我需要在web上有这个输出。我的问题是,如何简单地管理Django,使其具有启动脚本并在web上提供其输出的链接,或者您提供我可以在其中阅读有关此内容的链接


谢谢。

Django不是这样工作的。做这个教程,你会节省很多时间和挫折

我有提供输出的python脚本,我需要在web上有这个输出


Django是干什么的?在python上使用CGI脚本(可能已经有了)或WSGI应用程序(部署起来有点困难)

Django是一个框架。只需使用CGI脚本

“我有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
行。无论你在那里写什么,最终都会出现在浏览器中。如果有必要,您可以使用
处理程序中的
self.path
检查请求的文件


使用Python 2.6.4进行测试,使用Chrome浏览器访问服务器。

每个人都是对的。这是使用django的错误方式。但是,如果在将脚本转换为适当的惯用法时需要权宜之计:

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

使用Apache的mod_wsgi插件

您可以这样做,以了解如何将现有脚本转换为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应用程序

  • 查看以获取信息

    然后,您可以通过
    mod\u WSGI
    配置Apache以使用您的WSGI服务器


    查看详细信息。

    我知道,但我将创建包含大量信息的web服务器,这只是初始信息,如果我决定使用Django作为存储表单的web框架,从数据库获取信息之后,我也在寻找通过Django处理这些简单事情的方法。您不应该从WSGI应用程序返回一个文件对象,因为WSGI堆栈需要一次发送一个返回的项目,每个项目之间有一个刷新,以触发立即发送回客户端。由于file iterable一次只返回一个字符,所以当响应一次发送一个字符时,您将获得糟糕的性能。替换sys.stdout的技术也不是线程安全的,在典型的多线程WSGI托管机制中也不起作用。此外,mod_stdout_uu与mod_WSGI下的stdout不同,因为mod_WSGI使用特殊的文件对象替换stdout,这会导致输出通过Apache错误日志。通过还原uu stdout uu uu u u u u u u u u u u u u u u u u u u(即使用
    子流程。Popen
    稍微复杂一点,但可能更安全。哎呀,file iterable实际上可能一次返回一行。因此,性能取决于内容。最糟糕的情况是大量空行,一次只返回一个字符。