第三天: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

Tagged on: ,

One thought on “第三天:cookie和session

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据