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")
在对数据库进行批量操作时,用事务速度相当的快。