在Twisted Web下运行Django测试服务器

4 投票
1 回答
1971 浏览
提问于 2025-04-15 18:33

我正在写一个应用程序,这个程序使用了 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()

我知道这有点像是个小窍门,如果你有更好的解决方案,请在这里分享。

谢谢。

1 个回答

2

这可能正是你需要的东西:http://github.com/clemesha/twisted-wsgi-django

撰写回答