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 ) 。
我已经把所有的都删除了.pycdjango 项目目录中的所有文件并重新启动了机器,但没有效果。问题仍然存在。
我在 Python 3.4.2 上使用 Django 1.7.6。
\n\n这是当前的views.py(这没有什么意义,只是为了测试):
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)\nRun Code Online (Sandbox Code Playgroud)\n\n是NavigationTemplateResponse一个子类TemplateResponse:
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)\nRun Code Online (Sandbox Code Playgroud)\n\nDjango 服务器回溯明确证明它使用的是旧版本的,这些是发生错误时的views.py局部变量(不含 ) ,其中与旧版本中的相同WSGIRequestnav_dataviews.py:
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 }\nRun Code Online (Sandbox Code Playgroud)\n\n在我看来,这就像 Django 中的一个错误,但我想知道这种奇怪行为是否还有其他原因。任何帮助,将不胜感激。
\n这不是错误,也不是旧代码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 已反转时表现不同。该解决方案不是线程安全的!