首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用uWSGI启动时未加载Models.py

使用uWSGI启动时未加载Models.py
EN

Stack Overflow用户
提问于 2012-06-20 01:03:52
回答 2查看 664关注 0票数 1

我有一个系统,在这个系统中,我需要在请求之前和之后完全动态地控制URL。

我使用信号来实现这一点,对于预请求信号(我遇到问题的那个信号,我有一个类似这样的中间件,它连接到信号,允许它检查当前的request.path是否适用于它,然后使用它得到的第一个。这通常工作得很好,而且相当优雅):

代码语言:javascript
运行
复制
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

现在,为了注册在Django路由堆栈之前发生的事情,我在应用程序的models.py中执行如下操作

代码语言:javascript
运行
复制
@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

它在我的开发服务器上也运行得很好。

然而,这个问题出现在生产环境中,我使用的是uWSGI。我像这样启动uWSGI (来自初创公司):

代码语言:javascript
运行
复制
sudo /usr/local/bin/uwsgi --emperor '/srv/*/uwsgi.ini' --enable-threads --single-interpreter

我的uwsgi.ini是这样的:

代码语言:javascript
运行
复制
[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进程/线程,它们似乎只在第一个请求时加载models.py,这意味着每个进程的第一个请求将无法连接信号。这意味着我有n个(其中n是进程数)请求完全失败,因为models.py在启动时没有加载(就像它在开发中一样)。

我的uWSGI配置有误吗?有没有更好的方法在启动时强制连接信号?

EN

回答 2

Stack Overflow用户

发布于 2012-06-20 06:24:57

Django实际上是懒惰地加载东西。使用开发服务器会给人一种关于在真实的WSGI服务器中如何工作的错误的安全感,因为开发服务器加载管理命令会强制进行大量的早期初始化,这在生产服务器上是不会发生的。

你可能会读到:

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

这解释了mod_wsgi中出现的问题。同样的事情也会发生在uWSGI上。

票数 3
EN

Stack Overflow用户

发布于 2012-06-21 20:37:36

好的,事实证明我需要让我的中间件钩子是process_view而不是process_request:

代码语言:javascript
运行
复制
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

现在它工作得很好!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11105832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档