Django开发服务器似乎使用旧版本的python源文件

时间:2015-03-20 10:41:36

标签: python django wsgi

我正在重写我网站的代码,并使用manage.py runserver命令使用Django的内置Web服务器进行测试。现在我遇到了一个非常奇怪的问题:服务器似乎在第一页加载时使用当前版本的views.py,但所有后续刷新都会给我一个服务器错误,因为服务器正在使用一个旧版本的views.py,但所有其他文件的当前版本,导致错误 - 特别是URL解析程序错误,因为我将一些代码从使用views.py中的硬编码路径更改为使用URL解析程序,当URL解析器收到路径(来自旧views.py)时,当它期待一个视图名称(我放入其中时,这当然不起作用)新views.py)。

我已经删除了django项目目录中的所有.pyc文件并重启了机器,但无济于事。问题依然存在。

我在Python 3.4.2上使用Django 1.7.6。

这是当前的views.py(它没有用,它只是用于测试):

from mezgrman.utils import NavigationTemplateResponse

NAV_DATA = {
    'app_root': 'index',
    'app_title': "Item Manager",
    'navbar': [
        ("Add Item", 'index'),
    ],
    'page_title': "Item Manager",
}

def index(request):
    return NavigationTemplateResponse(request, "design_test/index.html", NAV_DATA)

NavigationTemplateResponseTemplateResponse的子类:

from django.template.response import TemplateResponse
from django.core.urlresolvers import resolve, reverse

class NavigationTemplateResponse(TemplateResponse):
    def __init__(self, request, template, nav_data, context = None, content_type = None, status = None, current_app = None):
        if context is None:
            context = {}

        url_name = resolve(request.path).url_name
        app_name = url_name.split(".")[0]
        view_prefix = app_name + ".views."

        nav_data['app_root'] = reverse(view_prefix + nav_data.get('app_root', ""))

        for index, entry in enumerate(nav_data.get('navbar', [])):
            title, view_name = entry
            nav_data['navbar'][index] = (title, reverse(view_prefix + view_name))

        context.update(nav_data)
        return super().__init__(request, template, context, content_type, status, current_app)

Django服务器回溯明确证明它使用旧版本的views.py,这些是错误发生时的局部变量(没有WSGIRequest),其中{{} 1}}与旧nav_data中的相同:

views.py

在我看来,这似乎是Django中的一个错误,但我想知道这种奇怪行为的另一个原因是什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

这不是错误,而且这不是views.py的旧代码。您只需在视图中覆盖NAV_DATA中的数据即可。在启动服务器NAV_DATA的第一个请求中有它的初始值,但在该请求中,您将使用反向URL覆盖某些值。在重新加载dev服务器之前,请求之间的更改仍然存在。

解决方案1:处理你的dict副本:

class NavigationTemplateResponse(TemplateResponse):
    def __init__(self, request, template, nav_data, context = None, content_type = None, status = None, current_app = None):
        nav_data = nav_data.copy()

解决方案2:更改您的逻辑以将反转网址存储在其他变量中

解决方案3:更改您的逻辑,以便在网址已被撤消时表现不同。该解决方案线程安全!