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"') #设定用户浏览器显示的保存文件名
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变量。
-----------------------------------------
1、在session设计里,用IE可以清除登录,用火狐浏览器无法清除,将火狐浏览器里的缓存全部删除后,正常。
2、登录才能查看的页面:
1)设计一个判断是否登录的基类 -> 其他的模板继承该基类(注意需将基类初始化)。(这个麻烦点)
2)定义一个函数check_login():if sess.login == 0:raise web.seeother("/login")
在对数据库进行批量操作时,用事务速度相当的快。
web.py学习心得的更多相关文章
- web.py 学习(-)Rocket web框架
Rocket是一个轻量级,多线程,符合WSGI规范的web框架. Rocket使用一个线程监听连接,接收到连接之后放到Queue中,有worker线程进行处理. Rocket含有以下属性: metho ...
- web.py学习遇到的问题
刚配置好了web.py运行所需要的环境,试着运行一个入门小实例,结果遇到了异常提示.不知道是什么原因导致的(是环境没配置好?还是……),暂时做个标记,记录一下. 运行的代码 import web ur ...
- web.py 学习(二)Worker
Rocket Server 启动一个线程监听客户端的连接,收到连接将连接放置到队列中.线程池中的Worker会以这个连接进行初始化.Rocket中Worker的基类是: class Worker(Th ...
- web.py simpletodo 例子
一个很好的例子: 许多新手,特别是从 ASP/PHP/JSP 转过来的同学,经常问下面这几个问题: 所有东西都放在一个 code.py 中呀?我有好多东西该如何部署我的代码? 是不是 /index 对 ...
- web.py开发
web.py需要使用python2.X,所以安装python版本2.7.9 web.py 是一个轻量级Python web框架,它简单而且功能强大 web.py安装 安装python (1)使用pip ...
- Web.py 框架学习笔记 - URL处理
最近由于工作需要开始学习基于python的web应用框架web.py.为了方便学习,将学习心得逐日记下以便日后复习. URL 模板: web.py提供了一套url处理的模板,在python工程中,只需 ...
- Web前端培训学习心得
web前端工程师技术日趋成熟,越来越多的行业巨头正不断向web前端工程师示好,在未来几年,web前端将会以更多的形式渗透到我们生活中的方方面面,因此越来越多的从业者开始关注web前端开发行业,今天小编 ...
- python学习笔记(十 四)、web.py
使用web.py 通过python进行网页的编写,下面我们来简单了解一哈web.py 的使用 1 url处理 使用特定的url结构来解析我们发送的请求.如下面所示: urls = ( '/login' ...
- 【Python】web.py初识学习
简单而直接的Python web 框架:web.py 2016年11月03日 14:09:08 擒贼先擒王 阅读数:35157更多 个人分类: Web From:https://www.oschi ...
随机推荐
- mysql二进制文件操作语法(mysql binary log operate statements)
开启 binary logs 功能 在 mysql 配置文件中配置 log-bin,重启 mysql my.cnf (on Linux/unix) or my.ini (on Windows) 例子: ...
- Less函数说明
索引 escape(@string); // 通过 URL-encoding 编码字符串 e(@string); // 对字符串转义 %(@string, values...); // 格式化字符串 ...
- 【转】Alchemy的使用和多项式批量计算的优化
原文:http://www.cnblogs.com/flash3d/archive/2012/01/30/2332158.html ================================== ...
- 在ubuntu 14.04 64位添加32位库
网上查了好多,结果发现这个是有用的,做个标记 sudo apt-get install libgtk2.0-0:i386
- Laravel框架数据库CURD操作、连贯操作使用方法
Laravel框架数据库CURD操作.连贯如何来操作了这个操作性是非常的方便简单了我们在这里来为各位介绍一篇相关的教程,具体的细节步骤如下文介绍. Laravel是一套简洁.优雅的PHP Web开 ...
- lnmp无法删除目录,目录包含.user.ini
无法删除".user.ini"文件解决方法,运行后删除即可 chattr -i /home/wwwroot/yoursite/.user.ini 如果是需要修改文件,记得修改完以后 ...
- UVA 10474
题意:给你一组数,再给几个数问是否在一组数中. 题很简单:STL入门. 没用到STL. #include<iostream> #include<cstdio> #include ...
- tar命令
# tar -cvf /usr/local/auto_bak/test.tar /usr/local/test 仅打包,不压缩 # tar -zcvf /usr/local/auto_bak/test ...
- gui2
事件:描述发生了什么的对象. 存在各种不同类型的事件类用来描述各种类型的用户交互. 事件源:事件的产生器. 事件处理器:接收事件.解释事件并处理用户交互的方法. 比如在Button组件上点击鼠标会产生 ...
- C++ operator 的一种不会的用法
自认为对C++比较熟悉,突然看到一些奇怪的代码(在看网上下载的代码Sockets): class SocketAddress { public: virtual ~SocketAddress() {} ...