Django 开发服务器似乎使用旧版本的 python 源文件
Django development server seems to be using old version of python source file
我正在重写我网站的代码,并使用 manage.py runserver
命令对 Django 的内置 Web 服务器进行测试。现在我遇到了一个非常奇怪的问题:服务器似乎在第一个页面加载时使用了当前版本的 views.py
,但是所有后续的刷新都给我一个服务器错误,因为服务器显然使用的是旧版本views.py
,但所有其他文件的当前版本,这会导致错误——特别是 URL 解析器错误,因为我将一些代码从使用 views.py
中的硬编码路径更改为使用URL 解析器,如果 URL 解析器在等待视图时收到 path(来自旧的 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)
NavigationTemplateResponse
是 TemplateResponse
的子类:
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
),其中 nav_data
与旧 views.py
:
相同
content_type None
template 'design_test/index.html'
url_name 'design_test.views.index'
status None
self <mezgrman.utils.NavigationTemplateResponse object at 0x7f395f8d15f8>
app_name 'design_test'
__class__ <class 'mezgrman.utils.NavigationTemplateResponse'>
context {}
view_prefix 'design_test.views.'
current_app None
nav_data {
'app_root': '/',
'app_title': 'Item Manager',
'navbar': [('Add Item', '/')],
'page_title': 'Item Manager'
}
在我看来,这像是 Django 中的一个错误,但我想知道这种奇怪行为是否还有其他原因。任何帮助将不胜感激。
这不是bug,也不是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()
解决方案 2: 更改您的逻辑以将反向 URL 存储在其他变量中
解决方案 3: 更改您的逻辑以在 url 已经反转时表现不同。该解决方案不是线程安全的!
我正在重写我网站的代码,并使用 manage.py runserver
命令对 Django 的内置 Web 服务器进行测试。现在我遇到了一个非常奇怪的问题:服务器似乎在第一个页面加载时使用了当前版本的 views.py
,但是所有后续的刷新都给我一个服务器错误,因为服务器显然使用的是旧版本views.py
,但所有其他文件的当前版本,这会导致错误——特别是 URL 解析器错误,因为我将一些代码从使用 views.py
中的硬编码路径更改为使用URL 解析器,如果 URL 解析器在等待视图时收到 path(来自旧的 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)
NavigationTemplateResponse
是 TemplateResponse
的子类:
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
),其中 nav_data
与旧 views.py
:
content_type None
template 'design_test/index.html'
url_name 'design_test.views.index'
status None
self <mezgrman.utils.NavigationTemplateResponse object at 0x7f395f8d15f8>
app_name 'design_test'
__class__ <class 'mezgrman.utils.NavigationTemplateResponse'>
context {}
view_prefix 'design_test.views.'
current_app None
nav_data {
'app_root': '/',
'app_title': 'Item Manager',
'navbar': [('Add Item', '/')],
'page_title': 'Item Manager'
}
在我看来,这像是 Django 中的一个错误,但我想知道这种奇怪行为是否还有其他原因。任何帮助将不胜感激。
这不是bug,也不是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()
解决方案 2: 更改您的逻辑以将反向 URL 存储在其他变量中
解决方案 3: 更改您的逻辑以在 url 已经反转时表现不同。该解决方案不是线程安全的!