在非根目录下使用Twisted和Django提供静态文件

2 投票
3 回答
1143 浏览
提问于 2025-04-15 14:12

我正在把一个应用程序(Sage)从Twisted迁移到Django。

现在,静态文档是通过/doc/static来提供的,而实时生成的文档则通过/doc/live来提供。

请问,是否可以只用Twisted来提供/doc/static,而让Django来处理其余的/doc/*呢?

3 个回答

-1

如果我没有理解错这个问题,为什么不在请求到达Django之前,就把/doc/static这个网址重写成Twisted呢?也就是说,可以在Apache或者代理服务器的层面上处理这个问题。

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

3

看看这个链接,里面讲了如何在Twisted上运行Django:(以下步骤来自博客)

  1. 使用easy_install安装Twisted
  2. 使用easy_install安装Django
  3. 然后就可以开始了!
  4. 用命令django-admin.py startproject foo创建一个新的项目
  5. 创建一个名为myapp.py的文件,里面写入以下代码:

    from django.core.handlers.wsgi import WSGIHandler

    application = WSGIHandler()

  6. 设置环境变量,输入:export DJANGO_SETTINGS_MODULE=foo.settings

  7. 运行命令twistd -no web --wsgi=myapp.application

在评论区还有一个例子,讲了如何用Twisted直接处理媒体文件,然后再把请求传给Django:

要处理媒体文件,只需使用来自"twisted.web"的"static.File",像这样:staticrsrc = static.File(os.path.join(os.path.abspath("."), "mydjangosite/media")),然后把这个资源添加到你的根资源中,像这样:root.putChild("media", staticrsrc)

免责声明:我自己没有尝试过这个,但博客文章看起来很新,作者也愿意回答问题。

补充:还有另一篇关于这个主题的文章,里面有如何让它工作的说明,可以在这里找到,似乎还包括了如何直接用Twisted提供静态文件。

2

这件事是可以做到的,只是优雅程度有所不同……我明白这是为了过渡,所以可能不需要太美观。

如果你必须让Twisted来处理静态文件,那你要么在Django里搞个代理来处理这些文件,要么在整个系统前面加个东西。还有,Perlbal配合VPATH也能做到这一点,它会用正则表达式来处理网址,让它们指向正确的服务。

如果你不一定要用Twisted,还有很多其他方法可以实现。你可以继续使用Perlbal或者类似的东西来提供静态文件,这样从长远来看也是有必要的。

撰写回答