前言

书中使用的是python3,我这里使用的是python2.7

Web 的目录树

webapp/
├── cgi-bin
│ ├── athletelist.py
│ ├── athletemodel.py
│ ├── generate_list.py
│ └── yate.py
├── coach.css
├── data
│ ├── james.txt
│ ├── julie.txt
│ ├── mikey.txt
│ └── sarah.txt
├── favicon.ico
├── images
│ └── coach-head.jpg
├── index.html
├── simplehttp.py
└── templates
│ ├── footer.html
│ └── header.html

整体的功能

整体的功能是创建一个网站,index.html中有个链接,链接到cgi-bin下的generate_list.py,这个cgi脚本自动生成html代码。

Python启动本地web服务器

由于书中使用的是python3的代码,所以自己在网上找了python2.7的代码

simplehttp.py

 import BaseHTTPServer, CGIHTTPServer

 port = 8080

 httpd = BaseHTTPServer.HTTPServer(('', port), CGIHTTPServer.CGIHTTPRequestHandler)
print ('starting simple_httpd on port :' + str(httpd.server_port))
httpd.serve_forever()

开启web服务,只需要用cmd进入自己网站所在的文件夹,python simplehttp.py 就可以了。本地服务器地址是localhost:8080

index.html

 <html>
<head>
<title>Welcome to Coach Kelly's Website</title>
<link type="text/css" rel="stylesheet" href="coach.css" />
</head>
<body>
<img src="data:images/coach-head.jpg">
<h1>Welcome to Coach Kelly's Website.</h1>
<p>
For now, all that you'll find here is my athlete's <a href="cgi-bin/generate_list.py">timing data</a>. Enjoy!
</p>
<p>
<strong>See you on the track!</strong>
</p>
</body>
</html>

效果图如下

主页中的timing data链接到generate_list.py文件,在上面开启web服务的py文件执行后,timing data链接下的py会执行

generate_list.py

这是个自动生成html代码的py

 import athletemodel
import yate
import glob data_files=glob.glob ("data/*.txt")
athletes=athletemodel.put_to_store(data_files)
print (yate.start_response())
print(yate.include_header("Coach Kelly's List of Athletes"))
print (yate.start_form("generate_timing_date.py"))
print (yate.para("Select an athlete from the list to work with:"))
for each_athlete in athletes :
print(yate.radio_button("which_athlete",athletes[each_athlete].name))
print (yate.end_form("Select")) print (yate.include_footer({"Home":"/index.html"}))

print (yate.include_footer({“Home”:”/index.html”}))
这里生成的html是

<p>
<a href="/index.html">Home</a>&nbsp;&nbsp;&nbsp;&nbsp;
</p>

很奇怪按照常理相对路径应该是../index.html,在自己电脑上测试时,打开网页,a href=”/index.html” 这种是错误的,但是用python建立web服务后,这种方式也能返回主页,很奇怪。

效果图如下

yate.py

from string import Template

def start_response(resp="text/html"):
return('Content-type: ' + resp + '\n\n') def include_header(the_title): with open('templates/header.html') as headf:
head_text = headf.read()
header = Template(head_text)
return(header.substitute(title=the_title)) def include_footer(the_links): with open('templates/footer.html') as footf:
foot_text = footf.read()
link_string = ''
for key in the_links:
link_string += '<a href="' + the_links[key] + '">' + key + '</a>&nbsp;&nbsp;&nbsp;&nbsp;'
footer = Template(foot_text)
return(footer.substitute(links=link_string)) def start_form(the_url, form_type="POST"):
return('<form action="' + the_url + '" method="' + form_type + '">') def end_form(submit_msg="Submit"):
return('<p></p><input type=submit value="' + submit_msg + '"></form>') def radio_button(rb_name, rb_value):
return('<input type="radio" name="' + rb_name +
'" value="' + rb_value + '"> ' + rb_value + '<br />') def u_list(items):
u_string = '<ul>'
for item in items:
u_string += '<li>' + item + '</li>'
u_string += '</ul>'
return(u_string) def header(header_text, header_level=2):
return('<h' + str(header_level) + '>' + header_text +
'</h' + str(header_level) + '>') def para(para_text):
return('<p>' + para_text + '</p>')

分析

yate.py文件是放在cgi-bin文件下的,但是所使用的模版template是cgi-bin的父目录下,所以单独测试generate_list.py的时候,会出现找不到模版的情况,但是在web服务下通过点击timing data的链接时, generate_list.py却可以正常运行。

我自作聪明地把 yate.py的open代码改成了
with open(‘../templates/header.html’) as headf:
这样测试generate_list.py的时候,没有IOError,能够找到templates下的模版,但是在服务器上,运行时,这段代码却有问题,找不到模版文件,暂时还不知道是什么原因,我对服务器执行cgi脚本的知识了解得还太少。

后来找到的一个暂时的解决方案,是把yate.py里打开模版的路径换成绝对路径,这样generate_list.py单独测试时,能够正常生成html代码,而且在服务器上打开也能够正常执行。


根据我自己的推断,在web上执行.py文件,虽然py文件在cgi-bin文件夹下,但是它的根目录应该是网站的根目录(cgi-bin的父目录),即这里的webapp文件夹,所以.py文件里编写是路径是“template/”,不需要返回上一级目录。athletes.pickle的生成的位置就是一个很好的证据。

绝对路径的问题可以看看这个链接
python 3.2之后把IOError 替换成了FileNotFoundError
http://blog.csdn.net/yangting09032214/article/details/46785693

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

head first python /chapter7 web(python 3 转 python 2.7)的更多相关文章

  1. Python Flask Web 框架入门

    Python Flask 目录 本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/ 一.简介 二.安装 三.初始化Flask 四.获 ...

  2. Python 学习笔记(八)Python列表(二)

    列表函数 追加和扩展 list.append() 在列表末尾追加新的对象 >>> dir(list) #dir 查看列表的函数 ['__add__', '__class__', '_ ...

  3. Python之Web框架Django

    Python之Web框架: Django 一. Django Django是一个卓越的新一代Web框架 Django的处理流程 1. 下载地址  Python 下载地址:https://www.pyt ...

  4. Python之Web框架

    Python之Web框架: 一.  Web框架的本质: 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env pyth ...

  5. Python之Web前端jQuery扩展

    Python之Web前端: 一. jQuery表单验证 二. jQuery扩展 三. 滚动菜单 一. jQuery表单验证: 任何可以交互的站点都有输入表单,只要有可能,就应该对用户输入的数据进行验证 ...

  6. Python之Web前端Dom, jQuery

    Python之Web前端: Dom   jQuery ###Dom 一. 什么是Dom? 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它 ...

  7. python 实现web框架simfish

    python 实现web框架simfish 本文主要记录本人利用python实现web框架simfish的过程.源码github地址:simfish WSGI HTTP Server wsgi模块提供 ...

  8. Python之Web框架们

    Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip i ...

  9. 关于Python的web框架

    uliwebhttp://git.oschina.net/limodou/uliweb uliweb 吸取了其他框架的经验,集成了orm.总的来说一般.这个安装后有个exe文件,命令行工具.不绿色.个 ...

随机推荐

  1. Python中文GBK编码解决实例

    http://eatsalt.blog.163.com/blog/static/879402662009420508748/ #coding:gbk l=['我'.decode('gbk'),'我'. ...

  2. 核函数以及SVM相关知识(重点)

    http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988406.html http://blog.pluskid.org/?p=685 考虑我们 ...

  3. js实现动态删除表格的行或者列-------Day57

    昨天记录了动态加入表格的一行,当然这个一行是指一行数据,也就是说一行多少列也是加上的,而且第几列的内容都能够加入上,先来回想下它的实现的关键点: 1.var row=table.insertRow() ...

  4. Eclipse中git插件导入远程库和上传项目源代码到远程库

    陆陆续续,从github,csdn的code.之前实习的小公司也是用git管理.发如今版本号控制方面确实比較方便.代码一敲完 . 自己由于完毕了新功能.加入一个新分支.然后提交上去,这就是程序猿一天干 ...

  5. Deepin-安装vscode

    安装方式有两种: 1.通过命令安装 sudo apt-get install vscode 2.通过deb或rpm包安装 我们是Debian系列的系统,所以用deb包,关于红帽系统,请使用rpm包. ...

  6. 【转】实现LoadRunner多个场景的顺序执行

    应用场景假设有3个不同的测试场景,分别为并发登录.核心业务.可靠性测试,3个场景有先后执行顺序.由于白天测试机器另有用处,只能在晚上进行性能测试,这时我们的期望是能否把测试场景都设定好之后晚上自动运行 ...

  7. C++语言笔记系列之二十——模版

    1.随意输入两个数x和y,输出最大值max. int max(int x, int y) {return x>y? x:y;} 2.函数模版 (1)用一种或者多种通用类型去表示函数--函数模版. ...

  8. leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  9. 2016/3/31 ①全选时 下面选项全选中 ② 下面不选中时 全选取消 ③在“” 中 转义字符的使用\ onclick=\"Checkpa(this,'flall')\"; ④区别于分别实现 重点在于两种情况合并实现

    testxuanbuxuan.php <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  10. YTU 2864: 分跑道。

    2864: 分跑道. 时间限制: 1 Sec  内存限制: 128 MB 提交: 23  解决: 19 题目描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原 ...