Head First Python Web开发

本文是对《Head First Python》第7章 Web开发 的简单总结以及其中重要知识点的扩展介绍。

记笔记记笔记ing…

CGI

通用网关接口(Common Gateway Interface, CGI)是一种重要的互联网技术。
CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。(CGI程序:符合CGI标准的程序)

CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。

另外,编程语言Perl是一个广泛被用来编写CGI程序的语言,但CGI的一个目的是要独立于任何语言的。Web服务器无须在这个问题上对语言有任何了解。事实上,CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。除Perl外,像Unix shell script, Python, Ruby, PHP, Tcl, C/C++,和Visual Basic都可以用来编写CGI程序。

MVC

模型-视图-控制器(Model-View-Controller, MVC)是一种框架模式(非设计模式)。
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。

  • 模型:存储(以及有时处理)Web应用数据的代码。通常模型对象负责在数据库中存取数据。
  • 视图:格式化和显示Web应用用户界面的代码。通常视图是依据模型数据创建的。
  • 控制器:将Web应用“粘合”在一起并提供业务逻辑的代码。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

这里有一个通过 JavaScript 所实现的一个基础 MVC 模型,请注意的是:MVC 不是一种技术,仅是一种理念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 模拟 Model, View, Controller
var M = {}, V = {}, C = {};

// Model 负责存放资料
M.data = "hello world";

// View 负责将资料输出到屏幕上
V.render = function (M) { alert(M.data); }

// Controller 作为一个 M 和 V 的桥梁
C.handleOnload = function () { V.render(M); }

// 在网页读取的时候呼叫 Controller
window.onload = C.handleOnload;


Python Pickle

Python标准库的pickle模块可以容易而高效地将Python数据对象保存到磁盘以及从磁盘恢复。

Python的pickle模块实现了基本的数据序列和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,持久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

pickle模块使用的数据格式是Python专用的,并且不同版本不向后兼容,同时也不能被其他语言所识别。(不同于关系数据库,这种方式恰恰满足了面向对象的封装性原则——即对象的数据只能通过这个对象自身的public接口来访问)

  • pickle.dump()函数将数据保存到磁盘
1
2
3
4
import pickle
...
with open('mydata.pickle', 'wb') as mysavedata:
pickle.dump([1, 2, 'three'], mysavedata)
  • pickle.load()函数从磁盘恢复数据
1
2
3
4
5
import pickle
...
with open('mydata.pickle', 'rb') as myrestoredata:
a_list = pickle.load(myrestoredata)
print(a_list)


用Python构建Web服务器

Python标准库http.server模块可以用来在Python中建立一个简单的Web服务器。

1
2
3
4
5
6
from http.server import HTTPServer, CGIHTTPRequestHandler # 导入HTTP服务器和CGI模块

port = 8080 # 指定一个端口
httpd = HTTPServer(('', port), CGIHTTPRequestHandler) # 创建一个HTTP服务器
print('Starting simple_httpd on port: ' + str(httpd.server_port))
httpd.serve_forever() # 启动服务器


Python Template类

Python标准库string模块包括一个名为Template的类,它支持简单的字符串替换
$substitute(mapping, kwds)$

$safe_substitute(mapping,
kwds)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'


使用Python的CGI模块来访问表单数据

Python标准库CGI模块对编写CGI脚本提供了支持,可以使用cgi.FieldStorage()访问作为Web请求一部分发送给Web服务器的数据,数据将作为一个Python字典。

1
2
3
4
import cgi
form_data = cgi.FieldStorage()
# name = 'which_athlete'
athlete_name = form_data['which_athlete'].value # 从表单数据访问一个指定的数据


启用CGI跟踪来帮助解决错误

CGI标准指出服务器端程序(CGI脚本)生成的任何输出都会由Web服务器捕获并发送到等待的Web浏览器。具体来说,会捕获发送到STDOUT(标准输出)的所有内容。

当CGI脚本产生异常时,Python将把错误消息显示在STDERR(标准错误输出)上。CGI机制会忽略这个输出,因为它想要的只是CGI脚本的标准输出。

令人欣喜的是,Python的标准库提供了一个CGI跟踪模块(cgitb),启用模块时,会在Web浏览器上显示详细的错误消息

1
2
import cgitb
cgitb.enable() # 打开cgi跟踪


使用Python的glob模块处理文件名列表

Python标准库glob模块非常适合处理文件名列表,用它可以查找符合特定规则的文件路径名。类似windows下的文件搜索功能。

glob查找文件只用到三个匹配符:”*“, “?”, “[]”:

  • “*” 匹配0个或多个字符
  • “?” 匹配单个字符
  • “[]” 匹配指定范围内的字符

$glob.glob(pathname)$ pathname can be either absolute or relative

1
2
3
4
5
6
>>> import glob
>>> files = glob.glob(r"E:/*.txt")
>>> files
['E:/apekk Lisk.txt', 'E:/apr License.txt', 'E:/Changelog-pre1.8.txt', 'E:/Changelog.txt', 'E:/githelp.txt', 'E:/TortoiseGit License.txt']
>>> type(files)
<class 'list'>

$glob.iglob(pathname)$ pathname can be either absolute or relative

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> import glob
>>> files = glob.iglob(r"E:/*.txt")
>>> files
<generator object iglob at 0x000000000319C3A8>
>>> type(files)
<class 'generator'>
>>> for file in files:
print(file)
E:/apekk Lisk.txt
E:/apr License.txt
E:/Changelog-pre1.8.txt
E:/Changelog.txt
E:/githelp.txt
E:/TortoiseGit License.txt

官方文档里是这样描述 $iglob$ 与 $glob$ 的区别的: iglob() return an iterator which yields the same values as glob() without actually storing them all simultaneously.
已经说得很明白了所以不再赘述。

完。

如果您觉得这篇博文对您有所帮助,可以考虑请我吃颗糖哦!