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 模板过滤器