Django服务器代码未更新

2024-06-03 01:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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(schedule=0)
def run_background_task(param):
    obj = MyModel.objects.get(field=param)
    obj.predict()

预测函数

这就是创建result的地方。我不允许显示此代码,但请注意,我确信实际代码与此无关。它起作用了。我把它改了,以便快速更新。我搞错了。然后我修正了错误,但得到了同样的错误。我甚至回到了旧版本,我仍然得到同样的错误。因此,此错误与此函数的内容无关。

如果我能帮上什么忙,请告诉我。


Tags: run代码inpy服务器task错误line
3条回答

可能这就是你要找的吗?

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'}))

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

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

python manage.py clean_pyc

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

如果运行的是django提供的开发服务器,即./manage.py runserver,则不应遇到此问题,因为它会在保存.py文件时自动重新编译。但是,如果您运行的是wsgi,那么说使用apache服务器是一个常见的问题,但是使用的是一个非常简单的解决方案。基本上,当您更改.py文件时,服务器仍将使用以前编译的python文件。所以解决方案是重新启动apache sudo service apache2 restart(这是一个过度终止),或者只要运行touch wsgi.py,只要wsgi.py位于项目中的任何位置,它就会告诉它重新编译.py文件。当然,您也可以删除.pyc文件,但这太繁琐了。

编辑:

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

现在,在签出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()

相关问题 更多 >