django 服务器代码不更新
django server code not updating
我的服务器上有一个扩展程序 运行。有错误的行如下所示:
result[0].update(dictionary)
result[0]
看起来像 ("label",{key:value,...})
所以我收到一条错误消息说 tuple
没有 update
当我将其修复为 result[0][1].update(dictionary)
时,我遇到了同样的错误!
然后我在上面添加了print "test"
看看发生了什么,我得到了同样的错误,但是它给了我打印语句中发生的错误。这告诉我服务器 运行 的代码是原始代码,而不是编辑后的代码。我尝试重新启动服务器。我已经保存了我的代码。我不明白为什么会这样,也不明白这是怎么发生的。是什么原因造成的,我怎样才能让服务器识别出更新的版本?
错误信息
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
的地方。我不允许显示此代码,但请注意,我确信实际代码是无关紧要的。它正在工作。我更改了它以进行快速更新。我得到一个错误。然后我修复了错误,但继续得到同样的错误。我什至回到了正在运行的旧版本,但我仍然遇到同样的错误。因此这个错误与这个函数的内容无关。
如果我能提供更多帮助,请告诉我。
可能这就是您要找的东西?
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'}))
如果您运行正在使用 django 提供的开发服务器,即 ./manage.py runserver
,您应该不会遇到这个问题,因为它会在 .py 文件保存时自动重新编译。但是如果你是 运行ning wsgi say with apache server 这是一个常见的问题,但是有一个非常简单的解决方案。基本上会发生什么,无论何时更改 .py 文件,服务器仍将使用以前编译的 python 文件。因此,解决方案是要么重新启动 apache sudo service apache2 restart
(这太过分了),要么简单地 运行 touch wsgi.py
,无论您的 wsgi.py 位于项目中的哪个位置,这都会告诉它重新编译。 py 文件。当然你也可以删除.pyc文件,但是太麻烦了
编辑:
我只是注意到您正在使用 @background
装饰器,这让我相信您正在使用 django-background-task. If that's the case, you will have to make sure this app actually takes your code changes into account too, which may not happen automatically while recompiling python files using touch wsgi.py
approach. I don't have experience with this particular app, but for example with 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()
此问题可能与已编译的 python 文件或位于服务器项目文件夹中的“.pyc”文件有关。这些文件是在解释 python 代码时自动生成的。有时,即使存在新代码,这些文件也不会重新编译,它会保留 运行 旧代码。
您可以通过 pip 安装 "django-extensions",它附带一个方便的 manage.py 命令,可以帮助您清除这些文件:
python manage.py clean_pyc
如果这不起作用,那么您需要重新启动作为 运行 代码的 wsgi 服务器,因为 python 代码在内存中。
看来您的 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]
(如显示的错误消息所清楚地理解的那样),您必须使用更新的实体创建一个新的元组。
如果代码未更新,解决方案将取决于您如何为您的应用程序提供服务。如果您使用的是 ./manage.py runserver,则应该不会有问题。此外,如果使用 apache + mod_python 如果您重新启动服务器,则应重新加载代码。
但我假设你没有做任何一个,因为你仍然有这个问题。如果您使用 uWSGI 或 gunicorn,它们在与服务器不同的进程中运行,您将需要单独重新启动它们。 uWSGI 也可以设置为每次设置文件更改时重新加载应用程序,所以通常我只是调用 touch myapp.ini
来重新加载代码。
基本上会发生什么,无论何时更改 .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 实际上存储了一个腌制版本的代码。
现在,在检查了 django-background-task 应用程序(它看起来像您正在使用的应用程序)之后,理论上您不需要做任何特别的事情,只是为了确保您可以清除任何预定的任务并重新安排它们。
我遇到了类似的问题,是 gunicorn 缓存没有更新。
第一次尝试
sudo systemctl restart gunicorn
如果还不能解决问题:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn (Check for faults)
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
然后应该更新服务器
我的服务器上有一个扩展程序 运行。有错误的行如下所示:
result[0].update(dictionary)
result[0]
看起来像 ("label",{key:value,...})
所以我收到一条错误消息说 tuple
没有 update
当我将其修复为 result[0][1].update(dictionary)
时,我遇到了同样的错误!
然后我在上面添加了print "test"
看看发生了什么,我得到了同样的错误,但是它给了我打印语句中发生的错误。这告诉我服务器 运行 的代码是原始代码,而不是编辑后的代码。我尝试重新启动服务器。我已经保存了我的代码。我不明白为什么会这样,也不明白这是怎么发生的。是什么原因造成的,我怎样才能让服务器识别出更新的版本?
错误信息
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
的地方。我不允许显示此代码,但请注意,我确信实际代码是无关紧要的。它正在工作。我更改了它以进行快速更新。我得到一个错误。然后我修复了错误,但继续得到同样的错误。我什至回到了正在运行的旧版本,但我仍然遇到同样的错误。因此这个错误与这个函数的内容无关。
如果我能提供更多帮助,请告诉我。
可能这就是您要找的东西?
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'}))
如果您运行正在使用 django 提供的开发服务器,即 ./manage.py runserver
,您应该不会遇到这个问题,因为它会在 .py 文件保存时自动重新编译。但是如果你是 运行ning wsgi say with apache server 这是一个常见的问题,但是有一个非常简单的解决方案。基本上会发生什么,无论何时更改 .py 文件,服务器仍将使用以前编译的 python 文件。因此,解决方案是要么重新启动 apache sudo service apache2 restart
(这太过分了),要么简单地 运行 touch wsgi.py
,无论您的 wsgi.py 位于项目中的哪个位置,这都会告诉它重新编译。 py 文件。当然你也可以删除.pyc文件,但是太麻烦了
编辑:
我只是注意到您正在使用 @background
装饰器,这让我相信您正在使用 django-background-task. If that's the case, you will have to make sure this app actually takes your code changes into account too, which may not happen automatically while recompiling python files using touch wsgi.py
approach. I don't have experience with this particular app, but for example with 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()
此问题可能与已编译的 python 文件或位于服务器项目文件夹中的“.pyc”文件有关。这些文件是在解释 python 代码时自动生成的。有时,即使存在新代码,这些文件也不会重新编译,它会保留 运行 旧代码。
您可以通过 pip 安装 "django-extensions",它附带一个方便的 manage.py 命令,可以帮助您清除这些文件:
python manage.py clean_pyc
如果这不起作用,那么您需要重新启动作为 运行 代码的 wsgi 服务器,因为 python 代码在内存中。
看来您的 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]
(如显示的错误消息所清楚地理解的那样),您必须使用更新的实体创建一个新的元组。
如果代码未更新,解决方案将取决于您如何为您的应用程序提供服务。如果您使用的是 ./manage.py runserver,则应该不会有问题。此外,如果使用 apache + mod_python 如果您重新启动服务器,则应重新加载代码。
但我假设你没有做任何一个,因为你仍然有这个问题。如果您使用 uWSGI 或 gunicorn,它们在与服务器不同的进程中运行,您将需要单独重新启动它们。 uWSGI 也可以设置为每次设置文件更改时重新加载应用程序,所以通常我只是调用 touch myapp.ini
来重新加载代码。
基本上会发生什么,无论何时更改 .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 实际上存储了一个腌制版本的代码。
现在,在检查了 django-background-task 应用程序(它看起来像您正在使用的应用程序)之后,理论上您不需要做任何特别的事情,只是为了确保您可以清除任何预定的任务并重新安排它们。
我遇到了类似的问题,是 gunicorn 缓存没有更新。
第一次尝试
sudo systemctl restart gunicorn
如果还不能解决问题:
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn (Check for faults)
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
然后应该更新服务器