Проблема параллелизма?Автономный скрипт на python, делящийся settings.py и ORM с сервером django, имеет ненадежное представление объектов БД? - PullRequest
0 голосов
/ 03 июня 2018

У меня странная проблема, которую трудно воспроизвести (все работало 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'.

...