在Twisted Web下运行Django测试服务器
我正在写一个应用程序,这个程序使用了 twisted web 来处理异步请求,同时用 Django 来提供普通的内容。我觉得如果能让这两个都在同一个 twisted reactor 下通过 Django 的 WSGI 接口运行,那就太好了。
我还想用 Django 提供的测试服务器功能来测试我的应用。一开始,我只是简单地创建了测试数据库,并在 reactor 下启动了 WSGIHandler,但这并没有成功,因为 WSGIHandler 在初始化时看不到创建的测试数据库。
所以,我决定找个变通办法,让数据库在第一次请求时创建,并加载一些初始数据,这样在测试服务器上是可以的。以下是我使用的(简化版的)脚本:
import os, sys
import django.core.handlers.wsgi
from django.core.management import call_command
from django.db import connection
from twisted.web.wsgi import WSGIResource
from twisted.internet import reactor
from twisted.web.server import Site
sys.path.append('/path/to/myapp')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
_app = django.core.handlers.wsgi.WSGIHandler()
initialized = False
fixtures = (...) # Put your fixtures path here
def app(e,sr):
global initialized
if not initialized:
connection.creation.create_test_db(verbosity=1)
call_command('loaddata', *fixtures, verbosity=1)
initialized = True
return _app(e,sr)
res = WSGIResource(reactor, reactor.getThreadPool(), app)
factory = Site(res)
reactor.listenTCP(8888, factory)
reactor.run()
我知道这有点像是个小窍门,如果你有更好的解决方案,请在这里分享。
谢谢。