天天看點

web.py入門紀要

  • web.py自帶的伺服器在調試模式下,session不能正常工作,因為調試模式支援子產品重載入(重載入,絕非重載。是reload,而非override),是以reloader會載入主子產品兩次,是以,就會建立兩個session對象。

    為此,可以直接禁用調試模式,隻要令web.config.debug = False即可。如果非要在調試模式下使用session,也有方法,我們隻要把session存儲在全局的資料容器中,就能避免二次建立session,如下:

    if web.config.get('_session') is None:
        session = web.session.Session(app, web.session.DiskStore('sessions'))
        web.config._session = session
    else:
        session = web.config._session
               
    當然,不要忘了重新開機伺服器生效。。。
  • 要想在模版檔案裡通路session,可以在建立render對象時将session傳遞進去,如:
    render = web.template.render('templates', base='base', globals={'context': session})
               
    隻要,在模版檔案中就可以通路到session了,如
    $if context.get('logged_in'):
        ...
    $else:
        ...
               
    當然,這種方法同樣适用于傳遞其它變量。
  • 類似django中的login_required的裝飾器,代碼如下:
    def login_required(func):
        def _loginRequiredInner(*args, **kw):
            if session.get('logged_in'):
                return func(*args, **kw)
            raise web.seeother('/login/')
        return _loginRequiredInner
               
  • web.input()可以獲得使用者請求送出(GET/POST)的資料,是一個類字典的對象。對于多選框之類的有多個值的資料,預設情況下隻傳回其中一個值,如果想以清單方式獲得所有值,可以提供一個空清單為初值,如web.input(fields=[]),其中fields是多選框的name。

    實際上這種方法還可以用于指定預設值。

  • Form對象的validates方法可以驗證Form對象是否有效,即各個inputs是否通過了驗證。隻有調用了validates方法,Form對象的各個inputs才會有相應的值,否則,其值均是None。validates方法其内部預設會使用web.input()來作為資料來源去驗證,如果需要指定資料來源,可以指定source參數,如:
    form = self.form()
    data = web.input(mid_page=[])
    data.mid_page = filter(None, data.mid_page)
    if form.validates(source=data):
        self._save(form.d)
        web.header('Content-Type','text/html; charset=utf-8', unique=True)
        return "<strong>已儲存</strong>"
    else:
        return render.index(form)
               
  • 要想在web.py自帶的開發伺服器中處理靜态檔案(如圖檔或css和js),可以在代碼目錄下建立一個檔案夾命名為static,然後将需要的靜态檔案放到這個static檔案夾裡即可。也可以自己寫寫一個View來處理靜态檔案,代碼如下
    import web, os, wsgiref.util, mimetypes, datetime
     
    def serve_static(filename, mime_type=None):
        ''' Serves a file statically '''
        if mime_type is None:
            mime_type = mimetypes.guess_type(filename)[0]
        web.header('Content-Type', '%s' % mime_type)
        stat = os.stat(filename)
        web.header('Content-Length', '%s' % stat.st_size)
        web.header('Last-Modified', '%s' %
        web.http.lastmodified(datetime.datetime.fromtimestamp(stat.st_mtime)))
        return wsgiref.util.FileWrapper(open(filename, 'rb'), 16384)
     
    class Static(object):
        ''' Static file serving.'''
        def GET(self, name):
            return serve_static(os.path.join('mystatic', name))
     
    urls = (
        '/mystatic/(.*)', Static
        )
               

本文出自 夜驚心的部落格,轉載請保留出處