Changeset 12

Show
Ignore:
Timestamp:
11/18/08 12:57:04 (7 weeks ago)
Author:
mbertoldi
Message:

Added request layer to gnr.web, added GnrWebSite? object

Location:
gnrpy/gnr/web
Files:
5 added
5 modified

Legend:

Unmodified
Added
Removed
  • gnrpy/gnr/web/apache/gnrwebpage_apache.py

    r8 r12  
    2828Copyright (c) 2007 Softwell. All rights reserved. 
    2929""" 
     30import os 
     31import urllib 
    3032 
    3133from mod_python import apache, Session, Cookie 
    3234 
    3335from gnr.web._gnrbasewebpage import GnrBaseWebPage 
     36from gnr.web.apache.gnrwebreqresp_apache import GnrWebRequest,GnrWebResponse 
    3437 
    35 cookie_types = {'marshal': Cookie.MarshalCookie} 
    3638     
    3739class GnrWebPage(GnrBaseWebPage): 
    3840     
    39      
    40      
    41     def newMarshalCookie(self, name, value, secret=None, **kw): 
    42         return Cookie.MarshalCookie(name,value,secret=secret,**kw) 
     41    def __init__(self, request, customclass, filepath, response=None, **kwargs): 
     42        self._request = request 
     43        if not response: response = request 
     44        self._response = response     
     45        self.request = GnrWebRequest(request) 
     46        self.response = GnrWebResponse(response) 
     47        self._initialize(customclass, filepath, **kwargs) 
    4348     
    4449    def raiseUnauthorized(self): 
    4550        raise apache.SERVER_RETURN, apache.HTTP_UNAUTHORIZED 
    4651         
    47     def get_cookie(self, cookieName, cookieType, secret = None): 
    48         cookieType = cookie_types[cookieType] 
    49         cookie=Cookie.get_cookie(self.request, cookieName, cookieType, secret = secret) 
    50         if type(cookie) is not cookieType: cookie=None 
    51         return cookie 
    52      
    53     def add_cookie(self,cookie): 
    54         Cookie.add_cookie(self.request,cookie) 
    55      
    56     def get_session(self, **kwargs): 
    57         return Session.Session(self.request,**kwargs) 
     52    def add_response_header(self,header,value): 
     53        self.response.headers[header] = value 
     54      
     55    def externalUrl(self, path, **kwargs): 
     56        params = urllib.urlencode(kwargs) 
     57        path = os.path.join(self.homeUrl(), path) 
     58        if params: 
     59            path = '%s?%s' % (path, params) 
     60        return self.request.construct_url(path) 
    5861         
  • gnrpy/gnr/web/_gnrbasewebpage.py

    r8 r12  
    2929""" 
    3030import md5 
    31 import os, sys 
    32 import re 
     31import os 
     32#import sys 
     33#import re 
    3334import time 
    3435import datetime 
     
    4041import zipfile 
    4142import StringIO 
    42 from decimal import Decimal 
     43#from decimal import Decimal 
    4344 
    4445from gnr.core.gnrlog import gnrlogging 
     
    4950 
    5051#from mod_python import apache, Session, Cookie 
    51 from mako.template import Template 
     52#from mako.template import Template 
    5253 
    5354import simplejson as json 
     
    5556from mako.lookup import TemplateLookup 
    5657 
    57 from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver, TxtDocResolver, UrlResolver, XmlDocResolver, BagFormula 
     58from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver 
    5859 
    5960from gnr.core.gnrlang import GnrObject 
    60 from gnr.core import gnrlist 
    61  
    62 from gnr.core.gnrlang import getUuid 
    63 from gnr.core.gnrstring import templateReplace, splitAndStrip, countOf, toText, toJson, concat 
     61 
     62from gnr.core.gnrlang import getUuid, NotImplementedException, deprecated 
     63from gnr.core.gnrstring import templateReplace, splitAndStrip, toText, toJson 
    6464from gnr.core import gnrdate 
    6565 
     
    6767 
    6868from gnr.web.gnrwebstruct import GnrDomSrc_dojo_12, GnrDomSrc_dojo_11, GnrGridStruct 
    69 from gnr.web.gnrwebapp import GnrWebApp 
    70  
    71 from gnr.sql.gnrsqldata import SqlRelatedSelectionResolver, SqlRelatedRecordResolver 
    72  
    73 from gnr.web.gnrwebapphandler import GnrProcessHandler,GnrWebAppHandler,BatchExecutor 
     69 
     70from gnr.web.gnrwebreqresp import GnrWebRequest, GnrWebResponse 
     71from gnr.web.gnrwebapphandler import GnrProcessHandler,GnrWebAppHandler 
    7472 
    7573CONNECTION_TIMEOUT = 3600 
     
    7977AUTH_FORBIDDEN=-1 
    8078 
     79import threading 
     80pagelocals = threading.local() 
     81 
    8182class GrowlStub(object): 
    8283    def notify(self, *args, **kwargs): 
     
    8990    pass 
    9091 
    91      
     92 
    9293class GnrBaseWebPage(GnrObject): 
    93      
    94     def newMarshalCookie(self): 
     94 
     95    def _init_request_response(self,request,response): 
    9596        raise NotImplementedException() 
     97     
     98    #def newMarshalCookie(self): 
     99    #    raise NotImplementedException() 
     100     
     101    def newMarshalCookie(self, name, value, secret=None, **kw): 
     102        return self.request.newMarshalCookie(name,value,secret=secret,**kw) 
    96103 
    97104    def raiseUnauthorized(self): 
    98105        raise NotImplementedException() 
    99106     
    100     def get_cookie(self, request, cookieName, cookieType, secret = None): 
     107    #def get_cookie(self, request, cookieName, cookieType, secret = None): 
     108    #    raise NotImplementedException() 
     109    # 
     110    #def add_cookie(self,cookie): 
     111    #    raise NotImplementedException() 
     112    # 
     113    #def get_session(self, **kwargs): 
     114    #    raise NotImplementedException() 
     115     
     116    def add_response_header(self,header,value): 
    101117        raise NotImplementedException() 
    102118     
     119    def get_request_header(self,header): 
     120        raise NotImplementedException() 
     121         
     122    def get_cookie(self, cookieName, cookieType, secret = None): 
     123        return self.request.get_cookie(cookieName, cookieType, secret = secret) 
     124 
    103125    def add_cookie(self,cookie): 
     126        self.request.add_cookie(cookie) 
     127 
     128    def get_session(self, **kwargs): 
     129        return self.request.get_session(**kwargs) 
     130     
     131    def __init__(self, request, customclass, filepath, response=None, **kwargs): 
    104132        raise NotImplementedException() 
    105133     
    106     def get_session(self, **kwargs): 
    107         raise NotImplementedException() 
    108      
    109     def __init__(self, req, customclass, filepath, page_id=None, 
    110                  _rpc_resultPath=None, _dk_=None, xxcnt=None, _user_login=None, **kwargs): 
     134    def _initialize(self, customclass, filepath, page_id=None, 
     135                 _rpc_resultPath=None,xxcnt=None, _user_login=None, **kwargs): 
    111136        self._rpc_resultPath=_rpc_resultPath 
    112         self.request = req 
    113         req.headers_out["Pragma"] = "no-cache" 
    114          
     137        self.response.add_header('Pragma','no-cache') 
    115138        self.page_id = page_id or getUuid() 
    116         self._dk=_dk_ 
    117139        self.filepath = filepath # TOGLIERE ???? 
    118140        self._user_login = _user_login 
     
    120142        self._htmlHeaders=[] 
    121143        self._ctxData = Bag() 
    122         self.folders= {'pages':req.hlist.directory, 
    123                        'site':os.path.dirname(req.hlist.directory), 
    124                        'current':os.path.dirname(req.filename), 
    125                        'document_root': self.request.document_root().rstrip('/') # the path may end with / or not depending to httpd.config 
     144        self.filename = self.request.filename 
     145        self.folders= {'pages':self.request.hlist.directory, 
     146                       'site':os.path.dirname(self.request.hlist.directory), 
     147                       'current':os.path.dirname(self.filename), 
     148                       'document_root': self.request.document_root.rstrip('/') # the path may end with / or not depending to httpd.config 
    126149                       } 
    127         self.filename = req.filename 
    128150        self.pagename = os.path.splitext(os.path.basename(self.filename))[0] 
    129151        self.pagepath = self.filename.replace(self.folders['pages'], '') 
    130  
    131152        self.theme = getattr(customclass, 'theme', None) or self.config['dojo?theme'] or 'tundra' 
    132153        self.dojoversion = getattr(customclass, 'dojoversion', None) or self.config['dojo?version'] or '11' 
     
    297318            raise str("No template %s found in %s" % (tpl, str(tpldirectories))) 
    298319         
    299          
    300320        arg_dict = {} 
    301321        self.htmlHeaders() 
    302322        arg_dict['customHeaders']=self._htmlHeaders 
    303         arg_dict['charset'] = 'utf-8' 
     323        arg_dict['charset'] = charset 
    304324        arg_dict['filename'] = self.pagename 
    305325        arg_dict['startArgs'] = toJson(startArgs) 
     
    423443         
    424444    def requestWrite(self, txt, encoding='utf-8'): 
    425         self.request.write(txt.encode(encoding))  
     445        self.responseWrite(txt,encoding=encoding) 
     446 
     447    def responseWrite(self, txt, encoding='utf-8'): 
     448        self.response.write(txt.encode(encoding)) 
    426449 
    427450    def gnotify(self, title, description, always=False): 
     
    524547            if self.session.pagedata['page_id']!=self.page_id : 
    525548                self.raiseUnauthorized() 
    526             if self._dk: 
    527                 cl= ['%s_%s'%(k,v) for k,v in kwargs.items()] 
    528                 cl.append('method_%s'%method) 
    529                 cl.sort() 
    530                 if md5.md5('%s%s%s'%(self.page_id,'_'.join(cl),self.page_id)).hexdigest()!=self._dk: 
    531                     self.raiseUnauthorized() 
    532549        parameters = dict(kwargs) 
    533550        for k,v in kwargs.items(): 
     
    653670    def _get_locale(self): # TODO IMPLEMENT DEFAULT FROM APP OR AVATAR  
    654671        if not hasattr(self, '_locale'): 
    655             self._locale = self.connection.locale or self.request.headers_in.get('Accept-Language', 'en').split(',')[0] or 'en' 
     672            self._locale = self.connection.locale or self.request.headers.get('Accept-Language', 'en').split(',')[0] or 'en' 
    656673        return self._locale 
    657674    locale = property(_get_locale, _set_locale) 
     
    734751         
    735752    def externalUrl(self, path, **kwargs): 
    736         params = urllib.urlencode(kwargs) 
    737         path = os.path.join(self.homeUrl(), path) 
    738         if params: 
    739             path = '%s?%s' % (path, params) 
    740         return self.request.construct_url(path) 
     753        raise NotImplementedException() 
    741754         
    742755    def externalUrl_OLD(self,path,  **kwargs): 
    743756        params = urllib.urlencode(kwargs) 
    744         referer = self.request.headers_in.get('Referer') 
     757        referer = self.request.headers.get('Referer') 
    745758        if not referer: return '' 
    746759        referer = referer.split('?')[0] 
     
    850863    workdate = property(_get_workdate) 
    851864     
    852      
    853865    def _get_logfile(self): 
    854866        if not hasattr(self, '_logfile'): 
     
    859871        return self._logfile 
    860872    logfile = property(_get_logfile) 
    861      
     873         
    862874    def _get_siteHandler(self): 
    863875        if not hasattr(self, '_siteHandler'): 
    864             global GNR_PROCESS_HANDLER 
     876            #global GNR_PROCESS_HANDLER 
    865877            try:  
    866                 GNR_PROCESS_HANDLER # fare come thread.local 
    867             except NameError : 
     878                pagelocals.GNR_PROCESS_HANDLER # fare come thread.local 
     879            except AttributeError : 
    868880                self.newprocess = True 
    869                 GNR_PROCESS_HANDLER = GnrProcessHandler() 
    870             self._siteHandler = GNR_PROCESS_HANDLER.getSiteHandler(self) 
     881                pagelocals.GNR_PROCESS_HANDLER = GnrProcessHandler() 
     882            self._siteHandler = pagelocals.GNR_PROCESS_HANDLER.getSiteHandler(self) 
    871883        return self._siteHandler 
    872884    siteHandler = property(_get_siteHandler) 
     885     
    873886     
    874887    def _findInheritedResource(self, moduleName,ext='py',uri=False): 
     
    11241137            kwargs[k] = v 
    11251138        kwargs.update(auxkwargs) 
    1126         self.request.content_type = "text/xml" 
     1139        self.response.content_type = "text/xml" 
    11271140        resolverclass=str(resolverclass) 
    11281141        if resolverclass in globals(): 
     
    11511164                              output_encoding='utf-8', encoding_errors='replace')                       
    11521165        template = lookup.get_template(os.path.basename(path)) 
    1153         self.request.content_type = 'text/html' 
     1166        self.response.content_type = 'text/html' 
    11541167        css_dojo = getattr(self, '_css_dojo_d%s' % self.dojoversion)() 
    11551168        gnrlibpath='gnr_d%s' % self.dojoversion 
     
    13421355            envelope.setItem('dataChanges', dataChanges) 
    13431356         
    1344         page.request.content_type = "text/xml" 
     1357        page.response.content_type = "text/xml" 
    13451358        xmlresult= envelope.toXml(unresolved=True, jsonmode=True, jsonkey=page.page_id,  
    13461359                              translate_cb=page.translateText, omitUnknownTypes=True, catalog=page.catalog) 
     
    13651378     
    13661379    def _call_html(self, page, method, kwargs, result, error): 
    1367         page.request.content_type = "text/html" 
     1380        page.response.content_type = "text/html" 
    13681381        return result or error 
    13691382 
     
    14161429        #    self.page.gnotify('write cookie', self.page.siteUri, always=False) 
    14171430            self.cookie.value['timestamp'] = time.time() 
    1418             self.data['ip'] = self.page.request.get_remote_host() 
     1431            self.data['ip'] = self.page.request.remote_addr 
    14191432            self.data['pages'] = Bag(self.page.session.getActivePages(self.connection_id)) 
    14201433            self.write() 
     
    15781591    def loadSessionData(self, locking=True): 
    15791592        if locking and (not(self.locked)): 
     1593            self.session.load() 
    15801594            self.session.lock() 
    1581             self.session.load() 
    15821595            self.locked = True 
    15831596        self.pagedata = self.getSessionData(self.page_id) 
  • gnrpy/gnr/web/gnrwebapphandler.py

    r8 r12  
    7070 
    7171from gnr.sql.gnrsqldata import SqlRelatedSelectionResolver, SqlRelatedRecordResolver 
    72  
    7372 
    7473 
  • gnrpy/gnr/web/gnrwebpage.py

    r8 r12  
    1 try: 
    2     from mod_python import apache 
    3     from apache.gnrwebpage_apache import * 
    4 except ImportError: 
    5     from wsgi.gnrwebpage_wsgi import * 
     1#try: 
     2from mod_python import apache 
     3from gnr.web.apache.gnrwebpage_apache import * 
     4#except ImportError: 
     5#    from gnr.web.wsgi.gnrwebpage_wsgi import * 
    66 
    77from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver, TxtDocResolver, UrlResolver, XmlDocResolver, BagFormula 
  • gnrpy/gnr/web/wsgi/gnrwebpage_wsgi.py

    r8 r12  
    2828Copyright (c) 2007 Softwell. All rights reserved. 
    2929""" 
    30 import md5 
    31 import os, sys 
    32 import re 
    33 import time 
    34 import datetime 
    35 import traceback 
    36 import weakref 
    37 import random 
    38 import itertools 
    39 import urllib 
    40 import zipfile 
    41 import StringIO 
    42 from decimal import Decimal 
    43  
    44 from gnr.core.gnrlog import gnrlogging 
    45 from gnr.core.gnrlang import optArgs 
    46 from gnr.core.gnrlang import gnrImport 
    47  
    48 gnrlogger = gnrlogging.getLogger('gnr.web.gnrwebcore') 
    49  
    50 #from mod_python import apache, Session, Cookie 
    51 from mako.template import Template 
    52 import cookie_wsgi as Cookie 
    53 import simplejson as json 
    54  
    55 from mako.lookup import TemplateLookup 
    56  
    57 from gnr.core.gnrbag import Bag, DirectoryResolver, TraceBackResolver, TxtDocResolver, UrlResolver, XmlDocResolver, BagFormula 
    58  
    59 from gnr.core.gnrlang import GnrObject 
    60 from gnr.core import gnrlist 
    61  
    62 from gnr.core.gnrlang import getUuid 
    63 from gnr.core.gnrstring import templateReplace, splitAndStrip, countOf, toText, toJson, concat 
    64 from gnr.core import gnrdate 
    65  
    66 from gnr.web.jsmin import jsmin 
    67  
    68 from gnr.web.gnrwebstruct import GnrDomSrc_dojo_12, GnrDomSrc_dojo_11, GnrGridStruct 
    69 from gnr.web.gnrwebapp import GnrWebApp 
    70  
    71 from gnr.sql.gnrsqldata import SqlRelatedSelectionResolver, SqlRelatedRecordResolver 
    72  
    73 import threading 
    74 pagelocals = threading.local() 
    75  
    76  
    77 CONNECTION_TIMEOUT = 3600 
    78 CONNECTION_REFRESH = 20 
    79 AUTH_OK=0 
    80 AUTH_NOT_LOGGED=1 
    81 AUTH_FORBIDDEN=-1 
    8230 
    8331from webob import Request 
     
    8533from webob import exc 
    8634from webob.exc import HTTPFound, HTTPNotFound, HTTPUnauthorized 
     35import gnr.web.wsgi.cookie_wsgi as Cookie 
     36from gnr.web._gnrbasewebpage import GnrBaseWebPage 
     37from gnr.web.apache.gnrwebreqresp_wsgi import GnrWebRequest,GnrWebResponse 
     38cookie_types = {'marshal': Cookie.MarshalCookie} 
     39     
     40class GnrWebPage(GnrBaseWebPage): 
     41     
     42    def __init__(self, request, customclass, filepath, response=None, **kwargs): 
     43        self._request = request 
     44        if not response: response = Response() 
     45        self._response = response     
     46        self.request = GnrWebRequest(request) 
     47        self.response = GnrWebResponse(response) 
     48        self._initialize(customclass, filepath, **kwargs) 
     49         
     50    def newMarshalCookie(self, name, value, secret=None, **kw): 
     51        return Cookie.MarshalCookie(name,value,secret=secret,**kw) 
     52     
     53    def raiseUnauthorized(self): 
     54        raise HTTPUnauthorized 
     55         
     56    def get_cookie(self, cookieName, cookieType, secret = None): 
     57        cookieType = cookie_types[cookieType] 
     58        cookie=Cookie.get_cookie(self.request, cookieName, cookieType, secret = secret) 
     59        if type(cookie) is not cookieType: cookie=None 
     60        return cookie 
     61     
     62    def add_cookie(self,cookie): 
     63        Cookie.add_cookie(self.request,cookie) 
     64     
     65    def get_session(self, **kwargs): 
     66        return self._request.environ['beaker.session'] 
     67         
     68    def add_response_header(self,header,value): 
     69        self.response.headers.add(header, value) 
    8770 
    88 var_regex = re.compile(r''' 
    89                        \{          # The exact character "{" 
    90                        (\w+)       # The variable name (restricted to a-z, 0-9, _) 
    91                        (?::([^}]+))? # The optional :regex part 
    92                        \}          # The exact character "}" 
    93                        ''', re.VERBOSE) 
    94  
    95 def template_to_regex(template): 
    96     regex = '' 
    97     last_pos = 0 
    98     for match in var_regex.finditer(template): 
    99         regex += re.escape(template[last_pos:match.start()]) 
    100         var_name = match.group(1) 
    101         expr = match.group(2) or '[^/]+' 
    102         expr = '(?P<%s>%s)' % (var_name, expr) 
    103         regex += expr 
    104         last_pos = match.end() 
    105     regex += re.escape(template[last_pos:]) 
    106     regex = '^%s$' % regex 
    107     return regex 
    108  
    109 class Router(object): 
    110     def __init__(self): 
    111         self.routes = [] 
    112  
    113     def add_route(self, template, controller, **vars): 
    114         if isinstance(controller, basestring): 
    115             controller = load_controller(controller) 
    116         self.routes.append((re.compile(template_to_regex(template)), 
    117                             controller, 
    118                             vars)) 
    119  
    120     def __call__(self, environ, start_response): 
    121         req = Request(environ) 
    122  
    123         for regex, controller, vars in self.routes: 
    124             match = regex.match(req.path_info) 
    125             if match: 
    126                 req.urlvars = match.groupdict() 
    127                 req.urlvars.update(vars) 
    128                 return controller(environ, start_response) 
    129         return exc.HTTPNotFound()(environ, start_response) 
    130  
    131 def controller(func): 
    132     def replacement(environ, start_response): 
    133         req = Request(environ) 
    134         try: 
    135             resp = func(req, **req.urlvars) 
    136         except exc.HTTPException, e: 
    137             resp = e 
    138         if isinstance(resp, basestring): 
    139             resp = Response(body=resp) 
    140         return resp(environ, start_response) 
    141     return replacement 
    142  
    143 class GrowlStub(object): 
    144     def notify(self, *args, **kwargs): 
    145         pass 
    146  
    147 class GnrWebClientError(Exception): 
    148     pass 
    149  
    150 class GnrWebServerError(Exception): 
    151     pass 
    152  
    153 class GnrWebPage(GnrObject): 
    154     def __init__(self, req, customclass, filepath, page_id=None, response=None, 
    155                  _rpc_resultPath=None, _dk_=None, xxcnt=None, _user_login=None, sitepath=None, **kwargs): 
    156         self._rpc_resultPath=_rpc_resultPath 
    157         self.request = req 
    158         if response: 
    159             self.response=response 
    160         else: 
    161             self.response=Response() 
    162         self.response.headers.add("Pragma", "no-cache") 
    163 #        req.headers_out["Pragma"] = "no-cache" 
    164  
    165         self.page_id = page_id or getUuid() 
    166         self._dk=_dk_ 
    167         self.filepath = filepath # TOGLIERE ???? 
    168         self._user_login = _user_login 
    169         self.kwargs = kwargs 
    170         self._htmlHeaders=[] 
    171         self._ctxData = Bag() 
    172         if sitepath: 
    173             self.sitepath=sitepath 
    174         else: 
    175             self.sitepath=os.path.dirname(os.path.dirname(self.filepath)) 
    176         self.folders= {'pages':os.path.join(self.sitepath,'pages'), 
    177                        'site':self.sitepath, 
    178                        'current':os.path.dirname(self.filepath), 
    179                        'document_root': os.path.dirname(self.filepath).rstrip('/') 
    180                        } 
    181         self.filename = os.path.basename(self.filepath) 
    182         self.pagename = os.path.splitext(os.path.basename(self.filename))[0] 
    183         self.pagepath = self.filename.replace(self.folders['pages'], '') 
    184  
    185         self.theme = getattr(customclass, 'theme', None) or self.config['dojo?theme'] or 'tundra' 
    186         self.dojoversion = getattr(customclass, 'dojoversion', None) or self.config['dojo?version'] or '11' 
    187         self.pagetemplate = getattr(customclass, 'pagetemplate', None) or self.config['dojo?pagetemplate'] 
    188         self.maintable = getattr(customclass, 'maintable', None) 
    189         self.js_requires = splitAndStrip( getattr(customclass, 'js_requires', ''),',') 
    190         self.css_requires = splitAndStrip(getattr(customclass, 'css_requires', ''),',') 
    191         py_requires = splitAndStrip(getattr(customclass, 'py_requires', '') ,',') 
    192         self.eagers = getattr(customclass, 'eagers', {}) 
    193         self._baseMixins() 
    194         self._pyrequiresMixin(py_requires) 
    195         self.mixin(customclass) 
    196         self._customPageMixins() 
    197         self.css_requires.reverse() 
    198  
    199     def getUuid(self): 
    200         return getUuid() 
    201  
    202     def _baseMixins(self): 
    203         pkgId = self.packageId 
    204         pkg=None 
    205         if pkgId: 
    206             pkg = self.application.packages[pkgId] 
    207         if pkg: 
    208             self.mixin(pkg.webPageMixin) # first the package standard 
    209         self.mixin(self.application.webPageCustom) # then the application custom 
    210         if pkg: 
    211             self.mixin(pkg.webPageMixinCustom) # finally the package custom 
    212  
    213     def _customPageMixins(self): 
    214         """Look in the instance custom folder for a file named as the current webpage""" 
    215         if self.packageId: 
    216             filepath = self.pagepath.split('/',1) 
    217             if len(filepath) == 2: #the page is into a package, not root level 
    218                 filepath = filepath[1] 
    219                 customPagePath=os.path.join(self.application.customFolder, self.packageId, 'webpages', filepath) 
    220                 if os.path.isfile(customPagePath): 
    221                     raise self.filename 
    222                     self.mixin('%s:%s' % (customPagePath,'WebPage')) 
    223  
    224     def _pyrequiresMixin(self, py_requires): 
    225         for mix in py_requires: 
    226             if mix: 
    227                 modName, clsName = mix.split(':') 
    228                 modPathList = self.getResourceList(modName, 'py') or [] 
    229                 if modPathList: 
    230                     modPathList.reverse() 
    231                     for modPath in modPathList: 
    232                         self.mixin('%s:%s' % (modPath, clsName)) 
    233                 else: 
    234                     raise GnrWebServerError('Cannot import component %s' % modName) 
    235  
    236  
    237     def indexo(self ,**kwargs): 
    238         self.kwargs.update(kwargs) 
    239         self.onInit() 
    240         if self._user_login: 
    241             user=self.user # if we have an embedded login we get the user right now 
    242  
    243         try: 
    244             if 'mako' in self.kwargs: 
    245                 result = self.makoTemplate(path=self.kwargs['mako'], **self.kwargs) 
    246             elif 'method' in self.kwargs: 
    247                 result = self._rpcDispatcher(**self.kwargs) 
    248             else: 
    249                 result = self.indexPage() 
    250                 self.session.loadSessionData() 
    251                 self.session.pagedata['pageArgs'] = self.kwargs 
    252                 self.session.pagedata['page_id'] = self.page_id 
    253                 self.session.pagedata['connection_id'] = self.connection.connection_id 
    254                 self.session.pagedata['pagepath'] = self.pagepath 
    255                 self.session.saveSessionData() 
    256         except: 
    257             self._onEnd() 
    258             raise 
    259         self._onEnd() 
    260         return result 
    261  
    262     def reqargs(self,req): 
    263         return dict(getattr(req,req.method)) 
    264  
    265     def index(self ,**kwargs): 
    266         #req = Request(environ) 
    267         #kwargs = self.reqargs(req) 
    268         self.kwargs.update(kwargs) 
    269         self.onInit() 
    270         if self._user_login: 
    271             user=self.user # if we have an embedded login we get the user right now 
    272  
    273         try: 
    274       &