Head First Python 7 web开发

简介: t@localhost webapp$ tree . ├── cgi-bin │   ├── athletemodel.py │   ├── generate_list.py │   ├── generate_timing_data.




t@localhost webapp$ tree
.
├── cgi-bin
│   ├── athletemodel.py
│   ├── generate_list.py
│   ├── generate_timing_data.py
│   ├── kelly_c.py
│   └── yate.py
├── coach.css
├── data
│   ├── athletes.pickle
│   ├── james.txt
│   ├── julie.txt
│   ├── mikey.txt
│   └── sarah.txt
├── favicon.ico
├── images
│   └── coach-head.jpg
├── index.html
├── simple_httpd.py
└── templates
    ├── footer.html
    └── header.html


4 directories, 17 files


点击(此处)折叠或打开

  1. -rw-r--r--. 1 t t 263 5月 25 10:17 ./simple_httpd.py
  2. #!/usr/bin/env python3
  3. # -*- coding:utf-8 -*-


  4. from http.server import HTTPServer, CGIHTTPRequestHandler

  5. port = 8080

  6. httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
  7. print("Starting simple_httpd on port: " + str(httpd.server_port))
  8. httpd.serve_forever()



  1. -rwxrwxr-x. 1 t t 672 5月 25 10:34 ./cgi-bin/generate_list.py
  2. #!/usr/bin/env python3
  3. # -*- coding:utf-8 -*-

  4. #导入M,V
  5. import athletemodel, yate
  6. #glob 模块可以向操作系统查询一个文件名列表
  7. import glob

  8. #生成一个选择运动员列表html页面
  9. data_files = glob.glob('data/*.txt')
  10. athletes = athletemodel.put_to_store(data_files)

  11. print(yate.start_response())
  12. print(yate.include_header("kelly教练的运动员列表"))

  13. print(yate.start_form("generate_timing_data.py"))
  14. print(yate.para("从列表中选择一个运动员:"))
  15. for each_athlete in athletes:
  16.     print(yate.radio_button("which_athlete",athletes[each_athlete].name))
  17. print(yate.end_form("Select"))


  18. print(yate.include_footer({"Home":"/index.html"}))














  1. -rwxrwxr-x. 1 t t 746 5月 25 11:33 ./cgi-bin/generate_timing_data.py
  2. #!/usr/bin/env python3
  3. # -*- coding:utf-8 -*-

  4. #使用cgi模块处理表单数据
  5. import cgi
  6. #cgi跟踪模块
  7. import cgitb
  8. cgitb.enable()
  9. #将所有表单数据放在一个字典中
  10. form_data = cgi.FieldStorage()
  11. athlete_name = form_data['which_athlete'].value

  12. import athletemodel,yate
  13. #取出pickle数据
  14. athletes = athletemodel.get_from_store()

  15. #生成运动员时间显示页面
  16. print(yate.start_response())
  17. print(yate.include_header("时间数据信息"))
  18. print(yate.header("运动员:" + athlete_name + ", 出生日期:" + athletes[athlete_name].dob + "."))
  19. print(yate.para("最佳三次成绩为:"))
  20. print(yate.u_list(athletes[athlete_name].top3))
  21. print(yate.include_footer({"Home":"/index.html","其他成员数据":"generate_list.py"}))





  1. -rwxr-xr-x. 1 t t 1511 5月 25 10:24 ./cgi-bin/yate.py
  2. #从string模块中导入类,支持简单的字符串替换模板.
  3. from string import Template

  4. #生成文件类型
  5. def start_response(resp="text/html"):
  6.     return('Content-type: ' + resp + ';charset=utf-8\n\n')

  7. #
  8. def include_header(the_title):
  9.     with open('templates/header.html') as headf:
  10.         head_text = headf.read()
  11.     header = Template(head_text)
  12.     return(header.substitute(title=the_title))

  13. def include_footer(the_links):
  14.     with open('templates/footer.html') as footf:
  15.         foot_text = footf.read()
  16.     link_string = ''
  17.     for key in the_links:
  18.         link_string += '+ the_links[key] + '">' + key + '    '
  19.     footer = Template(foot_text)
  20.     return(footer.substitute(links=link_string))

  21. def start_form(the_url, form_type="POST"):
  22.     return('+ the_url + '" method="' + form_type + '">')

  23. def end_form(submit_msg="Submit"):
  24.     return('


    + submit_msg + '">')

  25. def radio_button(rb_name, rb_value):
  26.     return('+ rb_name +
  27.                              '" value="' + rb_value + '"> ' + rb_value + '
    '
    )

  28. def u_list(items):
  29.     u_string = '
    • '
    •     for item in items:
    •         u_string += '
    • ' + item + ' '
    •     u_string += '
    '
  30.     return(u_string)

  31. def header(header_text, header_level=2):
  32.     return('(header_level) + '>' + header_text +
  33.            ' + str(header_level) + '>')

  34. def para(para_text):
  35.     return('

    ' + para_text + '

    ')



  1. -rwxr-xr-x. 1 t t 2086 5月 25 11:30 ./cgi-bin/athletemodel.py
  2. #!/usr/bin/evn python3
  3. # -*- coding:utf8 -*-
  4. '''
  5. 1.读取文件 => put_to_store => pickle
  6. 2.pickle => get_from_store => viewer
  7. '''
  8. import pickle
  9. from kelly_c import athletelist
  10. #磁盘文件处理
  11. def openfile(filename):
  12.     try:
  13.         #打开文件
  14.         with open(filename) as athlete_file:
  15.             #读取数据
  16.             data = athlete_file.readline()
  17.             #初步处理数据,去空,,号分割
  18.             value_list= data.strip().split(',')
  19.             #分别取出有格式的三种数据
  20.             username = value_list.pop(0)
  21.             userdob = value_list.pop(0)
  22.             usertimes= value_list
  23.             #返回实例对象
  24.             athlete_instance=athletelist(username,userdob,usertimes)
  25.             return(athlete_instance)
  26.     except IOError as ioerr:
  27.         print('File error %s' % ioerr)
  28.         return(None)

  29. #内容压制,使用字典数据类型.
  30. def put_to_store(files_list):
  31.     #字典生成
  32.     all_athletes = {}
  33.     for each_file in files_list:
  34.         each_athlete = openfile(each_file)
  35.         all_athletes[each_athlete.name] = each_athlete
  36.     #pickle数据压制
  37.     try:
  38.         with open('data/athletes.pickle','wb') as athlfile:
  39.             pickle.dump(all_athletes,athlfile)
  40.     except IOError as ioerr:
  41.         print('File error(%s)' % ioerr)
  42.     return(all_athletes)

  43. def get_from_store():
  44.     all_athletes = {}
  45.     #pickle数据解压
  46.     try:
  47.         with open('data/athletes.pickle','rb') as athlfile:
  48.             all_athletes=pickle.load(athlfile)
  49.     except IOError as ioerr:
  50.         print('File error(%s)' % ioerr)
  51.     return(all_athletes)

  52. #files_list = ["../data/james.txt", "../data/julie.txt", "../data/mikey.txt", "../data/sarah.txt"]
  53. #data = put_to_store(files_list)
  54. #test
  55. '''
  56. print(get_from_store())
  57. print(dir())
  58. type(data)
  59. print('Use put_to_store()')
  60. for each_athlete in data:
  61.     print(data[each_athlete].name,data[each_athlete].dob)
  62. print('Use get_from_store()')
  63. data_copy = get_from_store()
  64. for each_athlete in data_copy:
  65.     print(data_copy[each_athlete].name,data_copy[each_athlete].dob)
  66. '''





  1. -rwxrwxr-x. 1 t t 605 5月 25 11:33 ./cgi-bin/kelly_c.py
  2. #!/usr/bin/env python3
  3. # -*- coding:utf-8 -*-
  4. class athletelist(list):
  5.     def __init__(self, a_name, a_dob=None, a_times=[]):
  6.         list.__init__([])
  7.         self.name = a_name
  8.         self.dob = a_dob
  9.         self.extend(a_times)
  10.     @property
  11.     def top3(self):
  12.         return(sorted(set([sanitize(t) for t in self]))[0:3])

  13. #处理字符,转换成m.s格式
  14. def sanitize(time_string):
  15.     if '-' in time_string:
  16.         splitter = '-'
  17.     elif ':' in time_string:
  18.         splitter = ':'
  19.     else:
  20.         return time_string
  21.     (min, sec) = time_string.split(splitter)
  22.     return (min + '.' + sec)
-rw-r--r--. 1 t t 84 7月  24 2010 ./data/mikey.txt
Mikey McManus,2002-2-24,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38,2:40,2.22,2-31
-rw-r--r--. 1 t t 82 7月  25 2010 ./data/julie.txt
Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01,3.02,2:59
-rw-r--r--. 1 t t 80 8月  29 2010 ./data/james.txt
James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16
-rw-r--r--. 1 t t 84 7月  25 2010 ./data/sarah.txt
Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22

t@localhost webapp$ find . -name '*.html' -exec ls -l  {} \; -exec cat {} \;   

目录
相关文章
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
665 4
|
11月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
API C++ 开发者
PySide vs PyQt:Python GUI开发史诗级对决,谁才是王者?
PySide 和 PyQt 是 Python GUI 开发领域的两大利器,各有特色。PySide 采用 LGPL 协议,更灵活;PyQt 默认 GPL,商业使用需授权。两者背后团队实力雄厚,PySide 得到 Qt 官方支持,PyQt 由 Riverbank Computing 打造。API 设计上,PySide 简洁直观,贴近原生 Qt;PyQt 增加 Pythonic 接口,操作更高效。性能方面,两者表现优异,适合不同需求的项目开发。选择时可根据项目特点与开源要求决定。
1514 20
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
397 104
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
483 104
|
开发框架 编解码 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)
该文档详细介绍了一个兼容JS的类Web开发范式的方舟开发框架,涵盖概述、文件组织、js标签配置及app.js等内容。框架采用HML、CSS、JavaScript三段式开发方式,支持单向数据绑定,适合中小型应用开发。文件组织部分说明了目录结构、访问规则和媒体文件格式;js标签配置包括实例名称、页面路由和窗口样式信息;app.js则描述了应用生命周期与对象管理。整体内容旨在帮助开发者快速构建基于方舟框架的应用程序。
463 102
|
10月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
1078 7

推荐镜像

更多