🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
4 messages
4 total messages Started by hubert depesz lubaczewski Tue, 17 Jan 2012 15:12
Flask: połączenie do bazy i logowanie
#28384
Author: hubert depesz lubaczewski
Date: Tue, 17 Jan 2012 15:12
69 lines
2636 bytes
elo
czytam sobie po kolei tutorial do flaska, więc możliwe, że do
odpowiedniego momentu jeszcze nie doczytałem, ale mam następujące
pytania:

1. Jak mogę nawiązać stałe połączenie do bazy?

Mam taki kod:

#v+
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import psycopg2
from flask import Flask, url_for, render_template, request, flash, g

# Default configuration
DEBUG = False
SECRET_KEY = 'dev key'
HOST = '0.0.0.0'
DB_DATABASE = 'jab'
DB_PORT = 5920
DB_HOST = '/tmp'
# Default configuration

app = Flask(__name__)
app.config.from_object(__name__)
app.config.from_envvar('JDC_SETTINGS', silent=True)

def get_db_connection():
    conn_details = dict()

    for i in ( j for j in ( 'database', 'user', 'password', 'host', 'port', 'sslmode' ) if app.config.has_key( 'DB_' + j.upper() ) ):
        conn_details[ i ] = app.config[ 'DB_' + i.upper() ]

    return psycopg2.connect( **conn_details )

@app.before_request
def before_request():
    g.db = get_db_connection()

@app.teardown_request
def teardown_request(exception):
    g.db.rollback()

@app.route('/')
def index():
    c=g.db.cursor()
    c.execute("SELECT version()")
    version = c.fetchone()[0]
    return render_template( 'index.html', version=version)

if __name__ == '__main__':
    app.run( host=app.config['HOST'] )
#v-

I to działa, ale dla każdego requestu nawiązuje nowe połączenie.

Jak mogę zrobić by połączenie było nawiązane za pierwszym razem jak jest
potrzebne, ale potem by nie było zamykane?

2. Jak mogę zrekonfigurować logger flaskowy? Próbowałem jakiś cudów
   i nic mi nie wychodziło. Najprostsza zmiana - logowanie do pliku,
   a nie na stdout.

depesz

-- 
The best thing about modern society is how easy it is to avoid contact with it.
                                                             http://depesz.com/
Re: Flask: połączenie do bazy i logowanie
#28385
Author: Marcin Kasperski
Date: Thu, 19 Jan 2012 10:49
39 lines
2595 bytes
>
> Jak mogę zrobić by połączenie było nawiązane za pierwszym razem jak jest
> potrzebne, ale potem by nie było zamykane?

Zachować je gdzieś na zmiennej globalnej?

Nie znam Flaska więc nie wiem czy on działa wątkowo, czy nie. Jeśli
wątkowo, to pewnie należałoby stosować jakąś pulę połączeń i brać je i
zwracać w requestach (SQLAlchemy ma po temu pewne udogodnienia np.),
jeśli bezwątkowo, starczy zrobić połączenie „poza funkcją” i go używać.

> 2. Jak mogę zrekonfigurować logger flaskowy? Próbowałem jakiś cudów
>    i nic mi nie wychodziło. Najprostsza zmiana - logowanie do pliku,
>    a nie na stdout.

Tam jest zdaje się standardowy pythonowy logging używany?

Jeśli tak, to najprościej

   import logging
   logging.basicConfig(filename="blahblah.txt", level=logging.DEBUG)

bardziej wyrafinowanie można ćwiczyć zabawy w stylu

    root_logger = logging.getLogger()
    root_logger.setLevel(logging.DEBUG)
    debug_file = logging.handlers.RotatingFileHandler(LOG_DIR+'/debug.log', 'a', 16*1024*1024, 25)
    debug_file.setLevel(logging.DEBUG)
    debug_file.setFormatter( logging.Formatter('[%(asctime)s] [%(name)s/%(levelname)s] %(message)s') )
    root_logger.addHandler(debug_file)
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    console.setFormatter(logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s'))
    root_logger.addHandler(console)

(tutaj daję debugging do rotujących się co 16MB plików a info i błędy także na konsolę, można
też np. różnie kierować zależnie od „tematu”)

Ogólnie patrz doce do modułu logging.
Re: Flask: połączenie do bazy i logowanie
#28386
Author: hubert depesz lubaczewski
Date: Thu, 19 Jan 2012 15:19
18 lines
1485 bytes
On 2012-01-19, Marcin Kasperski <Marcin.Kasperski@mekk.waw.pl> wrote:
>> Jak mogę zrobić by połączenie było nawiązane za pierwszym razem jak jest
>> potrzebne, ale potem by nie było zamykane?
> Zachować je gdzieś na zmiennej globalnej?

liczyłem, że może będzie coś poza globalami. jakiś odpowiednik "g" który
jest na stałe, a nie tylko na request.

>    import logging
>    logging.basicConfig(filename="blahblah.txt", level=logging.DEBUG)

aaaaa. kumam. Dzięki wielkie.

depesz

-- 
The best thing about modern society is how easy it is to avoid contact with it.
                                                             http://depesz.com/
Re: Flask: połączenie do bazy i logowanie
#28382
Author: Marcin Kasperski
Date: Wed, 25 Jan 2012 10:46
20 lines
1643 bytes
hubert depesz lubaczewski <depesz@depesz.com> writes:

> On 2012-01-19, Marcin Kasperski <Marcin.Kasperski@mekk.waw.pl> wrote:
>>> Jak mogę zrobić by połączenie było nawiązane za pierwszym razem jak jest
>>> potrzebne, ale potem by nie było zamykane?
>> Zachować je gdzieś na zmiennej globalnej?
>
> liczyłem, że może będzie coś poza globalami. jakiś odpowiednik "g" który
> jest na stałe, a nie tylko na request.

Wiesz, globale to właśnie takie coś na stałe ;-)
Jak chcesz koniecznie g, to napisz

g = {}

i potem już możesz

g['db'] = cośtam

;-) A jak chcesz pisać g.db to zrób g jako obiekt pustej klasy.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads