web.py学习心得

1、注意判断数字时,如果是get传递的参数,一定要用int转换。不然出错。

2、$var 定义时,冒号后的内容不是python内容,需加上$符号。如$var naviId:$naviId。

3、各个模板中的变量,要对应一致。在用base布局时,整个模板内容为layout模板的content,模板内定义的变量x(模板变量),在layout模板内用content.x 引用。

4、模板编码要统一,有一次新建文件时,忘记改编码了,缺省值没设。。。报错:list index out of range,统一改为utf-8后正常。

5、模板render渲染支持文件夹子目录。如"/templates/aaa/bbb.html",return render.aaa.bbb()

    出现“Render instance has no __call__ method”错误信息时,查看模板文件夹与文件是否有重名。

6、使用apache运行web.py:

    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 ,需配置虚拟路径和根路径。将配置文件改为

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,多个端口)
1、将监听端口增加
Listen 80
Listen 8080
2、

在末尾加上:

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>

 
  

<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

7、url传值时,出现传递的参数需加引号。。。

8、no such column:SQL语句包含数据库表中不存在的列名。。。需要在查询语句里的字符串加逗号。

9、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"') #设定用户浏览器显示的保存文件名

------------------------------------网上其他的使用心得----------------------------------------

 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变量。

 

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

1、在session设计里,用IE可以清除登录,用火狐浏览器无法清除,将火狐浏览器里的缓存全部删除后,正常。

2、登录才能查看的页面:

  1)设计一个判断是否登录的基类 -> 其他的模板继承该基类(注意需将基类初始化)。(这个麻烦点)

  2)定义一个函数check_login():if sess.login == 0:raise web.seeother("/login")

 

在对数据库进行批量操作时,用事务速度相当的快。

你可能感兴趣的:(web.py学习心得)