我有一个项目,其目录设置如下:
myproject
someapp
sites
foo
settings.py - site specific
settings.py - global
我正在使用twisted web.wsgi来服务这个项目。我遇到的问题是设置正确的环境。
import sys
import os
from twisted.application import internet, service
from twisted.web import server, resource, wsgi, static, vhost
from twisted.python import threadpool
from twisted.internet import reactor
from django.core.handlers.wsgi import WSGIHandler
from django.core.management import setup_environ,ManagementUtility
sys.path.append(os.path.abspath("."))
sys.path.append(os.path.abspath("../"))
DIRNAME= os.path.dirname(__file__)
SITE_OVERLOADS = os.path.join(DIRNAME,'sites')
def import_module(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod,comp)
return mod
def buildServer():
hosts = [d for d in os.listdir(SITE_OVERLOADS) if not os.path.isfile(d) and d != ".svn"]
root = vhost.NameVirtualHost()
pool = threadpool.ThreadPool()
pool.start()
reactor.addSystemEventTrigger('after', 'shutdown', pool.stop)
for host in hosts:
settings = os.path.join(SITE_OVERLOADS,"%s/settings.py" % host)
if os.path.exists(settings):
sm = "myproject.sites.%s.settings" % host
settings_module = import_module(sm)
domain = settings_module.DOMAIN
setup_environ(settings_module)
utility = ManagementUtility()
command = utility.fetch_command('runserver')
command.validate()
wsgi_resource = wsgi.WSGIResource(reactor,pool,WSGIHandler())
root.addHost(domain,wsgi_resource)
return root
root = buildServer()
site = server.Site(root)
application = service.Application('MyProject')
sc = service.IServiceCollection(application)
i = internet.TCPServer(8001, site)
i.setServiceParent(sc)
我正在尝试为每个站点设置vhosts,该站点在子站点“sites”中有一个设置模块。但是,似乎正在为每个站点共享设置。
答案 0 :(得分:1)
同一个Python进程中的Django项目将共享相同的设置。您需要将它们作为单独的进程生成,以便它们使用单独的设置模块。
答案 1 :(得分:0)
由于您的目标是一堆无共享的虚拟主机,因此您可能无法通过最简单的方式尝试设置流程。那么,如何将.tac文件更改为仅启动单个虚拟主机的服务器,启动大量实例(手动,使用shell脚本,使用另一个简单的Python脚本等),然后放置反向代理( nginx,Apache,甚至是另一个Twisted Web进程)在所有这些进程面前?
你可以使用Twisted完成所有操作,它甚至可能带来一些优势,但是对于刚入门,您可能更关注您的网站,而不是对您的部署过程进行微调。如果问题是事情没有更好地整合,那么就是重新审视问题并尝试改进解决方案的时候了。