趣学python编程(七、实现个小网站如此简单 web.py使用介绍)

这里先拿一个小网站的例子来举例,保持好奇心就可以了。因为兴趣才是最好的老师,它能激发人内在的行动力。这里介绍个使用web.py轻量级框架实现的一个小网站,可以看到实现个小网站并不难。python都能用来干什么?那么网站就是它众多功能中的其中之一。

web.py框架介绍

正如其名,web.py 是一个采用 Python 作为开发语言的 Web 框架,简单且强大。俄罗斯排名第一的 Yandex 搜索引擎基于这个框架开发,Guido van Rossum 认为这是最好的 Python Web 框架。轻量小巧,作者是有名的计算机黑客亚伦·斯沃茨(Aaron Swartz),年少成名的计算机天才,著名社交网站Reddit联合创始人。

官网地址:https://webpy.org/

github地址:GitHub - webpy/webpy: web.py is a web framework for python that is as simple as it is powerful. 

web.py 遵循了简洁的设计原则,旨在帮助开发者快速构建 Web 应用程序。

以下是一些 web.py 框架的特点和优势:

1. 简洁的设计:web.py 的设计哲学是"做一件事并做好",它提供了一组简单而直观的工具和API,使开发变得简单明了。

2. 轻量级和快速:web.py 是一个轻量级的框架,没有过多的依赖,因此它非常快速且资源消耗较低。

3. URL 映射:web.py 使用简单的 URL 映射机制,使得处理不同 URL 请求变得非常容易。

4. 内置的模板引擎:web.py 内置了一个简单而强大的模板引擎,使开发者可以方便地将数据渲染到模板中。

5. 数据库支持:web.py 提供了对多种数据库的支持,包括 MySQL、PostgreSQL、SQLite 等,使开发者可以方便地与数据库进行交互。

6. RESTful 支持:web.py 对构建 RESTful API 提供了良好的支持,使开发者可以轻松地创建符合 RESTful 设计原则的 API。

7. 开放源代码:web.py 是一个开源框架,它的源代码可以在 GitHub 上找到,开发者可以自由地使用、修改和贡献代码。

总而言之,web.py 是一个简单而强大的 Python Web 框架,适用于构建小型到中型的 Web 应用程序。它注重简洁、高效和灵活性,使开发者能够更加专注于业务逻辑的实现。

web.py的使用 

最简单的网站

使用前需先下载安装web.py,可以执行pip install web.py安装即可。默认下载的是0.62版本的支持python3。

pip install web.py==0.62

一个最基本的 app.py 包含以下几点内容: 

#-*- coding: utf-8 -*-
# 文件名:app.py
import web

# 表明访问的URL,这里表示的是所有响应,均由 class 对象 index 来响应
# 注:/(.*) 代表的是正则匹配url后面的所有路径,也就是响应任何请求
urls = (
    '/(.*)', 'hello'
)
app = web.application(urls, globals())

# 表示 class 对象 index
# 传递参数:self,name(name指url路径/后面的内容)
class hello:
     # 响应GET请求(声明函数)
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, ' + name + '!'
    
# 当该.py文件被直接运行时,if __name__ == "__main__": 下的代码将被运行
# 当该.py文件作为模块被引入时,if __name__ == "__main__": 下的代码不会被运行
if __name__ == "__main__":
    app.run()

启动应用,它默认的服务地址是 http://127.0.0.1:8080/ ,接下来可以打开浏览器,在地址栏里访问下这个地址试试啦,看看输出结果。

python3 app.py

没错这就是一个小的web应用,只不过它特别的简单,没有什么实际的输出。跟网上你看到的大多数界面绚丽的网页差老远了,不过没关系,这只是基石,想要漂亮的网页界面,只需再编辑和完善下html页面,增加js和css的效果就能达到了。

如果要展示个网页,则可以稍加改动:

#-*- coding: utf-8 -*-
# 文件名:app.py
import web    # 引入web.py库

# 表明访问的URL,这里表示的是所有响应,均由 class 对象 index 来响应
# 注:/(.*) 代表的是正则匹配url后面的所有路径,也就是响应任何请求
urls = (
     '/(.*)', 'index'
)

# 声明一个名叫app的“应用”
app = web.application(urls, globals())

# 表示 class 对象 index
# 传递参数:self,name(name指url路径/后面的内容)
class index:
    # 响应GET请求(声明函数)
    def GET(self,name):
        # 使用只读,二进制方式打开文件,读取到变量 index_text 中
        index_text = open('index.html','rb').read()
        # 输出变量 index_text 内的内容,也就是 index.html 内的HTML代码
        return index_text

# 当该.py文件被直接运行时,if __name__ == "__main__": 下的代码将被运行
# 当该.py文件作为模块被引入时,if __name__ == "__main__": 下的代码不会被运行
if __name__ == "__main__":
    # 运行这个服务器
    app.run()

运行 app.py:则可以打开网页看看效果:

到这里,这个简易的web服务器就完成了,他的作用是访问时读取index.html的内容并输出index.html内的html代码到浏览器。为了便于测试,附带上一个测试的html文件,内容如下:

<!DOCTYPE html>
<html lang="utf-8">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
</head>
<body>
    <h1>Web.py 真不错啊</h1>
</body>
</html>

需要注意个问题,在 Python 中, open() 函数默认使用系统的默认编码来打开文件。具体的默认编码取决于操作系统和配置。在大多数情况下,Windows 系统的默认编码是 cp1252 ,而Unix/Linux 系统的默认编码是 utf-8 。 如果你想以特定的编码方式打开文件,可以在 open() 函数中指定 encoding 参数,例如:

index_text = open(abspath+'/index.html','r',encoding='UTF-8').read()

注意上述编码问题,否则会报:

 还需注意的是,在windwos下,指定路径需要用绝对路径,就是上面的那个 abspath+'/index.html.

如果你想用utf-8打开,则是这种:

open(file_name, 'r', encoding='UTF-8')

如果想用gbk编码方式打开,则是这种:

open(file_name, 'rb')

访问静态资源

访问静态资源和网页模板示例:

# encoding: utf-8
import web
import datetime
import os

urls = (
    '/', 'index',
    '/hello', 'hello',
    '/login', 'login',
    '/add', 'add',
    '/delete', 'delete',
    '/(js|css|images)/(.*)', 'static'
)

#获取当前文件路径
abspath = os.path.dirname(__file__) 
#引入模板文件
render = web.template.render(abspath+"/templates/")

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

#静态文件访问
class static:
    def GET(self, media, file):
        try:
            print(media+'/'+file)
            f = open(abspath+"/"+media+'/'+file, 'rb')
            return f.read()
        except:
             return '' # you can send an 404 error here if you want
    
#自定义数据
class MyData:
    def __init__(self, id, title):
        self.id = id
        self.title = title
             
class index:
    def GET(self):
        data = MyData(1,"洋洋")
        print(datetime.datetime.now())
        return render.index(data)

class login:
    def GET(self):
        print(datetime.datetime.now())
        return render.login()
       
class hello:
    def GET(self, name):
        if not name:
            name = 'World'
        return 'Hello, ' + name + '!'
    
class add:
    def POST(self):
        i = web.input()
        print(i)
        # print(datetime.datetime.now())
        raise web.seeother('/') 
    
class delete:
    def GET(self):
        print(web.ctx)
        t = int(web.ctx['query'][4 : : ])
        print(t)
        print(type(t))
        raise web.seeother('/')     
    
    
if __name__ == "__main__":
    web.config.debug = True
    app.run()

 网页模板index.html

$def with (data)
<div bordor="1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<h2 align="center" color="red">我的网站</h2>
    <table border="1" align="center">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>操作</th>
    </tr>
    <tr>
    <td> id="$data.id" </td>
    <td> $data.title </td>
    <td> <a href="/delete?id=$data.id" class="btn btn-danger btn-xs">删除</a> </td>
    </tr>
</table>
</div>
<form method="post" action="add">
<p><input type="text" name="title" /> <input type="submit" value="增加" /></p>
</form>

网页模板登录界面 login.html

$def with ()
<link rel="stylesheet" type="text/css" href="/css/login.css">
<form id="login" action="" method="POST">
<table align="left">
<tbody>
    <tr>
        <td><label for="username">帐号</label></td>
        <td><input type="text" id="username" name="username" /><span class="validate_tip"></span></td>
    </tr>
    <tr>
        <td><label for="password">密码</label></td>
        <td><input type="password" id="password" name="password" /><span class="validate_tip"></span></td>
    </tr>
    <tr>
        <td></td>
        <td><a href="/" id="find_password">返回首页</a></td>
    </tr>
    <tr><td><input type="submit" id="login_btn" value="登录" /></td></tr>
</tbody>
</table>
</form>

或许你觉得上面实现的网页都太粗糙不够漂亮。但是你知道世界上最早的互联网页长什么样吗?

历史上第一个网页的诞生

世界上第一个互联网网页是如何诞生的? 

世界上第一个互联网web网页诞生于1990年12月25日(次年8月对外开放),至今大约有28年的历史,它是由万维网之父蒂姆·伯纳斯·李(Tim Berners-Lee)与罗伯特·卡里奥在CERN(欧洲核子研究委员会)一起打造,首次成功通过因特尔网络实现HTTP代理与服务器通讯。而这次通讯成功,标志着互联网的到来,具有划时代的意义。

这么多年过去了,如今互联网飞速发展,各种网页设计美轮美奂,已不再是简单的文字或者文档,而是成为一个又一个生活与工作的平台,与人们的生活产生各种交集,可以说它无处不在。

近年来移动互联网更是发展迅猛,手机成为了人们生活中的必备品,网页也随之发生了变化,更加注重交互与体验。在此之前,许多人认为网页就是互联网,或者互联网就是网页,但移动互联网的普及,让人们更加感受到互联网是一个拥有无限可能的工具。

蒂姆 伯纳斯-李(Tim Berners-Lee)是第一个使用超文本来分享资讯,及于1990年发明了首个网页浏览器--WorldWideWeb的人。在1991年3月,他把这发明介绍给了给他在CERN工作的朋友。 从那时起,浏览器的发展就和网络的发展联系在了一起。蒂姆?伯纳斯-李建立的第一个网站(也是世界上第一个网站)是http://info.cern.ch/,它于1991年8月6日上网,它解释了万维网是什么,如何使用网页浏览器和如何建立一个网页服务器等等。蒂姆?伯纳斯-李后来在这个网站里列举了其它网站,因此它也是世界上第一个万维网目录。

1994年12月,Netscape Navigator发布1.0版浏览器。这个版本支持所有的 HTML2 语言的元素和部分 HTML3 语言的功能。不过,在浏览器的发展史上,在Netscape浏览器之前,Mosaic浏览器就已经诞生了,事实上, Mosaic 并不是第一个具有图形界面的网页浏览器,但是, Mosaic 是第一个被人普遍接受的浏览器,它让许多人了解了Internet 。

更多关于互联网的介绍,参见这个链接:历史上第一个网页长这样 - 知乎

你可以在http://info.cern.ch/访问最早的网页,最早的网页长这样:

亚伦·斯沃茨的故事

讲一个web.py的作者亚伦·斯沃茨的故事,因为比较励志和有趣,这里分享下,希望你能受用。

1986年11月18日,施瓦茨出生于芝加哥,父亲是一名软件工程师,母亲是一位艺术家。一出生家里就已经有最早的Mac,从小施瓦茨学习能力就很强,加之父亲的影响,施瓦茨很小的时候就已经学会编程。 

12岁的时候,自己就建立了一个网站,叫get.info (The info.org)是一个免费的线上百科全书。所有人都可以在网站上新增、编辑内容,当时,施瓦茨在做这个网站的时候,维基百科还没出现呢。在13岁的时候,Swartz获得了ArsDigita奖。

因为这个网站的关系,14 岁的施瓦茨得以参与 RSS 规格(一种消息来源格式规范,用以聚合经常发布更新数据的网站,例如博客文章、新闻、音频或视频的网摘。)的开发而声名鹊起。

2004年,施瓦茨考入斯坦福大学,可惜的是,第二年就退学了。退学后创办了著名的Reddit社交新闻网站。亚伦·施瓦茨的生平事迹,在2014年曾被导演耐本伯格拍成了纪录片《互联网之子》 。

Aaron说的一句话挺让人感触——

相信你应该真的每时每刻都问自己,现在这世界有什么最重要的事是我能参与去做的?

提高效率的秘诀

如果你没在做那最重要的事,那又是为什么?

很早之前他分享过一篇文章,叫做《提高效率的秘诀》。

写的很不错,读完受益匪浅,这里分享下:

肯定有人跟你说过这样的话,“你有看电视的那么长时间,都可以用来写一本书了”。不可否认写书肯定比看电视更好的利用了时间,但是这个结论的成立需要一个假设:“时间是可互换的”,也就是说看电视的时间可以轻松的用来写书。但是很遗憾,事实并非如此。

不同的时间有不同的质量等级。如果我在走向地铁站的路上发现自己的笔记本忘带了,我就很难集中注意力写文章。同样,当你不停的被打断的时候,你也很难集中注意力。这里还有一些心理和情感上的因素,有的时候我心情很好,愿意主动去做一些事,但还有一些时候我感到很抑郁和疲惫,就只能看看电视了。

如果你想变得更加有效率,你必须意识到这个事实,并且很好的处理它。首先,你必须很好的利用不同种类的时间。其次,你必须让你的时间更有效率。

更有效地利用你的时间

选择合适的事

生命是如此的短暂,为什么浪费时间做一些没意义的事呢?做一些让你感到舒适的事很容易,但是你应该问问自己为什么要做这些事呢?有没有一些更重要的事等着你去做?为什么你不去做那些事呢?这些问题很难回答,但是每解决一个都会让你更有效率。

这不是说你所有的时间都应该用来做那些最重要的事。我的时间就肯定不是这样(否则,我现在就不会在写这篇文章了)。但是,这是我衡量自己的生活是否充实的重要标准。

收集很多的事

另一个很多人都知道的秘密是:如果你认准一个问题,投入全部精力去解决它,这样你的效率是最高的。我发现这却是很难实现的。以现在为例,我正在锻炼身体,喝橙汁,整理桌面,和我弟弟聊天,同时在写现在这篇文章。今天一整天,我写了现在这篇文章,读了一本书,吃了点东西,回复了几封邮件,和一些朋友聊了聊天,买了点东西,改了改其他几篇文章,备份了硬盘,还整理了一下图书列表。

有很多不同的项目让我能够在不同质量的时间下做不同的工作。更重要的是,在你卡壳或是厌烦的时候有其他的一些事可以做。

这同时会让你变得更加有创造力。创造力就是你把自己从其他地方学到的东西能够用到你的工作中。如果你同时做许多不同方向的工作,那你就会得到更多的想法和创意。

列一个清单

找一些不同的事同时做并不困难,大部分人都有很多很多的待办事项。但是如果你想把它们全记在脑袋里的话,它们就会慢慢消失。要记住所有这些事所给你带来的心智上的压力会把你压垮。解决办法仍然是很简单:把它们写下来。

一旦你把要做的事列成了一个清单,你就可以更好的分类组织它们了。比如说,我的清单包括:编程,思考,差事,读书,娱乐休息。

大部分项目都包括很多不同的任务。以写这篇文章为例,除了真正的写作过程,还包括了阅读其他关于拖沓的文章,考虑文章的各个部分,整理语句,向别人请教问题等等。每一项任务都属于清单的不同部分,所以你可以在合适的时间才去做某一部分。

把任务清单和你的生活结合起来

一旦你有了这样一个任务清单,你需要做的事就是时常记得它,而记住它的最好方法是把它放在你能看到的地方。比如说,我总在我桌子上放一摞书,最上面的那一本就是我最近在读的。当我想要读书的时候,我就直接从上面拿一本书来读。

对于看电视/电影我也这么做。当我对某一个电影感兴趣的时候,我会把它放在电脑中一个特殊的文件夹内。每当我想休息一下,看看电影的时候,我就会打开那个文件夹。

我也想过一些更深入的方式,比如说我把一些想看的文章标记为“待读”,当我想要上网的时候就看看那些从前积累下来的未读文章。

提高你时间的质量

像上面那样最大限度地利用时间还远远不够,更重要的是提高你自己的时间的质量。那你究竟该怎样做呢?

避免被打扰

对于那些需要集中注意力的任务,你应该尽量避免被打扰。一个很简单的方法是去一个没人能打扰你的地方,另一个方法是告诉周围的人未来一段时间不要打扰你。关于这点不要过犹不及。当你在浪费时间的时候你反倒应该被打扰一下,帮助别人解决问题肯定比坐在那里看新闻更好的利用了时间。

减轻心理上的约束

吃,睡,运动:当你感到很饿,很累,很焦躁的时候,你的时间的质量会很低。解决这个问题很简单,就是:去吃,去睡,去运动。对自己说“虽然我很累了,但我不能休息,因为我必须要工作”会让你感到自己很努力,但事实上休息之后你的效率会更高。既然你迟早都要睡觉,还不如先休息好,来提高剩余时间内的效率。

与快乐的人相处

跟快乐的人相处会也会让你变得快乐,也会让你心态更放松。也许很多人愿意躲在屋子里,不与其他人接触,埋头干活,他们觉得这样的话时间才没有被“浪费”,但事实上这会让他们变得情绪低落,工作效率也会大大下降。 

拖沓

上面所说的那些并不是问题的重点,关于效率大家最大的问题还是“拖沓”。虽然很多人不承认,但是几乎所有人都或多或少的会拖沓。那又该如何避免呢?

拖沓是什么?从旁观者来看,你在做好玩的事(如玩游戏,看新闻)而不是做真正的工作。但问题的关键是:你究竟为什么会这样?你的脑子里究竟是怎么想的?

我花了很多时间来研究这件事,我能给出的最好解释是在大脑会给每一项任务赋予一个“脑力场”。你玩过两块磁铁相互作用吗?如果你让它们同极相对,它们就会相互排斥,你会感到他们之间的磁场力。你越是想要把它们和在一起,越会感到它们之间的排斥力。

心智和精神上也是类似的。它是看不见摸不着的,但你却可以感受到它的存在。并且你越是想要接近它,它会离你越远。

你不可能通过蛮力来克服两个场之间的排斥力,相反,你应该做的是调转方向。

那又是什么产生了“精神力场”呢?似乎有两个主要原因:任务是否艰巨,任务是否是被指派的。

艰巨的任务

把任务细分

一个任务很艰巨的原因之一是这个任务很宏大。比如说你想要做一个菜谱构造程序,没有人能一下子完成它,这是一个目标而不是一项任务。一项任务是使你能够朝向目标更进一步的具体概念。一个好的任务是你能够立即拿来实施的,比如“画一个展示菜谱的草图”。

当你完成了上一个任务后,下一步就会变得更加清晰。你将会考虑一个菜谱有什么构成,你需要什么样的搜索机制,如何构建菜谱的数据库,等等。这样你就构建了一个引擎,每一个任务都会通向下一个任务。

对于每一个比较大的项目,我都会考虑我需要完成一连串什么样的任务,并且将这些任务加入到我的待办事项列表中去。同样,当我做完一些任务之后我会把接下来需要完成的任务再加入任务列表中去。

简化任务

另一个让任务变得艰巨的原因就是它太复杂了。“写一本书”这个任务会放你感到无从下手,那么就先从写一篇文章开始吧。如果一篇文章也觉得太多了,那么就先写一个段落的概要吧。最重要的是真正做了一些工作,真正的有进展。

一旦你明确了你的任务之后,你就可以更清楚的判断它,更容易的理解它。提高完善一些已有的东西比从头创建东西更容易。如果你的一个段落写好了,那么一点一点积累,它会变成一篇文章,最终变成一本书。

认真考虑它

通常来说解决一个困难问题需要一些灵感。如果你对那个领域并不熟悉,你应该从研究这个领域开始,借鉴一下其他人的经验,慢慢的研究理解这个领域,并且做一些小的尝试看看你能否搞定这个领域。

被指派的任务

被指派的任务是那些你被要求完成的任务。很多心理学实验都表明:当你“刺激”其他人做什么事的时候,他们反倒不容易做好那个事。奖励,惩罚等外部刺激会扼杀“内在动机”——你对于某个问题发自内心的兴趣。人类的大脑对于被要求做的事有先天的抗拒力。
这种现象不仅局限于其他人要求你做的事,当你向自己分配任务时仍然会出现这种现象。如果你对自己说“我应该好好做X工作了,这是我现在最重要的事”,之后你就会感到X突然变成了世界上最困难的事情了。然而一旦当Y变成了“最重要的事”,原来的那个X又变得简单了。

虚构一个任务

如果你要完成X,那就告诉自己做Y。然而不幸的是,这样欺骗自己却很难,因为你清楚你究竟要做什么。

不要自己给自己布置任务

给自己布置任务看起来很诱人,比如对自己说“我要写完这篇文章才去吃饭”,更糟糕的是让别人假装布置给你一些任务。但是这两种方式都会让你变得更没有效率,事实上你还是在给自己布置任务,你的大脑只会去逃避它。

把事情变得有趣

困难的工作听起来不会令人感到愉悦,但事实上这可能就是最能让我感到高兴的事。一个困难的问题不但能让你集中全部注意力,而且当你完成它的时候你会感到非常棒,非常有成就感。

所以帮助自己完成一件事的秘密不是说服自己必须完成它,而是说服自己这件事确实非常有意思。如果一件事没有意思的话,你需要做的就是让它变得有意思。

总结

效率的真正秘密在于“聆听自己”,在你饿的时候吃饭,在你疲惫的时候睡觉,当你厌烦的时候休息一下,做那些有趣好玩的项目。

这看起来很容易,但是社会上的一些观念正在把我们向相反的方向引导。要想变得更加有效率,我们需要做的就是转过头来“聆听自己”。

其他资源

https://webpy.org/

超详细教程:如何用Python开发你的网站(一) - 知乎

python - UnicodeDecodeError:'gbk' codec can't decode byte 0x80 in position 0 illegal multibyte sequence - Stack Overflow

互联网网页(世界上第一个互联网网页是如何诞生的?)-Tech时代

历史上第一个网页长这样 - 知乎

看看二十年前的网页,追溯互联网的记忆-生活故事-回忆网 

回顾历史:1969年10月29日22点30分 互联网诞生

猜你喜欢

转载自blog.csdn.net/qq8864/article/details/134523232
今日推荐