2012-06-19 1 views
1

У меня есть система, в которой мне нужен полный динамический контроль URL-адресов, как до, так и после запроса.Model.py не загружается при запуске с помощью uWSGI

Я использую сигналы для этого и для сигнала предварительного запроса (тот, с которым у меня возникают проблемы, у меня есть часть промежуточного программного обеспечения, подобное этому, которое подключается к сигналу, позволяет проверить, request.path относится к нему, а затем идет с первым он получает Это нормально работает нормально, и довольно элегантно):.

class PreRouteMiddleWare(object): 
    def process_request(self, request): 
     url = request.path.strip('/') 
     if url == '': 
      url = '/' 
     pre_routes = pre_route.send(sender=request, url=url) 
     for reciever, response in pre_routes: 
      if response: 
       return response 
     return None 

Теперь, чтобы зарегистрировать то, что происходит «предварительно» стек маршрутизации Джанго, Я делаю что-то подобное в приложении :

@receiver(pre_route) 
def try_things(sender, url, **kwargs): 
    try: 
     thing= Thing.objects.get(url=url) 
     from myapp.views import myview 
     return myview(sender, some_args) 
    except Thing.DoesNotExist: 
     return False 

Что также отлично работает на моем dev-сервере.

Однако проблема возникает в производстве, где я использую uWSGI. Я начинаю uWSGI (от выскочки), как это:

sudo /usr/local/bin/uwsgi --emperor '/srv/*/uwsgi.ini' --enable-threads --single-interpreter 

И мой uwsgi.ini выглядит следующим образом:

[uwsgi] 
socket = /srv/new/uwsgi.sock 
module = wsgi:app 
chdir = /srv/new/myapp 
virtualenv = /srv/new 
env = DJANGO_SETTINGS_MODULE=myapp.settings 
uid = wsgi_new 
gid = www-data 
chmod = 770 
processes = 2 

Что, кажется, происходит для каждого процесса uWSGI/нить, они только кажутся load models.py по первому запросу, что означает, что первый запрос для каждого процесса не сможет подключить сигналы. Это означает, что у меня есть n (где n - количество процессов) запросы завершаются полностью, потому что models.py не загружается при запуске (как это происходит в процессе разработки).

Я настраиваю uWSGI неправильно? Есть ли лучший способ заставить сигналы подключаться при запуске?

ответ

3

Django на самом деле лениво загружает вещи. Использование сервера разработки дает ложное представление о том, как все будет работать на реальном сервере WSGI, потому что загрузка команд управления сервером разработки заставляет много ранней инициализации, которая не возникает с производственным сервером.

Вы можете прочитать:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

, объясняющую проблему, как это происходит в mod_wsgi. То же самое произойдет и для uWSGI.

0

Хорошо, получается, что мне нужно, чтобы сделать мой промежуточный крюк process_view в отличие от process_request:

class PreRouteMiddleWare(object): 
    def process_view(self, request, *args, **kwargs): 
     url = request.path.strip('/') 
     if url == '': 
      url = '/' 
     pre_routes = pre_route.send(sender=request, url=url) 
     for reciever, response in pre_routes: 
      if response: 
       return response 
     return None 

И теперь он прекрасно работает!

Смежные вопросы