django 服务器代码未更新

Posted

技术标签:

【中文标题】django 服务器代码未更新【英文标题】:django server code not updating 【发布时间】:2015-03-15 11:09:33 【问题描述】:

我有一个广泛的程序正在我的服务器上运行。出现错误的行如下所示:

result[0].update(dictionary)

result[0] 看起来像 ("label",key:value,...),所以我收到一条错误消息,指出 tuple 没有 update

当我把它改成result[0][1].update(dictionary) 时,我得到了同样的错误!

然后我在上面添加了print "test" 以查看发生了什么,我得到了同样的错误,但它给了我在 print 语句中发生的错误。这告诉我服务器正在运行的代码是原始代码,而不是经过编辑的代码。我尝试重新启动服务器。我已经保存了我的代码。我不明白为什么或如何发生这种情况。可能是什么原因造成的,我怎样才能让服务器识别较新的版本?

错误信息

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/background_task/tasks.py", line 160, in run_task
    tasks.run_task(task.task_name, args, kwargs)                                                                                                      [2/1832]
  File "/usr/local/lib/python2.7/dist-packages/background_task/tasks.py", line 45, in run_task
    task.task_function(*args, **kwargs)
  File "/.../proj/tasks.py", line 10, in automap_predict
    automap_obj.predict()
  File "/.../proj/models.py", line 317, in predict
    prediction = predictions[1]
  File "/.../proj/models.py", line 143, in predict
    #this is a recursive call
  File "/.../proj/models.py", line 143, in predict
    #this is a recursive call
  File "/.../proj/models.py", line 127, in predict
    #result[0].update(dictionary) this happens at the base case of the recursion
AttributeError: 'tuple' object has no attribute 'update'

请注意,我在注释掉的行上收到此错误。显示这不是真正运行的代码。

查看

def view(request,param):
    run_background_task(param)
    return redirect("project.view.reload")

background_task

@background(schedule=0)
def run_background_task(param):
    obj = MyModel.objects.get(field=param)
    obj.predict()

预测函数

这是创建result 的地方。我不允许显示此代码,但请注意,我确信实际代码是无关紧要的。它正在工作。我更改了它以进行快速更新。我有一个错误。然后我修复了错误,但继续得到同样的错误。我什至回到了正在工作的旧版本,但仍然遇到同样的错误。因此这个错误与这个函数的内容无关。

如果我能提供更多帮助,请告诉我。

【问题讨论】:

假设 Python 2,print type(result[0]) 返回什么? 我试过了。我没有得到结果,因为它正在运行旧版本的程序,因此没有运行任何编辑 您是否尝试过删除所有.pyc 文件(如果有)? 我以前从未这样做过。请注意,这是在 models.py 中的 Manager 中的函数内部...删除 models.pyc 会不会有问题? 你确定文件路径是正确的,并且你没有在不同的 virtualenv 中工作吗?你重启wsgi服务器了吗? 【参考方案1】:

如果你运行的是 django 提供的开发服务器,即./manage.py runserver,你应该不会遇到这个问题,因为它会在保存 .py 文件时自动重新编译。但是,如果您使用 apache 服务器运行 wsgi,这是一个常见问题,但有一个非常简单的解决方案。基本上会发生什么,每当您更改 .py 文件时,服务器仍将使用先前编译的 python 文件。所以解决方案是重新启动 apache sudo service apache2 restart(这是一个矫枉过正)或简单地运行 touch wsgi.py,无论您的 wsgi.py 位于项目中的哪个位置,它都会告诉它重新编译 .py 文件。当然你也可以删除.pyc文件,但是太繁琐了。

编辑:

我只是注意到您正在使用@background 装饰器,这让我相信您正在使用django-background-task。如果是这种情况,您必须确保该应用程序实际上也考虑了您的代码更改,这在使用 touch wsgi.py 方法重新编译 python 文件时可能不会自动发生。我没有使用此特定应用程序的经验,但例如使用celery,这是一个用于调度任务的更复杂的应用程序,您还必须重新启动工作程序以反映代码中的更改,因为工作程序实际上存储代码的腌制版本。

现在在检查了django-background-task 应用程序(看起来像您正在使用的应用程序)之后,理论上您不应该做任何特别的事情,但只是为了确保您可以清除所有已安排的任务并重新安排它们再次。我没试过,但你应该可以通过./manage.py shell

>>> from background_task.tasks import tasks
>>> tasks._tasks = 

你甚至可能需要清除数据库,以获取DBTaskRunner

>>> from background_task.models import Task
>>> Task.objects.all().delete()

【讨论】:

+1 触摸 wsgi 文件是我能够在 Django 中稍微优雅地解决这个问题的唯一方法。要在 Python 中实现触摸(不使用系统命令),请参阅 ***.com/questions/1158076/…【参考方案2】:

这就是你要找的吗?

result = (
        ("item1",'key1': 'val1'),
        ("item2",'key2': 'val2'),
    )
    my_dict = 
        'key1': 'updated val',
        'new key': 'new value'
    
    pprint.pprint(result[0])    # Result: ('item1', 'key1': 'val1')
    key, dct = result[0]    
    dct.update(my_dict)
    pprint.pprint(result)       # Result: (('item1', 'key1': 'updated val', 'new key': 'new value'), ('item2', 'key2': 'val2'))

【讨论】:

这是我试图做的,但没有奏效。问题不在于代码,而在于服务器。【参考方案3】:

该问题可能与位于服务器上项目文件夹中的已编译 python 文件或“.pyc”文件有关。这些文件是在解释 Python 代码时自动生成的。有时即使存在新代码并继续运行旧代码,这些文件也不会重新编译。

您可以通过 pip 安装“django-extensions”,它带有一个方便的 manage.py 命令,可以帮助您清除这些文件:

python manage.py clean_pyc

如果这不起作用,那么您需要重新启动运行代码的 wsgi 服务器,因为 python 代码在内存中。

【讨论】:

【参考方案4】:

如果代码没有更新,解决方案将取决于您为应用程序提供服务的方式。如果你使用 ./manage.py runserver,你应该没有问题。此外,如果使用 apache + mod_python 服务,如果您重新启动服务器,则应重新加载代码。

但我假设你没有做任何一个,因为你仍然有这个问题。如果您使用 uWSGI 或 gunicorn,它们在与服务器不同的进程中运行,您需要单独重新启动它们。 uWSGI也可以设置为在每次设置文件更改时重新加载应用程序,所以通常我只需调用touch myapp.ini来重新加载代码。

【讨论】:

【参考方案5】:

基本上会发生什么,每当您更改 .py 文件时,服务器仍将使用先前编译的 python 文件。因此解决方案是重新启动 apache sudo service apache2 restart (这是一个矫枉过正)或简单地运行 touch wsgi.py,无论您的 wsgi.py 位于项目中的哪个位置,它都会告诉它重新编译 .py 文件。当然你也可以删除.pyc文件,但是太繁琐了。

您正在使用@background 装饰器,这让我相信您正在使用 django-background-task。如果是这种情况,您必须确保该应用程序实际上也考虑了您的代码更改,这在使用 touch wsgi.py 方法重新编译 python 文件时可能不会自动发生。我没有使用此特定应用程序的经验,但例如使用 celery,它是用于调度任务的更复杂的应用程序,您还必须重新启动工作程序以反映代码中的更改,因为工作程序实际上存储了一个腌制版本的代码。

现在,在检查了 django-background-task 应用程序(看起来就像您正在使用的那个)之后,理论上您不应该做任何特别的事情,但只是为了确保您可以清除任何计划任务和重新安排他们。

【讨论】:

【参考方案6】:

您的result 似乎与您想象的不一样,我只是使用了与您描述的格式相同的格式,并且您看到它有效。您应该检查它是否返回正确数据的函数。

>>> a = (('label', 'k':'3'),)
>>> print (a[0])
('label', 'k': '3')

>>> a[0][1].update('k':'6')
>>> print (a[0])
('label', 'k': '6')
>>> 

仅供参考,如您所见 Here,元组是不可变的序列类型,因此它们不支持更新,这就是它们不需要定义 update 函数的原因。

如果你想更新result[0],它本身就是一个元组,(正如显示的错误消息清楚地理解的那样),你必须用更新的实体创建一个新的元组。

【讨论】:

以上是关于django 服务器代码未更新的主要内容,如果未能解决你的问题,请参考以下文章

查找未使用的 Django 代码以删除

Django 开发服务器重新启动后未注册 Django 模板过滤器

未找到任何参数的“my_views_name”反向。 django - jquery,连接服务器端和客户端 js

Django用户特定变量在后端未更新

更改代码后Vue组件未更新[关闭]

简析Jenkins的SVN插件未更新到最新代码