Форум сайта python.su
Добрый день
Ситуация такая: есть сайт (грубо говоря 1 страница) на джанго, к которой идет обращение из вне (с помощью ajax). В приложении на джанго при обращении выполняется некоторая функция, в которой идет подключение к COMConnector (1С). Дело в том, что сама функция выполняется достаточно быстро, и единственное, что ее сильно тормозит - инициализация подключения к КОМКоннектору.
Вопрос:
Есть ли возможность в джанго реализовать, чтобы Комконнектор инициализировался при запуске сервера, и после каким тогда образом к нему обращаться из view ?
Офлайн
Сделайте ваш коннектор class-member'ом
class ComConnectorMeta(type): connector = None def __new__(cls, *args, **kwargs): cls.connector = cls.init_connector() return super().__new__(cls, *args, **kwargs) @staticmethod def init_connector(): """ Ваш код инициализации коннектора """ return 0 class ComConnector(metaclass=ComConnectorMeta): pass
default_app_config = 'TestApp.apps.TestAppConfig'
from django.apps import AppConfig class TestAppConfig(AppConfig): name = 'TestApp' verbose_name = 'Test Application' def ready(self): """ Your start up code goes here """ pass
Офлайн
Спасибо, однако:
GreyZmeem
Но учтите что ваш апплекейшен должен быть запущен в одном процессе, иначе если процессов несколько, то в каждом из них будет происходить инициализация.
Офлайн
Нет. Я наверное неправильно выразился.
Например в uwsgi можно указать количество worker'ов и thread'ов.
worker'ы - количество процессов, которые будет запущено для обработки запросов.
thread - количество потоков в каждом процессе.
В пределах одного worker'а но разных thread'ов ваш ComConnector будет сохранят состояние.
Как пример, вам надо будет настроить uwsgi:
<workers>1</workers>
<enable-threads />
<threads>8</threads>
Офлайн
Большое спасибо, буду думать в этом направлении)
Офлайн
Никак не могу разобраться…питон 2.7, ругается на конструкцию
class ComConnector(metaclass=ComConnectorMeta):
class ComConnector(object): connector = None def __new__(cls, *args, **kwargs): if cls.connector is None: cls.connector = cls.init_connector() return cls.connector @staticmethod def init_connector(): V81_CONN_STRING = "настройка подключения" V81 = win32com.client.Dispatch("V81.COMConnector").Connect(V81_CONN_STRING) return V81
def addorder2(request): V81 = ComConnector() pythoncom.CoInitialize() now = datetime.datetime.now(tzutc()) + datetime.timedelta(hours = 5) orderObject = getattr(V81.Documents, "Контакт").CreateDocument() setattr(orderObject, 'Дата', now) orderObject.Write(V81.DocumentWriteMode.Write) return HttpResponse(u'все сделано')
AttributeError views.py in addorder2 orderObject = getattr(V81.Documents, "Контакт").CreateDocument() C:\Python27\lib\site-packages\win32com\client\dynamic.py in __getattr__ raise AttributeError("%s.%s" % (self._username_, attr))
Отредактировано scurramalum (Фев. 14, 2015 19:35:23)
Офлайн
Вот, получилось реализовать вариант который работает (в упрощенном виде):
#coding=cp1251 import win32com.client import pythoncom import datetime from dateutil.tz import tzutc, tzlocal class ComConnectorMeta(type): connector = None def __new__(cls, *args, **kwargs): cls.connector = cls.init_connector() return super().__new__(cls, *args, **kwargs) @staticmethod def init_connector(): pythoncom.CoInitialize() V81_CONN_STRING = "Настройка подключения" CON = win32com.client.Dispatch("V81.COMConnector").Connect(V81_CONN_STRING) return CON class ComConnector(metaclass=ComConnectorMeta): pass def func(): V81 = ComConnector.connector print(V81) now = datetime.datetime.now(tzutc()) + datetime.timedelta(hours = 5) orderObject = getattr(V81.Documents, "Контакт").CreateDocument() setattr(orderObject, 'Дата', now) orderObject.Write(V81.DocumentWriteMode.Write) print('запись успешна') func() func()
Офлайн
Заставил работать на 2.7….но опять проблема:
#coding=cp1251 from django.shortcuts import render from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseServerError from django.db import connections import win32com.client import pythoncom import datetime from dateutil.tz import tzutc, tzlocal import pywintypes class ComConnectorMeta(type): connector = None def __new__(cls, *args, **kwargs): if cls.connector == None: cls.connector = cls.init_connector() return super(ComConnectorMeta, cls).__new__(cls, *args, **kwargs) @staticmethod def init_connector(): pythoncom.CoInitialize() V81_CONN_STRING = "Настройка подключения" CON = win32com.client.Dispatch("V81.COMConnector").Connect(V81_CONN_STRING) return CON class ComConnector(): __metaclass__ = ComConnectorMeta def addorder2(request): V81 = ComConnector.connector now = datetime.datetime.now(tzutc()) + datetime.timedelta(hours = 5) orderObject = getattr(V81.Documents, "Контакт").CreateDocument() setattr(orderObject, 'Дата', now) orderObject.Write(V81.DocumentWriteMode.Write) return HttpResponse(u'все хорошо')
#coding=cp1251 import win32com.client import pythoncom import datetime from dateutil.tz import tzutc, tzlocal class ComConnectorMeta(type): connector = None def __new__(cls, *args, **kwargs): if cls.connector == None: cls.connector = cls.init_connector() return super(ComConnectorMeta, cls).__new__(cls, *args, **kwargs) @staticmethod def init_connector(): pythoncom.CoInitialize() V81_CONN_STRING = "Srvr=1C;Ref=REG_COPY;Usr=adminchel;Pwd=123;" CON = win32com.client.Dispatch("V81.COMConnector").Connect(V81_CONN_STRING) return CON class ComConnector(): __metaclass__ = ComConnectorMeta def addorder2(): V81 = ComConnector.connector now = datetime.datetime.now(tzutc()) + datetime.timedelta(hours = 5) orderObject = getattr(V81.Documents, "Контакт").CreateDocument() setattr(orderObject, 'Дата', now) orderObject.Write(V81.DocumentWriteMode.Write) print(u'все хорошо') if __name__ == '__main__': addorder2() #первый вызов функции addorder2() #второй вызов функции
Офлайн
Покопал еще чуть поглубже:
оказывается, при повторном обращении к функции во views.py, тип коннектора определяется правильно <COMobject Connect>, также сохраняется его id, что указывает что объект тот же самый, однако при попытке его вывести в консоль с помощью print - пишет что “Объект не подключен к серверу”…
Копаем дальше…
Офлайн