Skip to main content
 首页 » 编程设计

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

2024年10月25日33think

我正在重写我网站的代码,并使用 manage.py runserver 命令对 Django 的内置网络服务器进行测试。现在我遇到了一个非常奇怪的问题:服务器似乎在第一个页面加载时使用当前版本的 views.py,但所有后续刷新都给我一个服务器错误,因为服务器是显然使用旧版本的 views.py,但所有其他文件的当前版本,这会导致错误——特别是 URL 解析器错误,因为我更改了一些代码,不再使用 中的硬编码路径>views.py 以使用 URL 解析器,如果 URL 解析器收到一个路径(来自旧的 views.py),这当然不起作用当它需要一个 View 名称时(我将其放入新的 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 中的一个错误,但我想知道这种奇怪行为是否还有其他原因。任何帮助将不胜感激。

请您参考如下方法:

这不是错误,也不是 views.py 的旧代码。您只是在 View 中覆盖 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 已经反转时表现不同。该解决方案不是线程安全的!