BG Development


  Reply to this topicStart new topicStart Poll

> Python, sqlalchemy, Проблем със сесиите
dedal
Публикувано на: 02-11-2017, 16:27
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 17.11.10



Базата е postgresql

Става дума за GUI а не WEB
при web е лесно сесията се отваря before request
и се затваря на teardown

В случая обаче имаме gui то си е нормално в loop докато не се повика OnClose

До сега отварях сесията при login и я затварях при logout но ми се налага да използвам long running task

За да не блокира GUI вдигам трейд който поства информация в панела

Но не мога да ползвам същата сесия ( или не е добра идея според документацията )

Затова правя в контролера следното:
CODE

engine = create_engine('postgresql://dbuser:pass@%s:5432/dbname' %
                          (conf.SERVER),
                          echo=conf.DEBUG,
                          echo_pool=conf.DEBUG,
                          pool_reset_on_return=True
                          )

session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

class DBCtrl():
   
   def __init__(self):
       self.SESSION = Session()

   def close(self):
       Session.remove()

DB = DBCtrl()

Нормално в програмата ползвам DB
давам DB.close() при logout
и си отварям сесията наново при login

В трейда създавам нова инстанция на DBCtrl и след като приключа и давам remove

Та въпросът ми е дали е правилно?
Има ли по -добър начин ( на мен нищо не ми дойде на ум )

Това мнение е било редактирано от dedal на 02-11-2017, 16:32
PMEmail Poster
Top
ProXy
Публикувано на: 02-11-2017, 22:30
Quote Post



Име: Йордан Иванов
Група: Потребител
Ранг: Почетен член

Мнения: 1481
Регистриран на: 25.01.10



Ако става дума за remote кънекция, е по-добре да си направиш Web API. Поне базата няма да ти е достъпна от вън.


--------------------
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.

https://ivanovyordan.com/
PMEmail PosterUsers Website
Top
dedal
Публикувано на: 03-11-2017, 13:37
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 17.11.10



Няма как да стане с web
1. Кода е ужасно много
2. Това би затруднило потребителите да помнят на 50 обекта ip към сървъра
3. Аз никак не се разбирам с html, css ( за 2 дна написах цяла система за печат + pdf генератор, pdf reader и после 7 дена си играх да направя една тъпа таблица за да си тествам генератора)

А и затварянето на базата има смисъл само ако съм хостинг на който 200 програмиста са качили по един сайт от които 50 човека са се учили, като са сътворили истински чудеса. Идеята е ако се удари app да не се отрази на останалите.

В моя случай дали ще се удари базата или апито е все едно. Така че разчитам, на posgresql да са си защитили базата както трябва.
PMEmail Poster
Top
thrawn
Публикувано на: 03-11-2017, 14:22
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 997
Регистриран на: 17.01.17



Идеята на междинния слой е, че първо няма да оголиш базата данни в мрежата и второ, потребителите няма да разполагат с акаунт за нея (хардкодант в приложението).

Ако не ти се разписва междинен слой е хубаво да се замислиш как да защитиш sql сървърът, в случай, че имаш разпределена архитектура де.
PMEmail Poster
Top
dedal
Публикувано на: 03-11-2017, 14:57
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 17.11.10



Да виж за това си прав. Но не ми се вярва клиента да иска да си удари сам базата.
Мога да изнесат акаунта към трансфер сървъра и името и да се получава динамично при канекция с udp там е криптирано.
И лесно изпълнимо. Въпреки, че при локал use_transfer = False

Другия начин е да изнесат контролера в rtc (Риал тиме Клок) сървъра и да го тегля при стартиране в рама.
То rtc така или иначе синхронизира часа само при стартиране и не прави друго.Мисля, че ще сработи и само енджина да измества, така по малко ще пиша. Благодаря за идеята.
Приемам критиката.
И все пак на темата, има ли правилен начин за сесия в трейд.

Това мнение е било редактирано от dedal на 03-11-2017, 15:24
PMEmail Poster
Top
FidelDahan
Публикувано на: 03-11-2017, 19:56
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2207
Регистриран на: 12.06.08



По принцип си е съвсем ок, ако имаш дълго-живеещ task да си го изнесеш в тред и ако имаш нужда от достъп до базата в този тред да отвoриш и затвoриш една сесия, която ще се използва само там.

Обаче тази имплементация ми се струва бъгава.

CODE
engine = create_engine('postgresql://dbuser:pass@%s:5432/dbname' %
                         (conf.SERVER),
                         echo=conf.DEBUG,
                         echo_pool=conf.DEBUG,
                         pool_reset_on_return=True
                         )

session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)

class DBCtrl():
 
  def __init__(self):
      self.SESSION = Session()

  def close(self):
      Session.remove()

DB = DBCtrl()


Първо, следвай конвенциите - инстанциите на обекти се пишат с малки букви. Тук изглежда създаваш 2 Session обекта:

първия: Session = scoped_session(session_factory)

втория: self.SESSION = Session()

В DBCtrl създаваш втория, а затваряш първия.

Това мнение е било редактирано от FidelDahan на 03-11-2017, 19:56
PMEmail Poster
Top
dedal
Публикувано на: 04-11-2017, 09:09
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 17.11.10



SESSION -беше глобална затова е с главни букви.
Още не съм успял да я променя в целия контролер.

И то не прави нов обект точно това ме притеснява. В случая прави регистър.

CODE

db1 = DBCtrl()
db2 = DBCtrl()
db1 is db2
False
db1.SESSION is db2.SESSION
True
db2.close()
db2.open()
db1.SESSION is db2.SESSION
False

Мн. странно се държи.
При Session.rwmove()
Почиствам регистъра.
Ако използвам

Session= sessionmaker(bind=engine)
В DBCtrl
Прави нова инстанция, но таблиците са недостъпни
В трейд а връща грешка, че таблицата е мапната в друга сесия

Това мнение е било редактирано от dedal на 04-11-2017, 09:17
PMEmail Poster
Top
dedal
Публикувано на: 04-11-2017, 09:38
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 17.11.10



Реално __init__
Създава трейд локал на една сесия.
Ако се затвори тогава създава нова. Май не трябва в трейд а да давам close а само при logout
PMEmail Poster
Top
dedal
Публикувано на: 05-11-2017, 23:08
Quote Post



Име: Григор Колев
Група: Потребител
Ранг: Посетител

Мнения: 54
Регистриран на: 17.11.10



А self.SESSION
Мама атрибут close или remove
Според документацията трябва да се почисти регистъра.
Или аз нещо не разбирам ???
Аз разбрах, че Session.rwmove()
Определя текущата сесия и и дава close

От труга страна след close ако отворя db3
db3.SESSION is db2.SESSION
True

http://docs.sqlalchemy.org/en/latest/orm/contextual.html

Това мнение е било редактирано от dedal на 06-11-2017, 00:16
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0