py3 web.py转https://blog.csdn.net/weixin_42024288/article/details/80364441

https://blog.csdn.net/weixin_42024288/article/details/80364441

1.安装webpy模块:

pip install web.py==0.40.dev

另外将:

C:\Python34\Lib\site-packages\web.py-0.40.dev0-py3.4.egg\web\template.py

中约1022行return Template(open(path).read(), filename=path, **self._keywords)

修改为:

return Template(open(path,encoding=‘utf-8‘).read(), filename=path, **self._keywords)

不然会引发编码error。

2.设置urls.

  1. import web

  2.  

    urls=(‘/index‘,‘index‘,‘/login‘,‘login‘)

有网友写到,urls是一个元组变量,成员必须成对出现,奇数元素表示url,其后的元素表示对应的处理类。可见urls的规范必须是你的html(名称为/html作为url),后面跟着这个url里面对应的类,上述代码对应的类名字叫index,还可以起其他名字。那么下面就必须对index和login两个类加以定义(注意,类的大小写不要错,还有,请注意,/之后的网站后缀名一定要是html,htm是不行的。)

3.设置类。

代码标准的框架为

  1. class index:

  2.  

    def GET(self):

  3.  

    return render.index()

当然,return或者raise这种函数是必须要写的,但可以写多种内容,比如 return render.index()的含义就是在客户端显示出index.html这个页面。但是如果index页面本身就是一个空页面,我想返回文字该怎么办呢?那么可以改成:

  1. class index():

  2.  

    def GET(self):

  3.  

    return ‘<h1>hello world!</h1>‘

当然,现在基本很多稍微复杂一些的网站会有登录和注册页面。这就需要去设置session了,记录登录的状态。比如这个python代码。

  1. #!/usr/bin/env python

  2.  

    #coding=utf-8

  3.  

    import web

  4.  

    from web import form

  5.  

    urls = (

  6.  

    ‘/‘,‘Index‘,

  7.  

    ‘/login‘,‘Login‘,

  8.  

    )

  9.  

    render =web.template.render("templates")

  10.  

    ‘‘‘为什么一定要把这些html

  11.  

    放在与py文件同一目录下的templates文件夹中?

  12.  

    其实不放在这个文件夹中也是可以实现的,

  13.  

    但是在有引入css,jQuery的时候必须保证html放在templates文件夹,

  14.  

    而且还要把css,jQuery放在跟templates文件夹相同目录的static文件夹下,

  15.  

    文件夹名都是不允许变动的,不要问我为什么,webpy就是这样不善解人意。‘‘‘

  16.  

    web.config.debug = False

  17.  

    #非调试模式,不加这行代码会经常报错的。

  18.  

    app = web.application(urls, locals())

  19.  

    session=web.session.Session(app,web.session.DiskStore(‘sessions‘))

  20.  

    #建立sessions文件夹

下面就到了写“类”的环节了。

先看一下完整代码:(一开始写了一个不用cookie计时的代码,不太规范,下面还有一个使用cookie,不用import time的代码)

  1. #!/usr/bin/env python

  2.  

    #coding=utf-8

  3.  

    import web

  4.  

    from web import form

  5.  

    import time

  6.  

    urls = (

  7.  

    ‘/‘,‘Index‘,

  8.  

    ‘/login‘,‘Login‘,

  9.  

    )

  10.  

  11.  

    render = web.template.render("templates")

  12.  

    allowed = (

  13.  

    (‘admin‘,‘123123‘),(‘111111‘,‘111111‘),

  14.  

    )

  15.  

    web.config.debug = False

  16.  

    app = web.application(urls, locals())

  17.  

    Time1=0

  18.  

    Time2=0

  19.  

    session = web.session.Session(app, web.session.DiskStore(‘sessions‘))

  20.  

    a=session.get(‘logged_in‘,False)

  21.  

    class Index:

  22.  

    def GET(self):

  23.  

    global a,Time2,Time1

  24.  

    if a==True:

  25.  

    Time2=time.time()/60

  26.  

    changeTime=Time2-Time1

  27.  

    if changeTime<=1:

  28.  

    return ‘<h1>Login Success!!!</h1>‘

  29.  

    else:

  30.  

    raise web.seeother(‘/login‘)

  31.  

    else:

  32.  

    raise web.seeother(‘/login‘)

  33.  

    class Login:

  34.  

    def GET(self):

  35.  

    return render.login()

  36.  

    def POST(self):

  37.  

    global a,Time1

  38.  

    message = web.input()

  39.  

    username = message.get(‘username‘)

  40.  

    passwd = message.get(‘passwd‘)

  41.  

    if (username,passwd) in allowed:

  42.  

    a = True

  43.  

    Time1=time.time()/60

  44.  

    raise web.seeother(‘/‘)

  45.  

    else:

  46.  

    return ‘<h1>Login Error!!!</h1></br><a href="/login">Login</a>‘

  47.  

  48.  

  49.  

    if __name__ == ‘__main__‘:

  50.  

    app.run()

我会在此说一下我对session.get()的理解,相信有很多人对此还不是很明白。首先,要知道的一点是session.get("logged_in",False)和session.get("logged_in",True)的含义。

session是用户请求得到页面时产生的,这个session是类似于字典的一个东西,大家可能会问,这个logged_in是从哪来的?实际上,这个logged_in根本不存在,换句话说,我把logged_in换成任何一个自己定义的变量都可以。

测试一下

a=session.get(‘logged_in‘,True)

print(a)

结果是True

a=session.get(‘logged_in‘,False)

print(a)

结果是False

通俗来讲session.get("logged_in",False)就是在session里面找logged_in,如果找不到就返回后面的参数。

  1. if express:

  2.  

    语句1

  3.  

    else:

  4.  

    语句2

我们可以想象成express=session.get("logged_in",False) ,session里找不到logged_in,所以返回False,

对于express=session.get("logged_in",True) 的解释大概相同,从session里面找logged_in, 不能找到,所以返回True。并执行语句1。

总的来讲,session.get(‘xxx‘,xxxx)有两个参数,第一个是表明在session中查找xxx,第二个参数为false/true,表明的是如果没找到,返回的默认值为False or True。

我们再来看一下,设置成if session.get("logged_in",False) :和设置成if session.get("logged_in",True) :的区别。

if session.get("logged_in",False) :

  1. a=session.get(‘logged_in‘,False)

  2.  

    class Index:

  3.  

    def GET(self):

  4.  

    global a

  5.  

    if a==False:

  6.  

    raise web.seeother(‘/login‘)

  7.  

    return ‘<h1>Login Success!!!</h1>‘

  8.  

    class Login:

  9.  

    def GET(self):

  10.  

    return render.login()

  11.  

    def POST(self):

  12.  

    global a

  13.  

    message = web.input()

  14.  

    username = message.get(‘username‘)

  15.  

    passwd = message.get(‘passwd‘)

  16.  

    if (username,passwd) in allowed:

  17.  

    a = True

  18.  

    raise web.seeother(‘/‘)

  19.  

    else:

  20.  

    return ‘<h1>Login Error!!!</h1></br><a href="/login">Login</a>‘

if session.get("logged_in",True) : 这种写法亲测有效,后文会讲一下如果发现错误的解决方式。

顺便提醒一句,raise web.seeother()是标准写法,raise一般是排除错误用的,返回错误信息。这里可以理解成返回了一个303异常。但是raise不是必须有的,我可以写成return web.seeother()或者前面啥都不写,直接web.seeother()都是可行的,但加上raise的写法是最标准的。

  1. a=session.get(‘logged_in‘,True)

  2.  

    class Index:

  3.  

    def GET(self):

  4.  

    global a

  5.  

    if a==True:

  6.  

    raise web.seeother(‘/login‘)

  7.  

    return ‘<h1>Login Success!!!</h1>‘

  8.  

    class Login:

  9.  

    def GET(self):

  10.  

    return render.login()

  11.  

    def POST(self):

  12.  

    global a

  13.  

    message = web.input()

  14.  

    username = message.get(‘username‘)

  15.  

    passwd = message.get(‘passwd‘)

  16.  

    if (username,passwd) in allowed:

  17.  

    a = False

  18.  

    raise web.seeother(‘/‘)

  19.  

    else:

  20.  

    return ‘<h1>Login Error!!!</h1></br><a href="/login">Login</a>‘

做到这步想再深入地研究一下,session是什么时候产生的呢?

session = web.session.Session(app, web.session.DiskStore(‘sessions‘))

这一步只能生成一个名叫sessions的文件夹

那么session是什么时候产生的?经检验,session是用户输入localhost:8080去get网页内容时产生的。并且输入一次localhost:8080,只能得到一个session文件,截图为证:

至于为什么get网站时会自动生成session的原理就希望大家百度解决了。

其实这里头的session没什么用,完全可以一开始设置a=False,通过改a的值实现网页跳转,session只有在里面存储值的时候才能发挥它真正的作用。比如存个用户名密码啥的。

还有一件事情要提一下吧,看上面的截图,你会发现总会有什么:

"HTTP/1.1 GET /favicon.ico" - 404 Not Found

可是index login html代码中也没有设置这个啊!这是从哪来的呢?看完这个解释你们可能不会觉得奇怪了,favicon.ico就是那个显示在你网页的title文字左面的那个小图片,比如CSDN左面的那个红白相间的图案C, 每次用户请求页面时,webpy都会自动查找有没有这个小图片。这个东西不是必须需要的,如果你自己想添加自行百度。

讲完了session,看一下我还用了python中的time模块,是为了让用户可以在1分钟内保持登录状态,不用重新输入用户名和密码。time.time()是获取1970年到现在的秒数,以秒为单位。

还有用cookie设置过期时间的方式。如下:(先设置一个过期时间为60s的cookie,获取这个cookie,如果这个cookie不存在,是获取不到的,用这个原理设置用于登录状态。)

  1. #!/usr/bin/env python

  2.  

    #coding=utf-8

  3.  

    import web

  4.  

    from web import form

  5.  

    import sqlite3

  6.  

    import time

  7.  

    urls = (

  8.  

    ‘/‘,‘Index‘,

  9.  

    ‘/login‘,‘Login‘,

  10.  

    )

  11.  

  12.  

    render = web.template.render("templates")

  13.  

    result=((‘admin‘,‘123123‘),(‘111111‘,‘111111‘),)

  14.  

    web.config.debug = False

  15.  

    app = web.application(urls, locals())

  16.  

    class Index:

  17.  

    def GET(self):

  18.  

    if web.cookies().get("hellocookie")==None:

  19.  

    raise web.seeother(‘/login‘)

  20.  

    else:

  21.  

    return ‘<h1>Login Success!!!</h1>‘

  22.  

    class Login:

  23.  

    def GET(self):

  24.  

    return render.login()

  25.  

    def POST(self):

  26.  

    message = web.input()

  27.  

    username = message.get(‘username‘)

  28.  

    passwd = message.get(‘passwd‘)

  29.  

    if (username,passwd) in result:

  30.  

    web.setcookie("hellocookie","",30)

  31.  

    raise web.seeother(‘/‘)

  32.  

    else:

  33.  

    return ‘<h1>Login Error!!!</h1></br><a href="/login">Login</a>‘

  34.  

  35.  

  36.  

    if __name__ == ‘__main__‘:

  37.  

    app.run()

然后附上index.html和login.html的代码。

index.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  2.  

    <html xmlns="http://www.w3.org/1999/xhtml">

  3.  

    <head>

  4.  

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  5.  

    <title></title>

  6.  

    </head>

  7.  

    <body>

  8.  

  9.  

    </body>

  10.  

    </html>

login.html

  1. <html>

  2.  

    <head>

  3.  

    <title></title>

  4.  

    </head>

  5.  

  6.  

    <h1>Login</h1>

  7.  

    <FORM method=POST>

  8.  

    <table id="login">

  9.  

    <tr>

  10.  

    <td>User: </td>

  11.  

    <td><input type=text name=‘username‘></td>

  12.  

    </tr>

  13.  

    <tr>

  14.  

    <td>Password: </td>

  15.  

    <td><input type="password" name=passwd></td>

  16.  

    </tr>

  17.  

    <tr>

  18.  

    <td></td>

  19.  

    <td><input type=submit></td>

  20.  

    </tr>

  21.  

    </table>

  22.  

    </form>

  23.  

    </html>

最后的最后,尽量不要复制上面的这些代码,因为很容易就会发生syntax error,因为本人为了简单也是反复复制了一些代码,tab和space混用,这些用眼睛看是看不出来的,但是一运行就标红,最好的解决办法是下载一个notepad++,点击“视图”——“显示符号”——“显示空格和制表符”,看到有不一样的空格改掉就好了

原文地址:https://www.cnblogs.com/browser/p/9385015.html

时间: 2024-11-04 02:07:05

py3 web.py转https://blog.csdn.net/weixin_42024288/article/details/80364441的相关文章

https://blog.csdn.net/u011489043/article/details/68488459

转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量 ??StringBuffer 字符串变量(线程安全) ??StringBuilder 字符串变量(非线程安全) ??简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因为String类的声明是:public final,因此在每次对 String 类型进行改变的时候其实都等同于生成了

如何相互转换逗号分隔的字符串和List --https://blog.csdn.net/yywusuoweile/article/details/50315377

如何相互转换逗号分隔的字符串和List ---https://blog.csdn.net/yywusuoweile/article/details/50315377 方法 2: 利用Guava的Joiner [java] view plain copy List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"

Consul+upsync+Nginx实现动态负载均衡 摘自https://blog.csdn.net/qq_29247945/article/details/80787014

传统感念:每次修改完nginx配置文件,要重启nginx 动态感念:每次修改完nginx配置信息,不需要重启,nginx实时读取配置信息. Nginx: 反向代理和负载均衡 Consul:是用go编写(谷歌),实现对动态负载均衡注册与发现功能 SpringCloud支持  Zookeeper.Eureka.Consul服务注册与发现. 服务注册:服务实现者可以通过HTTP API或DNS方式,将服务注册到Consul. 服务发现:服务消费者可以通过HTTP API或DNS方式,从Consul获取

操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481

当一个程序运行时,其RAM存储方式是按照一定的区域划分的,以C为例 内存中的栈区处于相对较高的地址向较低的地址拓展,由操作系统决定的最高地址,所以它是一块连续的内存空间. 栈中分配局部变量空间,堆区是低地址向高地址拓展,用于分配程序员申请的内存空间.另外还有静态区是分配静态变量,全局变量空间的:只读区是分配常量和程序代码空间的:以及其他一些分区. 栈: 栈是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在

https://blog.csdn.net/doegoo/article/details/50749817

因为使用DiscuzX3.2进行系统的整合后,因为只是想在原J2EE的系统上增加论坛功能,而且J2EE中已经有一套用户的注册认证的体系,所以不需要在Discuz的系统中去注册以及登录功能,而是通过在J2EE进行注册和登录使用单点登录的方式来完成论坛的注册与登录,这样使两个系统形成了一个整体.具体关于通过J2EE登录就完成论坛登录的单点登录过程请参见<J2EE与DiscuzX3.2的UCenter实现单点登录>,这里只是描述当完成以上功能过后,如何禁止,用户直接在Discuz论坛注册以及登录.

转-java编译时error: illegal character &#39;\ufeff&#39; 的解决办法-https://blog.csdn.net/t518vs20s/article/details/80833061

原文链接:https://blog.csdn.net/shixing_11/article/details/6976900 最近开发人员通过SVN提交了xxx.java文件,因发布时该包有问题需要回退,故SCM将该xxx.java文件用editplus打开删除了新添的一行,删除后重新编译打包,却报了如下异常: java:[1,0] illegal character: \65279 表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了

https://blog.csdn.net/the_liang/article/details/82708907

转自:https://blog.csdn.net/the_liang/article/details/82708907 Xmanager Power Suit 6.0.0109 最新版注册激活,长期更新以下方法基本上可以对最近版本适用,也就是说不需要我更新文章,你也可以通过以下方法尝试激活最新的版本!操作步骤 Xmanger Power Suit 官方 其实有两种 .exe 文件,一个是用于试用的,在注册的时候不能直接输入密钥.而另一个是为注册用户提供的 .exe 文件,在注册的时候可以输入密钥

https://blog.csdn.net/wang926454/article/details/82971442

https://blog.csdn.net/wang926454/article/details/82971442 https://github.com/dolyw/VueStudy 原文地址:https://www.cnblogs.com/leiqun123/p/12036600.html

每次换电脑 或者重装系统的时候有点麻烦转自别人的https://blog.csdn.net/u014722022/article/details/100170664

记录一下自己安装过程遇到的问题,也希望对大家有用~ 1.下载(官方推荐的是下载安装版本,但是解压版更便捷),下载地址: 2.解压,我们需要增加一步操作: (1)创建一个名为my.ini的文件,补充:之前建了data文件夹,但是后续安装报错,引以为戒: 3.修改my.ini文件: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir =