head first python /chapter7 web(python 3 转 python 2.7)
前言
书中使用的是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>
</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> '
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)的更多相关文章
- Python Flask Web 框架入门
Python Flask 目录 本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/ 一.简介 二.安装 三.初始化Flask 四.获 ...
- Python 学习笔记(八)Python列表(二)
列表函数 追加和扩展 list.append() 在列表末尾追加新的对象 >>> dir(list) #dir 查看列表的函数 ['__add__', '__class__', '_ ...
- Python之Web框架Django
Python之Web框架: Django 一. Django Django是一个卓越的新一代Web框架 Django的处理流程 1. 下载地址 Python 下载地址:https://www.pyt ...
- Python之Web框架
Python之Web框架: 一. Web框架的本质: 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env pyth ...
- Python之Web前端jQuery扩展
Python之Web前端: 一. jQuery表单验证 二. jQuery扩展 三. 滚动菜单 一. jQuery表单验证: 任何可以交互的站点都有输入表单,只要有可能,就应该对用户输入的数据进行验证 ...
- Python之Web前端Dom, jQuery
Python之Web前端: Dom jQuery ###Dom 一. 什么是Dom? 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它 ...
- python 实现web框架simfish
python 实现web框架simfish 本文主要记录本人利用python实现web框架simfish的过程.源码github地址:simfish WSGI HTTP Server wsgi模块提供 ...
- Python之Web框架们
Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. pip i ...
- 关于Python的web框架
uliwebhttp://git.oschina.net/limodou/uliweb uliweb 吸取了其他框架的经验,集成了orm.总的来说一般.这个安装后有个exe文件,命令行工具.不绿色.个 ...
随机推荐
- nexus-3本地下载jar的settipng.xml配置
打开maven安装目录下的setting.xml <servers> <server> <id>nexus</id> <username>a ...
- matlab 画图技巧
基本画图工具:matlab 画图中线型及颜色设置 matlab中坐标轴设置技巧 **Matlab中的坐标轴设置技巧** axisoff; %去掉坐标轴 axistight; ...
- UI 经常用法总结之--- UILabel UITextField (不断更新中)
UILabel : UIView <NSCoding> 1.创建一个UILabel对象 UILabel *label = [[UILabel alloc]initWithFrame:CGR ...
- [Node.js] Read a File in Node.js with fs.readFile and fs.readFileSync
We'll read a csv file in node.js both synchronously, and asynchronously. The file we're reading is a ...
- DWR(AJAX)+Highcharts绘制曲线图,饼图
基本需求: 1. 在前台会用DWR框架(或者AJAX)调用Java后台代码获取要在Hightcharts展示的数据 2. 了解JSON(JavaScript Object Notation)的格式 3 ...
- HTML的DIV如何实现垂直居中
外部的DIV必须有如下代码 display:table-cell; vertical-align:middle; 这样可以保证里面的东西,无论是DIV还是文本都可以垂直居中
- kindle】扫描版PDF完美切割六寸
kindle]扫描版PDF完美切割六寸 半夏 2013-11-05 18:36:01 软件来源记不清了..连使用说明的网址都找不到了,自己写一下使用方法大家凑合一下呗~ 软件是大牛写的 ...
- easyui使用心得
一.搭建easyui运行环境 1.下载easyui压缩文件 2.将降压后的文件添加至webapp目录下 3.引用5个必须的js和css文件 <!--引入easyui样式文件--> < ...
- 将Python打印的内容进行高亮的输出
将打印的内容进行高亮的显示 内容: 格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: "\033[41;36m something he ...
- 基于开源项目的在线网络视频直播项目---pc端的推流
https://github.com/winlinvip/simple-rtmp-server/issues/66 https://github.com/justinmakaila/iOS-Frame ...