Chinaunix

标题: 制作mod_python登录页面不成功 [打印本页]

作者: bleem1998    时间: 2006-05-15 11:07
标题: 制作mod_python登录页面不成功
把问题简化了一下
下面是那个来自手册里的计数器
我把它从handler改到了publisher
就不工作了
这是为什么呢

  1. from mod_python import Session

  2. def index(req):
  3.         session=Session.Session(req)
  4.         try:
  5.                 session['hits']+=1
  6.         except:
  7.                 session['hits']=1
  8.         session.save()
  9.         req.content_type='text/plain'
  10.         return 'Hits: %d\n' % session['hits']
复制代码

[ 本帖最后由 bleem1998 于 2006-5-15 15:26 编辑 ]
作者: newbuding    时间: 2006-05-15 15:20
还没试session,可以试试cookie?
作者: bleem1998    时间: 2006-05-15 15:27
修改了一下问题
把问题简化了
再帮看看?

至于cookie。。。
等搞定了session就要去弄它了
作者: newbuding    时间: 2006-05-15 15:33
我的好用啊,是不是你的mod_python配置有问题?
作者: bleem1998    时间: 2006-05-15 15:35
你是用的publisher吗
那个计数器可以工作?
可是我这里始终都是1
作者: bigapple2008    时间: 2006-05-15 15:37
还没用mod_python,,直接用cgi写的话,不知道cookie和session麻烦不
作者: bleem1998    时间: 2006-05-15 15:40
不懂CGI阿
既然是cgi那应该和语言无关了
用delphi和用python都是一个方法吧
这种东西perl版肯定好多人知道
作者: newbuding    时间: 2006-05-15 15:43
原帖由 bleem1998 于 2006-5-15 15:35 发表
你是用的publisher吗
那个计数器可以工作?
可是我这里始终都是1

我始终都是用publisher
刷新了几下,浏览器显示

  1. Hits:7
复制代码

作者: bleem1998    时间: 2006-05-15 15:48
Ok
看来是我的配置有问题
handler模式都不行
哈哈

能否把你的httpd.conf相关部分贴出来我参考一下?

这个是我的

  1. <Directory /var/www/apache2-default/test>
  2.         AddHandler mod_python .htm .html .psp
  3.         PythonHandler mod_python.psp
  4.         PythonDebug ON
  5.         Order allow,deny
  6.         Allow from all
  7. </Directory>

  8. <Directory /var/www/apache2-default/test/publisher>
  9.         AddHandler mod_python .py
  10.         PythonHandler mod_python.publisher
  11.         PythonDebug ON
  12.         Order allow,deny
  13.         Allow from all
  14. </Directory>

  15. <Directory /var/www/apache2-default/test/handler>
  16.         AddHandler mod_python .py
  17.         PythonHandler my_handler
  18.         PythonDebug On
  19. </Directory>

复制代码

[ 本帖最后由 bleem1998 于 2006-5-15 15:51 编辑 ]
作者: newbuding    时间: 2006-05-15 15:59
我是这样做的:

/etc/apache2/sites-available/default

  1. <Directory "/home/sun/web/py/">
  2.     AllowOverride All
  3. </Directory>
复制代码


/etc/apache2/httpd.conf

  1. AddHandler mod_python .psp .psp_
  2. PythonHandler mod_python.psp
复制代码


然后在需要执行.py的目录里建一个.htaccess文件

  1. AddHandler mod_python .py
  2. PythonHandler mod_python.publisher
  3. PythonDebug On
复制代码


如果不需要执行.py的目录里也要有.htaccess文件

  1. SetHandler None
复制代码

[ 本帖最后由 newbuding 于 2006-5-15 16:02 编辑 ]
作者: bleem1998    时间: 2006-05-15 16:00
别人的机器刷这个页面就不停的变
我的机器就不行。。。。
作者: newbuding    时间: 2006-05-15 16:03
是不是浏览器的问题?
作者: bleem1998    时间: 2006-05-15 16:16
原因找到了
是publisher和PSP的session一起用就会有问题
publisher做一个save()
在PSP里找不到这个session了
作者: newbuding    时间: 2006-05-15 16:25
那么1楼的那个例子你怎么也会有问题?
作者: bleem1998    时间: 2006-05-15 17:24
如果session出错一次
那么1楼的例子就跑不了了
得重新启动浏览器才行

看来这个问题是不能解决了
现在我的做法是
所有用到session.save()的地方我都用PSP来替换了

作者: bleem1998    时间: 2006-05-15 17:25
问题很明显
PSP里保存的session在publisher里可以看到
但是publisher里保存的session在PSP里看不到
作者: newbuding    时间: 2006-05-15 17:34
能不能把你原来的代码再贴一次?
作者: bleem1998    时间: 2006-05-15 17:39
login.htm

  1. <html>
  2. <%
  3. from mod_python import Session
  4. %>
  5. <%
  6. sess=Session.Session(req)
  7. if sess.is_new():
  8.         req.write('没登录.')
  9. %>

  10.       <form action="../publisher/login.py" method="GET">
  11.          姓名:   <input type="text" name="name">
  12.            <input type="submit" value='登录'>
  13.       </form>
  14. </html>

  15. <%
  16. else:
  17.         req.write('你已经登录了.')
  18. %>
复制代码


login.py

  1. from mod_python import Session
  2. from mod_python import util
  3. from mod_python import apache

  4. def login(req, name=''):
  5.         sess=Session.Session(req)
  6.        
  7.         if sess.is_new():
  8.                 #sess.set_timeout(10)
  9.                 sess.save()
  10.                 return 'New',str(sess.id())
  11.         else:
  12.                 return 'Old',str(sess.id())
  13.         return 'Ok',str(sess.id())
复制代码

作者: newbuding    时间: 2006-05-15 17:41
吃饭回来研究研究
作者: bleem1998    时间: 2006-05-15 17:42
原帖由 newbuding 于 2006-5-15 17:41 发表
吃饭回来研究研究


问题很明显
PSP里保存的session在publisher里可以看到
但是publisher里保存的session在PSP里看不到
作者: newbuding    时间: 2006-05-15 20:09
你的问题其实是由逻辑错误导致的
在mod_python平台下,.py是用来处理数据的,.psp|.html是用来显示数据的
作者: bleem1998    时间: 2006-05-15 20:32
这么严重阿
我只是想做个登陆的东西
在PSP里把表单提交给.py文件处理
就这么个简单的操作而已阿
作者: newbuding    时间: 2006-05-15 20:38
这个是我做的
入口在sessiontest1.py上,而不是在login.psp上

sessiontest1.py

  1. from mod_python import Session,apache,psp,util

  2. def index(req):
  3.     session=Session.Session(req)
  4.     if session.is_new():
  5.         return psp.PSP(req,'login.psp',vars={'backuri':req.uri})
  6.     try:
  7.         session['hits']+=1
  8.     except:
  9.         session['hits']=1
  10.     session.save()

  11.     req.content_type='text/plain'
  12.     return 'Hits:%s\n'%session['hits']

  13. def login(req,username='',password='',backuri=''):
  14.     session=Session.Session(req)
  15.     if not backuri:
  16.         backuri='/'
  17.     if username=='a' and password=='b':
  18.         session['username']=username
  19.         session.save()
  20.         util.redirect(req,backuri)
  21.     else:
  22.         return psp.PSP(req,'login.psp',vars={'backuri':backuri})
复制代码


login.psp

  1. <html>
  2. <body>
  3. <%=backuri%>
  4. <form action="/py/sessiontest1.py/login" method="post">
  5. <input type="hidden" name="backuri" value="<%=backuri%>" />
  6. <input type="text" name="username" />
  7. <input type="password" name="password" />
  8. <input type="submit" value="ok" />
  9. </form>
  10. </body>
  11. </html>
复制代码

作者: newbuding    时间: 2006-05-15 20:41
做上面的程序时我发现return语句并不会用原来的session,所以采用重定向功能保持原来的session
原帖由 bleem1998 于 2006-5-15 20:32 发表
这么严重阿
我只是想做个登陆的东西
在PSP里把表单提交给.py文件处理
就这么个简单的操作而已阿

做登陆的东西我觉得还是cookie功能多一些,可以把cookie保存在客户端,以后的时候自动登陆,而且想保存多久就多久,想不保存也行。session就没办法了
另外比较安全的做法应该是cookie和session共用吧?这个就没研究过了

[ 本帖最后由 newbuding 于 2006-5-15 20:46 编辑 ]
作者: bleem1998    时间: 2006-05-15 21:12
为什么我不能import psp呢

  1. ImportError: cannot import name psp
复制代码

作者: newbuding    时间: 2006-05-16 07:23
你仔细看看,我是这么写的
from mod_python import Session,apache,psp,util
你也可以这样写

  1. from mod_python import Session
  2. from mod_python import apache
  3. from mod_python import psp
  4. from mod_python import util
复制代码


python 的语法很灵活的

[ 本帖最后由 newbuding 于 2006-5-16 07:25 编辑 ]
作者: bleem1998    时间: 2006-05-16 09:13
在windows下可以在linux下不行
原因不明正在找
作者: bleem1998    时间: 2006-05-16 09:39
原来有人和我遇到同样的错误了
可是好像没人解答
http://www.modpython.org/piperma ... ecember/017009.html
作者: bleem1998    时间: 2006-05-16 10:51
在牛牛的帮助下终于跑起来了
newbuding你的代码可以工作鸟
写的不错学习了
不过publisher里保存的session
在PSP里依然是不可见的
所以在登录中做session.save()这个动作的最好还是用PSP
这就是我得出的最终结论
呵呵
作者: newbuding    时间: 2006-05-16 12:27
牛牛是谁啊?
作者: bleem1998    时间: 2006-05-16 12:49
一个群1073669
里面的牛牛




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2