更改项目范围的变量

时间:2013-05-22 04:23:36

标签: django django-views

我使用Django构建了一个Web应用程序,除其他外,它可以向客户端发送电子邮件。当我处于开发模式时,我不希望任何我的测试电子邮件实际上发送给客户端。相反,我想将电子邮件重新路由给我。

目前,在我的开发服务器(通过git克隆了所有代码)上进行开发时,我只是注释掉具有客户端电子邮件地址的行,并添加我的电子邮件地址。这似乎是处理这种情况的一种非常糟糕的方法。我已经被它烧了(向所有客户发送1,700封电子邮件,哦,看,他们所有 来到我的电子邮件地址 ...残酷)

我在考虑实现一个名为DEV的项目范围变量,该变量位于settings.py。然后,我将构建一个上下文处理器,它只返回该变量的值。这样,在我的所有视图中,我都可以简单地调用上下文处理器,如果DEV为真,我可以将email-to值设置为我的电子邮件地址。否则,email-to地址将是客户端电子邮件。最后,我可以设置git忽略我的settings.py文件,以便dev服务器DEV变量始终为True,生产服务器DEV变量将始终是False

问题解决了吗?这是一个好方法吗?有什么更好的方法可以解决这个问题吗?

<小时/> 的修改

似乎我误解了上下文处理器在模板中使用而不是在视图中的事实。我想我的问题实际上是,我如何处理这个问题,以便我可以从任何视图中检查这个变量?

1 个答案:

答案 0 :(得分:0)

除了上下文处理器之外,这是你想要做的。它与您的观点无关。

我要做的是以下装饰:

def email(function=None):
    def _decorator(view_function):
        def _view(request, *args, **kwargs):
            if settings.DEV:
                settings.EMAIL_TO = 'mymail@host.com'
            return view_function(request, *args, **kwargs)
        _view.__name__ = view_function.__name__
        _view.__dict__ = view_function.__dict__
        _view.__doc__ = view_function.__doc__

        return _view

    if function:
        return _decorator(function)
    return _decorator

这样你可以做到

@email
def my_view(request, args):
    #send your emails here
    return HttpResponse("mail sent")

我认为显式装饰器比使用Middlewares(你与ContextProcessor混淆)要好得多。

希望它有所帮助!