Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Flask: połączenie do bazy i logowanie

45 views
Skip to first unread message

hubert depesz lubaczewski

unread,
Jan 17, 2012, 10:12:06 AM1/17/12
to
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/

Marcin Kasperski

unread,
Jan 19, 2012, 5:49:59 AM1/19/12
to
>
> 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.

hubert depesz lubaczewski

unread,
Jan 19, 2012, 10:19:26 AM1/19/12
to
On 2012-01-19, Marcin Kasperski <Marcin.K...@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.

Marcin Kasperski

unread,
Jan 25, 2012, 5:46:40 AM1/25/12
to
hubert depesz lubaczewski <dep...@depesz.com> writes:

> On 2012-01-19, Marcin Kasperski <Marcin.K...@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.
0 new messages