【问题标题】:Django development server seems to be using old version of python source fileDjango 开发服务器似乎正在使用旧版本的 python 源文件
【发布时间】:2015-03-20 10:41:36
【问题描述】:

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

【问题讨论】:

    标签: python django wsgi


    【解决方案1】:

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

    解决方案 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: 更改逻辑以将反向 url 存储在其他变量中

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

    【讨论】:

    • 谢谢!当然,我明白。我知道字典的行为方式是这样的,但不知何故,当我将字典作为参数传递时,它会被复制。现在很明显了!此外,您的回答让我意识到我不需要在每次页面加载时查找 URL,而只需查找一次。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多