sqlite needs write permissions on the _directory_ where the sqlite database is located and (r/write permissions) on the file itself.
so after defining try: assert os.path.exists(self.finalDb), "db doesnt exist" assert os.access(self.finalDB, os.W_OK), "cant write to db file" assert os.access(self.dbPath, os.W_OK), "cant write to db directory" and see which on fails. then adjust permissions. On Tue, Mar 24, 2009 at 7:48 PM, Thierry <[email protected]> wrote: > > Hello everybody, > > I've tried for the last 4 hours to have my web.py application working > with sessions in apache+mod_wsgi, but could not make it. > I've looked in docs, tutorials, searched on google, but could not find > anything... > I'm using web.py 0.3, with python 2.5 and mod_wsgi 2.3 > > I'm creating a simple document management interface for an association > I'm member of, and I need to use sessions for login states. > Using the web.py integrated server, I've got everything working, with > both a datastore file or db based (the db was sqlite, if it counts). > > Now, I've switched to apache as the web server, and nothing works > anymore. > First, my code: > > class config: > def __init__(self): > self.curPath = os.path.dirname(__file__) > self.basePath=os.path.join(self.curPath,'..') > self.storePath = os.path.join(self.basePath, 'files') > self.tplPath=os.path.join(self.basePath,'tpl/') > self.sessPath=os.path.join(self.basePath,'sess/') > self.dbPath=os.path.join(self.basePath,'sqlite') > self.dbFile='arcenciel.sqlite3' > self.finalDb=os.path.join(self.dbPath, self.dbFile) > self.debugMode=False > self.frmHome = form.Form( > form.Password('pwd', description='Veuillez donner votre nouveau > mot de passe'), > form.Password('pwd2', description='Veullez retaper votre nouveau > mot de passe'), > form.Button("submit", type="submit", description="Changer de mot > de passe"), > ) > self.frmLogin = form.Form( > form.Textbox('username', description="Utilisateur"), > form.Password('pwd', description='Mot de passe'), > form.Button("submit", type="submit", > description="S'authentifier"), > ) > self.frmNewFolder=form.Form( > form.Textbox('folderName', description='Donnez le nom du dossier > à créer'), > form.Button("submit", type="submit", description="Créer le > dossier"), > ) > self.frmUp=form.Form( > form.File('newFile', description='Fichier à transmettre' ), > form.Button("submit", type="submit", description="Créer le > dossier"), > ) > > cfg=config() > web.config.debug = cfg.debugMode > app = web.application(urls, globals()) > db=web.database(dbn='sqlite', db=cfg.finalDb) > sessVals={'logged': False, > 'msg':'', > 'user':'', > 'uid':False, > } > store = web.session.DBStore(db, 'sessions') > #store = web.session.DiskStore(cfg.curPath+'/sess') > session = web.session.Session(app, store, initializer=sessVals) > > The path have all been checked, and they are correct, with permissions > relaxed enough for apache to open/read the files. > the cfg.finalDb resolves to "/var/www/arc_en_ciel/htdocs/../sqlite/ > arcenciel.sqlite3", which is an sqlite3 database I created using the > sqlite cli tools. > cfg.debugMode is False, just as a security. > > When I enter my first page, I've declared > web.debug(session) > to see the session content. > From an web.py server, the result is: > <Storage {'msg': u'Erreur de connection.', 'ip': u'127.0.0.1', > 'logged': False, 'session_id': > '3f63b62e016a10b8db33a7ef98bc35b712fd0f40'}> > From apache, the result is > <Storage {}>, referer: http://aec.dev/base.py/ > Of course, the same file is used each time. > > Has anyone ever faced this situation ? > I'm just "that" close to throw web.py away and redo this with django, > but I love web.py simplicity sooooo much more that it would really > hurt. > > The complete code is: > #!/bin/python > # -*- coding: utf-8 -*- > import web, os, os.path, stat > import mimetypes > from web import form > > urls = ( > '/' , 'login', > '/login/' , 'login', > '/upload/(.*)$' , 'upload', > '/newFolder/(.*)' , 'newFolder', > '/del/(.*)' , 'delete', > '/search/(.*)$' , 'search', > '/browse/(.*)$' , 'browse', > '/download/(.*)$' , 'download', > '/my(.*)' , 'home', > '/sess' , 'sess', > ) > #DONE: login > #DONE: navigation dans le repository > #DONE: ajouter une page de changement des infos persos > #DONE: download des fichiers > #DONE: upload des fichiers > #TODO: indexage des fichiers uploadés > > def walktree (top = ".", depthfirst = True): > names = os.listdir(unicode(top)) > if not depthfirst: > yield top, names > for name in names: > if name.startswith('.')==False: > try: > st = os.lstat(os.path.join(top, name)) > except os.error: > continue > if depthfirst: > yield top, names > > def getMsg(): > ret='' > if session.get('msg','')!='': > ret=session.msg > session.msg='' > return ret > > def parentPath(opath): > aryTmp=opath.split(os.path.sep) > path='' > for i in aryTmp[:-1]: > path=os.path.join(path, i) > return path > > def cleanPath(path): > return path.replace('//','/') > > class config: > def __init__(self): > self.curPath = os.path.dirname(__file__) > self.basePath=os.path.join(self.curPath,'..') > self.storePath = os.path.join(self.basePath, 'files') > self.tplPath=os.path.join(self.basePath,'tpl/') > self.sessPath=os.path.join(self.basePath,'sess/') > self.dbPath=os.path.join(self.basePath,'sqlite') > self.dbFile='arcenciel.sqlite3' > self.finalDb=os.path.join(self.dbPath, self.dbFile) > self.debugMode=False > self.frmHome = form.Form( > form.Password('pwd', description='Veuillez donner votre nouveau > mot de passe'), > form.Password('pwd2', description='Veullez retaper votre nouveau > mot de passe'), > form.Button("submit", type="submit", description="Changer de mot > de passe"), > ) > self.frmLogin = form.Form( > form.Textbox('username', description="Utilisateur"), > form.Password('pwd', description='Mot de passe'), > form.Button("submit", type="submit", > description="S'authentifier"), > ) > self.frmNewFolder=form.Form( > form.Textbox('folderName', description='Donnez le nom du dossier > à créer'), > form.Button("submit", type="submit", description="Créer le > dossier"), > ) > self.frmUp=form.Form( > form.File('newFile', description='Fichier à transmettre' ), > form.Button("submit", type="submit", description="Créer le > dossier"), > ) > > cfg=config() > web.config.debug = cfg.debugMode > app = web.application(urls, globals()) > db=web.database(dbn='sqlite', db=cfg.finalDb) > sessVals={'logged': False, > 'msg':'', > 'user':'', > 'uid':False, > } > store = web.session.DBStore(db, 'sessions') > #store = web.session.DiskStore(cfg.curPath+'/sess') > session = web.session.Session(app, store, initializer=sessVals) > > #=============================================================================== > # if web.config.get('_session') is None: > # session = web.session.Session(app, store, sessVals) > # web.config._session = session > # else: > # session = web.config._session > #=============================================================================== > > session.logged=False > cfg.app=app > rdr = web.template.render(cfg.tplPath) > application = web.application(urls, globals()).wsgifunc() > > class dbg: > def GET(self): > return rdr.debug(cfg.curPath, cfg.basePath, cfg.storePath, > cfg.finalDb, os.path.join(cfg.curPath, 'sess')) > > class login: > ''' > Let the users login > ''' > def GET(self): > web.debug(session) > web.debug(db) > session.logged=False > msg=getMsg() > if session.logged==False: > return rdr.welcome(cfg.frmLogin, msg) > else: > web.redirect('/browse/') > > def POST(self): > i=web.input() > ret=False > if i.username!='' and i.pwd!='': > ret=db.select('users',where='lower(username)=\'%s\' and password= > \'%s\''%(i.username, i.pwd)) > cpt=0 > for row in ret: > cpt+=1 > uid=row.userid > if cpt==1: > session.logged=True > session.user=i.username > session.id=uid > web.redirect('/browse/') > else: > session.msg='Erreur de connection.'.decode('utf-8') > web.redirect('/') > else: > session.msg='Pas de mot de passe spécifié'.decode('utf-8') > web.redirect('/') > > class newFolder: > def GET(self, path): > return rdr.newFolder(cleanPath(path), cfg.frmNewFolder, '') > > def POST(self, path): > path=cleanPath(path) > i=web.input() > msg='' > try: > os.mkdir(os.path.join(cfg.storePath, path, i.folderName)) > except OSError, err: > msg='Erreur lors de la création du dossier %s: %s'.decode > ('utf-8')%(i.folderName, err) > finally: > if msg=='': > web.redirect('/browse/%s'%(path)) > else: > return rdr.newFolder(path, cfg.frmNewFolder, msg) > > class delete: > def GET(self, opath): > opath=cleanPath(opath.encode('utf-8')) > finPath=os.path.join(cfg.storePath, opath) > path=parentPath(opath) > try: > if os.path.isdir(finPath): > trg='dossier' > os.rmdir(finPath) > else: > trg='fichier' > os.unlink(finPath) > except OSError, err: > session.msg='Erreur lors de la supression du %s %s: %s'.decode > ('utf-8')%(trg, opath, err) > finally: > web.redirect('/browse/%s'%(path)) > > class upload: > ''' > Upload a file in a given directory. > ''' > def GET(self, path): > path=cleanPath(path) > msg=getMsg() > return rdr.upload(cfg.frmUp, path, msg) > > def POST(self, path): > path=cleanPath(path.encode('utf-8')) > x = web.input(newFile={}) > finPath=os.path.join(unicode(cfg.storePath), unicode(path), x > ['newFile'].filename.decode('utf-8')) > web.debug(finPath) > web.debug(len(x['newFile'].value)) > try: > h=open(finPath.encode('utf-8'),'wb+') > h.write(x['newFile'].value) > h.close() > raise web.seeother('/browse/%s'%(path)) > except UnicodeEncodeError, err: > session.msg=err > return web.redirect('/upload/%s'%(path)) > > class browse: > ''' > Browse the filesystem > ''' > def GET(self, path=None): > if session.logged!=True: > web.redirect('/login/') > else: > #present a view of the fs files uploaded > if path==None or path=='': > path=cfg.storePath > path=cleanPath(path) > aryTmp=path.replace(cfg.storePath,'').split(os.path.sep) > > #check if we are at the top level > top='' > for x in aryTmp[:-1]: > top=os.path.join(top, x) > if top=='' and aryTmp[0]=='': > top=False > aryDirs=[] > aryFiles=[] > > #get list of files and dir in the current directory. > for (basepath, children) in walktree(os.path.join > (cfg.storePath,path.encode('utf-8')),False): > for child in children: > if child.startswith('.')==False: > fullPath=os.path.join(unicode(basepath), child.decode > ('utf-8')) > parent=parentPath(fullPath.replace(cfg.storePath,'')) > o={'name':child, 'base':basepath, 'full':fullPath, > 'parent':parent, 'short':fullPath.replace(cfg.storePath+'/','')} > if os.path.isdir(fullPath.encode('utf-8')): > #print 'adding %s to dirs'%child > aryDirs.append(o) > else: > #print 'adding %s to files'%child > aryFiles.append(o) > #end if > #end for > #end for > if path!=cfg.storePath: > loc=path+'/' > else: > loc='' > loc=cleanPath(loc) > msg=getMsg() > return rdr.browse(aryDirs, aryFiles, top, loc, msg, 'browse') > pass > > def POST(self): > pass > > class home: > def GET(self, jnk): > if session.msg!='': > msg=session.msg > session.msg='' > else: > msg='' > return rdr.home(session, cfg.frmHome, msg) > > def POST(self, jnk): > i=web.input() > ret=False > if i.pwd!=i.pwd2: > #pwd mismatch > session.msg="Les mots de passes ne sont pas identiques.<br/ >>Veuillez ré-essayer." > web.redirect('/my/') > else: > #update pwd > q="update users set password='%s' where userid='%d'"%(i.pwd, > session.id) > db.update('users',where="userid='%d'"%session.id, > password=i.pwd) > msg='Votre mot de passe à été mis à jour' > return rdr.home(session, cfg.frmHome, msg) > > class download: > def GET(self, path): > path=cleanPath(path.encode('utf-8')) > finPath=os.path.join(cfg.storePath,path) > mimetypes.init() > mime=mimetypes.guess_type(path, True)[0] > web.header('Content-Type', mime) > h=open(finPath) > x=h.read() > h.close() > return x > > class search: > ''' > Search the indexed files for a given string > ''' > def GET(self): > pass > > def POST(self): > pass > > if __name__ == "__main__": > app.run() > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web.py" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/webpy?hl=en -~----------~----~----~----~------~----~------~--~---
