web.py學習心得

一、注意判斷數字時,若是是get傳遞的參數,必定要用int轉換。否則出錯。css

二、$var 定義時,冒號後的內容不是python內容,需加上$符號。如$var naviId:$naviId。html

三、各個模板中的變量,要對應一致。在用base佈局時,整個模板內容爲layout模板的content,模板內定義的變量x(模板變量),在layout模板內用content.x 引用。python

四、模板編碼要統一,有一次新建文件時,忘記改編碼了,缺省值沒設。。。報錯:list index out of range,統一改成utf-8後正常。mysql

五、模板render渲染支持文件夾子目錄。如"/templates/aaa/bbb.html",return render.aaa.bbb()web

    出現「Render instance has no __call__ method」錯誤信息時,查看模板文件夾與文件是否有重名。正則表達式

六、使用apache運行web.py:sql

    1)、導入模塊出現問題,提示ImportError: No module named model(在apache的/logs/error.log查看),路徑有問題,在import web 模塊的前面加上以下語句數據庫

import sys, os 
abspath = os.path.dirname(__file__) 
sys.path.append(abspath) 
os.chdir(abspath)

    2)、httpd.conf 配置以下:apache訪問css js ,需配置虛擬路徑和根路徑。將配置文件改成apache

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias / "D:/pythonTest/web/code.py/"   根目錄
 
Alias /static "D:/pythonTest/web/static/"    #設置靜態路徑
AddType text/html .py


修改DocumentRoot "d:/pythonTest/web11"與<Directory "d:/pythonTest/web11">


虛擬主機配置(同個IP,多個端口)
一、將監聽端口增長
Listen 80
Listen 8080
二、

在末尾加上:

LoadModule wsgi_module modules/mod_wsgi-win32-ap22py27-3.3.so

<VirtualHost 127.0.0.1:80>
    DocumentRoot "d:/pythonTest/www"
    WSGIScriptAlias / "d:/pythonTest/www/code.py"
    Alias /static "d:/pythonTest/www/static/"
    AddType text/html .py
    <Directory "D:/pythontest/www">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>api

 
 

<VirtualHost 127.0.0.1:8080>
DocumentRoot "d:/pythonTest/web"
WSGIScriptAlias / "d:/pythonTest/web/code.py"
Alias /static "d:/pythonTest/web/static/"
AddType text/html .py
<Directory "D:/pythontest/web">
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

 

 

    3)、code.py 的 app 代碼:

app = web.application(urls,globals(),autoreload=False)
application = app.wsgifunc()

    4)、出現「 Internal Server Error」時,在配置文件輸入:

LoadModule rewrite_module modules/mod_rewrite.so

七、url傳值時,出現傳遞的參數需加引號 ?

八、no such column:SQL語句包含數據庫表中不存在的列名。。。須要在查詢語句裏的字符串加逗號。?

九、web.py 網頁 導出excel的簡單辦法。

    1)、在py代碼裏寫入 web.header的值:

web.header('content-type','application/vnd.ms-excel;charset=UTF-8') 
return render.XXX()

    2)、在html頁面頭部寫入meta :

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    3)、均需採用utf-8 編碼,否則有亂碼。

    4)、web.header('Content-type','application/vnd.ms-excel')  #指定返回的類型
            web.header('Transfer-Encoding','chunked')
            web.header('Content-Disposition','attachment;filename="export.xls"') #設定用戶瀏覽器顯示的保存文件名

10。文件上傳:

  1)取不到上傳的數據時,檢查form 表單是否加上 enctype="multipart/form-data" 聲明。

  2)判斷是否有文件上傳:  

i = web.input(uploadfile={})
if i.uploadfile.filename:
    ...

uploadfile 爲form表單中 file input 的name 值

  3)更多細節查看cgi的相關內容。

11. webpy的database封裝得不錯,api也好用。能夠用在其餘項目中。

 

------------------------------------網上其餘的使用心得----------------------------------------

 http://maplebeats.com/2012/03/03/web-py.html

web.py的文檔有中文版,很是不錯。雖然我也沒有深刻研究,可是我以爲有些細節仍是得寫一寫。

web.config.debug = True 

開發的時候確定要把調試開啓,跟蹤報錯很重要。我就是這樣子發現該死的編碼錯誤的,文件不要放在中文目錄下,瀏覽器最好使用‘現代’瀏覽器,否則web.input處理中文會報錯。

關於static目錄,js,css,images神馬文件之類的都放到這裏面。我試過本身建文件夾,失敗。在html裏引用的時候,目錄要使用static//file。解決辦法就這樣子,原理我也不想搞明白,也不想去搞明白,能用就行。好像是全局變量問題神馬的。
templates模版目錄,定義一個base是不錯的選擇。。。固然也能夠用拼湊。在html裏引用的時候是$:name,必定要注意那個冒號,不加冒號就被處理成純文本了。

render = web.template.render('templates/',base='layout') 

定義類就能生成頁面,用urls的列表來關聯類。類的return返回值就是生成的html,引用模版render.template(var)。。。固然返回值能有多個,要與模版的參數個數一致。

GET和POST,如其字面意思。若是想從網頁中獲得輸入的參數就用POST。web.input()能夠從網頁中獲得輸入的數據,以字典的形式返回,因此對返回值用get方法就能獲得想要數據。

class Login: '''徹底是用來騙老師僞登錄,只是做爲一個例子說明''' def POST(self): i = web.input() account = i.get('account','no account') passwd = i.get('password','no password') if account == 'maple' and passwd == '123': return render.main(account,None,None) else: return render.error('account or password wrong') 

web.py鏈接mysql和postgresql比較簡單,wiki上有詳細說明。我要提的就是關於sqlite,由於這種小玩意用mysql等徹底就是殺雞用牛刀,因而用python自己就自帶的sqlite。可是web.py的鏈接數據庫好像並不支持sqlite,因此請用python-sqlite語句對sqlite進行操做。在code.py開頭最好不要定義web.py的數據庫爲sqlite,雖然這樣子能鏈接上數據庫,可是這毫意義還會對後面的數據爲操做產生干擾。

 

----------------------------------  網絡上搜索的其餘faq  ----------------------------------------

 

1.全部的模板只能共享一個HTML標籤,如<HTML>的,在其餘地方不能有任何關於HTML信息之類的東西,如頭文件,<HTML>,<BODY>之類的,不然出錯,其它模板文件也同樣

 

2.模板註釋必定要寫在末尾,至少要在def with後面,不然會有莫名其妙的錯誤!無論什麼狀況,def with必須在第一行!
3.用mod_wsgi運行web.py時,要指明模板路徑,不然顯示錯誤:raise AttributeError, 「No template named 」 + name
AttributeError: No template named index
解決:

template_root = os.path.join(os.path.dirname(‘D:/pythonStudy/WebpyStudy/projects/blogs/’), ‘templates’)
render = web.template.render(os.path.abspath(os.path.dirname(‘D:/pythonStudy/WebpyStudy/projects/blogs’))+’/templates/’, base = ‘base’, globals=t_globals)#這裏要標明全局變量!!!

4.在web.py用到datestr:
t_globals = {
‘datestr’:web.datestr
}
運行打開http://localhost:8080/顯示Invalid format string
錯誤顯示datestr ValueError: Invalid format string
這時須要從新建表,即要把數據庫以前建立的那個表先刪除,再從新創建,我用Pycharm,換了一個主題(從Default改爲monokai),跟這個有關

5.t_globals = dict(
datestr = web.datestr,
static = ‘/static’,#必須在這裏加上這一行,才能夠在index.html中顯示static文件夾下的東西,如圖片,調用時可這樣:<img src=」$static/webpy.png」 alt=」webpy」/>
)

6.自定義404錯誤
def notfound():
return web.notfound(‘噢,沒有找到!’)
app.notfound= notfound

7.路徑可用正則表達式匹配
大部分時候簡單的正則能夠適用你的常規應用了,數字用 (\d+),字符串用 (.*),注意不要漏寫
像/,/help,/item/(\d+)(\d+將匹配數字),後面是接受請求的類名稱

8.GET函數用於請求網頁文本,還有POST函數,常常被用在提交form,如提交一個去作什麼事情的請求時,就用POST
GET的URL能夠被搜索引擎索引,並經過搜索引擎訪問,雖然大部分頁面你但願被索引,可是少數相似訂單處理的頁面是不但願被索引的

9.問題:在瀏覽器顯示500錯誤,查Apache的log顯示」ImportError: No module named model」
解決:在頂部加上這一行就行,注意import model要放在後面,一樣的方法能夠解決」No module named web」的方法(感謝CPyUG的Ken同窗,還有別的問題可至:http://webpy.org/install
abspath = os.path.dirname(「D:/pythonStudy/WebpyStudy/projects/blogs/」)
sys.path.append(abspath)
os.chdir(abspath)
import model

 

 

---------------------------------------

 

mako模板使用:

include標籤用法、

<%include file="left_menu.html" args="sub=sub"/>
第一個sub是傳遞過去的變量。第二個是變量。

在left_menu.html裏

<%page args="sub" />
而後直接使用sub變量。

 

-----------------------------------------

一、在session設計裏,用IE能夠清除登陸,用火狐瀏覽器沒法清除,將火狐瀏覽器裏的緩存所有刪除後,正常。

二、登陸才能查看的頁面:

  1)設計一個判斷是否登陸的基類 -> 其餘的模板繼承該基類(注意需將基類初始化)。(這個麻煩點)

  2)定義一個函數check_login():if sess.login == 0:raise web.seeother("/login")

 

在對數據庫進行批量操做時,用事務速度至關的快。

相關文章
相關標籤/搜索