第三天:cookie和session
这篇主要记录下web.py的cookie和session的学习过程。
这是目录树
. ├── code.py ├── config │ ├── __init__.py │ ├── setting.py │ └── url.py ├── controllers │ ├── common.py │ ├── __init__.py │ └── views.py |── templetor ├── login.html └── success.html
setting.py里面存放数据库等信息,url.py配置url的信息,common.py是登录验证代码,views.py是显示页面【好像没什么用】,templetor文件夹就是网页模板了。
setting.py源码:
#!/usr/bin/env python # coding: utf-8 import web db = web.database(dbn='mysql', db='dbname', user='root', pw='password') render = web.template.render('templetor/', cache=False) web.config.debug = False
因为在web.py自带的服务器的调试模式下不能正常使用session,(原因请看cookbook),所以这里把调试模式设置为False–关闭。对了,好像没看到调试模式的功能解释,也懒得找,只知道在服务器运行的时候(python code.py),如果是在调试模式下,修改其他文件的代码后,不用重新启动服务器,服务器自动加载。
code.py源代码:
#!usr/bin/env python # coding: utf-8 import web from config.url import urls app = web.application(urls, globals()) session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'login':"", 'user_name':'guest'}) def session_hook(): web.ctx.session = session app.add_processor(web.loadhook(session_hook)) if __name__ == "__main__": app.run()
因为把业务处理的代码放在了不同的py文件中,所以在其它文件中是无法获得session的【这个好奇怪,cookbook说是子应用不行,难道把代码放在不同文件就是不同应用了?】,然后处理方法【参考cookbook】,就是添加处理器,这个现在只是知道这么做,到底底层怎么实现的,以后再看了。
额,源码一个个贴出来太麻烦了。。还是贴关键代码就好了。。urls.py的代码就不贴了。等下把代码打包下当附件。
登录验证的代码:
def POST(self): name, pwd = web.input().name, web.input().pwd if name != None and pwd != None: myvar = dict(name=name) result = db.select('tuser', myvar, what='pwd') if result != None and pwd == result[0].pwd: web.setcookie('test', 'cookice_test', 60) session.loginned = True session.username = name return render.success(name, 'cookie test') raise web.seeother('/login')
web.py的的数据库操作,真的是很简单啊。。直接select一下就ok了【参考:http://webpy.org/cookbook/select.zh-cn】。设置cookie也是很简单,setcookie()函数调用下就ok了【参考http://webpy.org/cookbook/cookies.zh-cn】。session的使用,很简单,就不说了。。
这是直接查看登录后页面的处理代码:
class Success: def GET(self): if session.loginned == True: return render.success(session.username, web.cookies().get('test')) return render.login()
首先是判断session中的loginned是否为True,如果为True,则返回success.html页面,参数有session.username和cookie中的变量test的值。
success.html的源代码
$def with (name, str) <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Welcome</title> </head> <body> This is $str! $name! </body> </html>
学习中遇到的几个问题:
1、session在不同文件中的使用,之前认为是一个应用而已,所以各种尝试,不过有的方式可以。然后忘记哪些可以了,也不想重新在试了。现在记得尝试过的有:a、导入模块code中的session,b、用相同直接再声明一个,c、忘记了
2、success.html要声明两个变量,然后,因为无知,写成
$def with (name) $def with (str)
结果毫无疑问的语法错误,然后找了很久才猜到要写在一起,无知啊~
3、导入模块的时候一直说找不到模块,后来想起了simple todo里面好像有个__init__.py的空文件(http://simple-is-better.com/news/309),当时以为没什么用,现在才知道,要添加这个空文件,才能把文件夹当成模块导入到其它代码中。
参考资料:
web.py的cookbook: http://webpy.org/cookbook/
转载请注明: 转载自http://jyd.me/
本文链接地址: 第三天:cookie和session
- 第二天:登录验证
- 第四天:注册和邮件通知
I am forever indebted to you for this inafimotron.