У меня странная проблема, которую трудно воспроизвести (все работало 2 дня назад, но какое-то время между этим и сейчас больше нет - без изменений в промежуточный период!)
У меня естьСерверная программа django, которую мы запускаем через gunicorn с несколькими рабочими подпроцессами и отдельным небольшим веб-сервисом REST, который разделяет settings.py серверной программы и работает с теми же объектами БД.Код для этой серверной программы примерно такой:
# my app's models.py
class TestConfig(models.Model):
## various attributes
class Test(models.Model):
## some attributes
def startTest(self):
return TestExecution.objects.create(test=self)
class TestExecution(models.Model):
test = models.ForeignKey(
Test,
on_delete=models.CASCADE
)
config = models.ForeignKey(
TestConfig,
on_delete=models.CASCADE,
null=True
)
# excerpt from a post() method in my app's views.py
test = Test.objects.get(test_id)
if config_form.is_valid():
config = config_form.save()
config_id = config.id
test_exe = test.startTest()
test_exe.config = config
test_exe.save()
webservice_response = requests.get(
'http://{}:{}/rest/add_to_queue/{}'.format(
webservice_ip, webservice_port, test_exe.id))
Другая программа (небольшая веб-служба REST), использующая тот же файл settings.py, что и серверная программа django, выглядит следующим образом:
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
import django
django.setup()
# the REST endpoint referenced from the django server program
@app.route('/rest/add_to_queue/<test_exe_object_id>/')
@app.route('/rest/add_to_queue/<test_exe_object_id>')
def add_to_queue(test_exe_object_id):
from myapp.models import TestExecution
try:
exe_object = TestExecution.objects.get(pk=int(test_exe_object_id))
# for completeness the database section of my settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test_db',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
Как я уже говорил, все это работало несколько дней назад, а затем, когда я попытался сегодня снова, я получал DoesNotExist во второй программе, когда пытался "получить ()" объект TestExecution, используя его 'id'.