Python开发一个服务器很方便,模块封装的很好。写了个简易网站。
说一下大体思路。首先,写个5行的服务器启动,默认打开index.html。在首页中作超链接跳转,到脚本上。在脚本中现将数据打包(也可以理解为将数据从库中提取出来),然后写出网页,并设定好表单等元素。用户点击,进入下一个脚本......
整体来说,通常采用MCV架构:
模型(Module):存储(以及有时处理Web应用数据的代码
视图(View):格式化和显示Web应用用户界面的代码
控制器(Controller):将Web应用”粘合“在一起并提供业务逻辑
M 为数据建模
Web服务器需要一个存储数据的副本。当Web应用启动时,需要把文件中的信息读出来。这里是一个打包好的Pickle,也可能是在程序启动时,搜集相应的文件打的包,因为可能要下发到本地。
小例子没使用数据库,使用pickle即可,注意I/O异常检测。
V 查看界面
使用First Head 书中带的yate.py来生成html。估计应该有其他更NB的PiPy。
C 控制代码
推荐采用以下结构:
WebApp:顶层文件夹是程序的名字,除了子文件夹,还包括web应用的index.html文件,图标,样式表等不适合放在其子文件夹中的内容。
cgi-bin:为Web应用写的所有代码需要放在这里。
data:所有数据在这里
image:如果有必要就创建一个这个文件,将图标、图片放在里面
templates:一些套用的模板
构建服务器必须的信息代码:
from http.server import HTTPServer,CGIHTTPRequestHandler port = 8080 httpd = HTTPServer(('',port),CGIHTTPRequestHandler) #创建一个服务器 print("Strating simpleHttpd on port: "+str(httpd.server_port)) httpd.serve_forever() #弹出提示并启动服务器
运行这个文件(命令为 python.exe XXX.py),则在访问相应端口时就会启动本层文件中的index.html。如果没有则显示层级文件。所以运行这几行代码就完成了服务器的架设了。
操作的跳转则在html中做。例如:超链接<a href=/blog_article/"cgi-bin/generate_list.py">timing data</a>
这样就运行相应的脚本了。
文件操作:glob
查询一个文件列表:data_fales = glob.glob("../data/*.txt")
网页相关的库:cgi
获取表单数据:数据将作为一个字典返回
cgi.FieldStorate() athlete_name = form_data['which_athlete'].value
开启调试:使用cgitb可以将崩溃问题显示到网页上。
import cgitb cgitb.enable()
将类方法表现为属性:@property
当类中的方法上用@property修饰时,这个类方法表现为一个属性。即使用"."来直接使用,而不用再加括号。
标准库string中包括一个名为Template的类,它支持简单的字符串替换:
with open('../templates/header.html') as headf: head_text = headf.read() header = Template(head_text) return(header.substitute(title=the_title))
关于fdisk -l 一些数值的说明;
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
这个硬盘是80G的,有255个磁面;63个扇区;9729个磁柱;每个 cylinder(磁柱)的容量是 8225280 bytes=8225.280 K(约为)=8.225280M(约为);
分区序列 引导 开始 终止 容量 分区类型ID 分区类型
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
说明: 硬盘分区的表示:在Linux 是通过hd*x 或 sd*x 表示的,其中 * 表示的是a、b、c ... ... x表示的数字 1、2、3 ... ... hd大多是IDE硬盘;sd大多是SCSI或移动存储;
引导(Boot):表示引导分区,在上面的例子中 hda1 是引导分区;活动分区active
Start (开始):表示的一个分区从X cylinder(磁柱)开始;
End (结束):表示一个分区到 Y cylinder(磁柱)结束;
id和System 表示的是一个意思,通过指定id来确认分区类型;比如 7表示的就NTFS 分区;
Blocks(容量):是容量的意思,其单位是K;一个分区容量的值是由下面的公式而来的; Blocks = (相应分区End数值 - 相应分区Start数值)x 单位cylinder(磁柱)的容量 所以我们算一下 hda1的 Blocks 的大小: hda1 Blocks=(765-1)x8225.280=6284113.92 K = 6284.113.92M
关于fdisk -l 一些数值的说明;
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
这个硬盘是80G的,有255个磁面;63个扇区;9729个磁柱;每个 cylinder(磁柱)的容量是 8225280 bytes=8225.280 K(约为)=8.225280M(约为);
分区序列 引导 开始 终止 容量 分区类型ID 分区类型
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
说明: 硬盘分区的表示:在Linux 是通过hd*x 或 sd*x 表示的,其中 * 表示的是a、b、c ... ... x表示的数字 1、2、3 ... ... hd大多是IDE硬盘;sd大多是SCSI或移动存储;
引导(Boot):表示引导分区,在上面的例子中 hda1 是引导分区;活动分区active
Start (开始):表示的一个分区从X cylinder(磁柱)开始;
End (结束):表示一个分区到 Y cylinder(磁柱)结束;
id和System 表示的是一个意思,通过指定id来确认分区类型;比如 7表示的就NTFS 分区;
Blocks(容量):是容量的意思,其单位是K;一个分区容量的值是由下面的公式而来的; Blocks = (相应分区End数值 - 相应分区Start数值)x 单位cylinder(磁柱)的容量 所以我们算一下 hda1的 Blocks 的大小: hda1 Blocks=(765-1)x8225.280=6284113.92 K = 6284.113.92M