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

Mez*_*man 5 python django wsgi

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

\n\n

我已经把所有的都删除了.pycdjango 项目目录中的所有文件并重新启动了机器,但没有效果。问题仍然存在。

\n\n

我在 Python 3.4.2 上使用 Django 1.7.6。

\n\n

这是当前的views.py(这没有什么意义,只是为了测试):

\n\n
from mezgrman.utils import NavigationTemplateResponse\n\nNAV_DATA = {\n    \'app_root\': \'index\',\n    \'app_title\': "Item Manager",\n    \'navbar\': [\n        ("Add Item", \'index\'),\n    ],\n    \'page_title\': "Item Manager",\n}\n\ndef index(request):\n    return NavigationTemplateResponse(request, "design_test/index.html", NAV_DATA)\n
Run Code Online (Sandbox Code Playgroud)\n\n

NavigationTemplateResponse一个子类TemplateResponse

\n\n
from django.template.response import TemplateResponse\nfrom django.core.urlresolvers import resolve, reverse\n\nclass NavigationTemplateResponse(TemplateResponse):\n    def __init__(self, request, template, nav_data, context = None, content_type = None, status = None, current_app = None):\n        if context is None:\n            context = {}\n\n        url_name = resolve(request.path).url_name\n        app_name = url_name.split(".")[0]\n        view_prefix = app_name + ".views."\n\n        nav_data[\'app_root\'] = reverse(view_prefix + nav_data.get(\'app_root\', ""))\n\n        for index, entry in enumerate(nav_data.get(\'navbar\', [])):\n            title, view_name = entry\n            nav_data[\'navbar\'][index] = (title, reverse(view_prefix + view_name))\n\n        context.update(nav_data)\n        return super().__init__(request, template, context, content_type, status, current_app)\n
Run Code Online (Sandbox Code Playgroud)\n\n

Django 服务器回溯明确证明它使用的是旧版本的,这些是发生错误时的views.py局部变量(不含 ) ,其中与旧版本中的相同WSGIRequestnav_dataviews.py

\n\n
content_type        None\ntemplate            \'design_test/index.html\'\nurl_name            \'design_test.views.index\'\nstatus              None\nself                <mezgrman.utils.NavigationTemplateResponse object at 0x7f395f8d15f8>\napp_name            \'design_test\'\n__class__           <class \'mezgrman.utils.NavigationTemplateResponse\'>\ncontext             {}\nview_prefix         \'design_test.views.\'\ncurrent_app         None\nnav_data            {\n                        \'app_root\': \'/\',\n                        \'app_title\': \'Item Manager\',\n                        \'navbar\': [(\'Add Item\', \'/\')],\n                        \'page_title\': \'Item Manager\'\n                    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我看来,这就像 Django 中的一个错误,但我想知道这种奇怪行为是否还有其他原因。任何帮助,将不胜感激。

\n

Gwy*_*idD 2

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

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

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()
Run Code Online (Sandbox Code Playgroud)

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

解决方案 3:更改逻辑,以便在 url 已反转时表现不同。该解决方案不是线程安全的!