前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >head first python选读(4):web 开发

head first python选读(4):web 开发

作者头像
一粒小麦
发布于 2019-07-18 09:38:25
发布于 2019-07-18 09:38:25
49700
代码可运行
举报
文章被收录于专栏:一Li小麦一Li小麦
运行总次数:0
代码可运行

python web 开发

犯了低级错误,这本书看了一半了才知道书名应为《head first python》,不是hand first..

现在开始一个web应用。

总算是熟悉的内容了。但项目的总体的配置还是有些麻烦的。

考虑到Kelly教练的不断变更的需求,现在需要开发一个网站。包括:

  • 欢迎页面
  • 选择选手
  • 显示时间
MVC模式和架构
  • M 模型:数据储存。你需要一个model模块,用一个函数比如set把txt文件读出来,变成一个pickle,所有数据放到一个字典里
  • V 视图:前端界面
  • C 控制:业务代码。用一个get方法把数据取出来!返回一个数据字典。

现在来思考架构吧:

在根目录下以下代码可在本地运行一个基于python的简单的http服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# app.py
from http.server import HTTPServer, CGIHTTPRequestHandler

port = 8080

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

这个app.py是所有文件的入口。因此所有的文件都依靠这个文件进行交互。路径以根目录为主。

看到这个就显示成功了

添加index.html可完成欢迎页的开发.

模型

模型有两个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# athletelist.py
def sanitize(score):
    splitter = '.'
    if '-' in score:
        splitter = '-'
    if ':' in score:
        splitter = ':'
    elif '.' in splitter:
        return score
    (mins , sec) = score.split(splitter)
    return mins+'.'+sec

class AthleteList(list):
    def __init__(self, a_name, a_birth=None, a_scores=[]):        
        list.__init__(list([]))        
        self.name = a_name        
        self.birth = a_birth        
        self.extend(a_scores)
    def top3(self):       
        return sorted(set([sanitize(score) for score in self]))[0:3]

然后把逻辑写好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# athleteModal.py
import pickle
from athletelist import AthleteList

def get(filename):
    try:
        with open(filename) as data:
            line = data.readline()
            scores = line.split(',')
            return AthleteList(scores.pop(0), scores.pop(0), scores)
    except IOError as err:
        print('file error.'+str(err))


# 把读取的数据转化为二进制文件,提供一个文件名列表作为参数
def set_data(file_list):
    all_athletes={}
    for item in file_list:
        with open(item) as data:
            ath=get(item)
            all_athletes[ath.name]=ath
    try:
        pickle.dump(all_athletes,open('db','wb'))
    except IOError as ioerr:
        print('file err:'+str(ioerr))
    print('set_data finished.')
    return all_athletes

# 从二进制文件中读取数据,
def get_from_store():
    all_athletes={}
    data=pickle.load(open('db','rb'))
    all_athletes=data
    print(all_athletes)
    return all_athletes

set_data(['james.txt','julie.txt','sarah.txt','mickey.txt'])

看到了熟悉的JSON

模板引擎

模板引擎会用到一些新的方法,在此需要读懂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from string import Template
# 从内置的string库导入Template类,可支持字符串替换模板

def start_response(resp="text/html"):
    return('Content-type: ' + resp + '\n\n')
# 创建一个content-type:缺省为text-html

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))
# 打开header.html,设置网站标题

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))
# 打开 footer文件,渲染脚部链接

def start_form(the_url, form_type="POST"):
    return('<form action="' + the_url + '" method="' + form_type + '">')
# 生成一个post表单,表单跳转action

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>') 
#渲染内容

前端模板怎么响应这个cgi呢?简单写一下吧。用 $表示变量。

header:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
<head>
<title>$title</title>
<link type="text/css" rel="stylesheet" href="/coach.css" />
</head>
<body>
<h1>$title</h1>

footer:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<p>
$links
</p>
</body>
</html>
创建列表逻辑

现在创建一个 gen_liust.py,要求执行选手时,生成一个选择选手的页面。你所要做的就是阅读模板引擎文档。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# gen_list.py
# 创建选手列表
import athletemodel
import fe
import glob
# glob可向操作系统查询一个文件名列表

# 查询,返回列表
data_files=glob.glob('data/*.txt')

#读取数据
athletemodel.set_data(data_files)
athletes=athletemodel.get_from_store()

print(fe.start_response())
print(fe.include_header('web_app'))
print(fe.start_form('http://www.baidu.com'))
print(fe.para('Select a athlete'))
for athlete in athletes:
    print(fe.radio_button('select_athlete',athletes[athlete].name))
print(fe.end_form())


print(fe.include_footer({'home':'/index.html'}))

在首页文件中,a标签为 <ahref="cgi-bin/gen_list.py">

即可跳转相应的页面。

创建数据界面

显示某人的计时数据和快捷链接。

获取post上传数据L

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cgi
form_data=cgi

剩下的很好做了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cgi
import fe
import athletemodel

athletes=athletemodel.get_from_store()

#获取表单数据并放到一个字典中
form_data=cgi.FieldStorage()
athlete_name=form_data['name'].value


# 渲染页面
print(fe.start_response())
print(fe.include_header(athlete_name))
print(fe.u_list(athletes[athlete_name].top3()))

print(fe.include_footer({'home':'/index.html','back':'gen_list.py'}))
表单校验,错误记录

如果我在表单啥子也不填就提交。就很难跟踪错误所在.

实际开发过程中,调bug会花费很多时间。应该想办法在web服务器上友好地显示错误信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cgitb
cgitb.enable()

显然就可以找到原因所在了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
当像素缩放遇上超广角:三星的自适应超表面微透镜技术破解CMOS传感器像差难题
      移动相机对高分辨率CMOS图像传感器的需求推动像素尺寸向亚微米级缩放。微透镜(ML)阵列在收集光子和相位检测自动对焦(PDAF)中起关键作用,但其性能随ML尺寸接近可见光波长而下降。在超广角图像传感器中,ML像差和入射光角度增大使这一问题更严重。本工作提出超表面微透镜(MML)替代传统球形ML,采用自适应设计匹配整个图像传感器上变化的主光线角度(CRA)。本工作在0.5 μm像素原型上实现了该MML,实现了自动对焦对比度提升35%,子色彩通道差异改善49%,且无量子效率损失。
光芯
2025/06/21
520
当像素缩放遇上超广角:三星的自适应超表面微透镜技术破解CMOS传感器像差难题
3D集成的平民化路径:基于芯片级减薄、后通孔TSV与Meta bonding的低成本原型方案
原文链接:https://xplorestaging.ieee.org/document/11007580
光芯
2025/06/19
890
3D集成的平民化路径:基于芯片级减薄、后通孔TSV与Meta bonding的低成本原型方案
CMOS图像传感器基础知识和参数理解「建议收藏」
CMOS图像传感器的工作原理:每一个 CMOS 像素都包括感光二极管(Photodiode)、浮动式扩散层(Floating diffusion layer)、传输电极门 (Transfer gate)、起放大作用的MOSFET、起像素选择开关作用的M0SFET.在 CMOS 的曝光阶段,感光二极管完成光电转换,产生信号电荷,曝光结束后,传输电极门打开,信号电荷被传送到浮动式扩散层,由起放大作用的MOSFET电极门来拾取,电荷信号转换为电压信号。所以这样的 CMOS 也就完成了光电转换、电荷电压转换、模拟数字转换的三大作用,通过它我们就能把光信号转化为电信号,最终得到数字信号被计算机读取,这样,我们就已经拥有了记录光线明暗的能力,但这还不够,因为我们需要色彩。现代彩色CMOS 的原理也很简单,直接在黑白图像传感器的基础上增加色彩滤波阵列(CFA),从而实现从黑白到彩色的成像。很著名的一种设计就是Bayer CFA(拜耳色彩滤波阵列)。一个很有趣的事就是,我们用来记录光影的 CMOS, 和我们用来输出光影的显示器,原理也刚好是向相反的,CMOS 把光转化为电信号最后以数字格式记录,显示器把解码的数字格式从电信号重新转化为光。光电之间的转换也就构成了我们人类数字影像的基础。
全栈程序员站长
2022/08/30
4.3K0
CMOS图像传感器基础知识和参数理解「建议收藏」
IEDM 2024:台积电的硅光(高性能工艺平台、CPO、光计算) 进展(一)
台积电在IEDM 2024会议上有好多论文,其中硅光的也有好几篇,看了之后还是很震撼的。
光芯
2025/04/08
3360
IEDM 2024:台积电的硅光(高性能工艺平台、CPO、光计算) 进展(一)
CMOS 图像传感器简介
图像传感器是数字成像系统的主要构建块之一,对整个系统性能有很大影响。两种主要类型的图像传感器是电荷耦合器件 (CCD) 和 CMOS 成像器。在本文中,我们将了解 CMOS 图像传感器的基础知识。
FPGA开源工作室
2021/09/18
2.2K0
CMOS 图像传感器简介
终于有人把CMOS、SOI和FinFET技术史梳理清楚了
1958年,第一个集成电路触发器是在德州仪器由两个晶体管构建而成。而今天的芯片包含超过10亿个晶体管,这种增长的规模来自于晶体管的不断缩小以及硅制造工艺的改进。
网络交换FPGA
2019/10/29
29.6K0
终于有人把CMOS、SOI和FinFET技术史梳理清楚了
PDAF原理简介_pfc电路工作原理图
原理:是在感光芯片上预留出一些规律性对称的遮蔽像素点,专门用来进行相位检测,通过像素之间的距离及变化来决定对焦的偏移量即相位差(PD值)从而实现快速对焦。
全栈程序员站长
2022/10/04
2K0
PDAF原理简介_pfc电路工作原理图
数字成像系统概述
当你打开手机准备拍照,镜头(Lens)会首先把被摄景物投影在图像传感器(Sensor)上,与此同时,影像处理器(ISP)会通过测光、测距算出合适的参数并指示镜头对焦,随着你按下拍照键,图像传感器(Sensor)会完成一次曝光,并通过影像处理器(ISP)变成图片,再经手机应用的后期处理,最终呈现在屏幕上。
雪月清
2020/09/01
1.7K0
数字成像系统概述
Camera CMOS工作原理
我们都知道有两种半导体图像传感器器件:CMOS Sensor和CCD Sensor,在目前的消费电子领域普遍使用的都是CMOS图像传感器,因此本节只介绍CMOS图像传感器的基础知识。
小驰行动派
2021/05/18
2K0
Camera CMOS工作原理
Sony:单颗CIS芯片同时实现高分辨率彩色图像采集+iTOF测距
本人对CIS图像传感器的专业知识了解得不多,老本行还是光通信,写得不对请见谅。个人只是觉得CIS领域也挺有意思的,这几年的一些趋势似乎也是各种专用芯片的解耦(Sensor,storage, readout,processing等)和多芯片多晶圆堆叠/先进封装来继续提升性能,而今天分享的这篇索尼在IEDM2024上边的工作,则是通过有机光敏晶体管做可见光图像传感+硅像素做近红外测距的双层像素堆叠,在不影响原有RGB成像性能的前提下,实现了NIR波段iTOF的无缝融合(无色差无混色的同步信息采集)。
光芯
2025/04/08
2070
Sony:单颗CIS芯片同时实现高分辨率彩色图像采集+iTOF测距
图像传感器的这9个知识点,你都懂吗?
典型图像传感器的核心是CCD单元(charge-coupled device,电荷耦合器件)或标准CMOS单元(complementary meta-oxide semiconductor,互补金属氧化物半导体)。CCD和CMOS传感器具有类似的特性,它们被广泛应用于商业摄像机上。
小白学视觉
2020/07/10
9230
可用于7埃米节点,imec首次展示功能性单片CFET器件
当地时间6月18日,imec(比利时微电子研究中心)通过官网宣布,在本周举行的 2024 年 IEEE VLSI 技术与电路研讨会 (2024 VLSI) 上, imec 首次展示了具有堆叠底部和顶部源/漏极触点的功能性单片CMOS CFET 器件。虽然结果是从正面图案化两个触点获得的,但 imec 还展示了将底部触点形成移至晶圆背面的可行性——将顶部器件的存活率从 11% 显著提高到 79%。
芯智讯
2024/07/02
1270
可用于7埃米节点,imec首次展示功能性单片CFET器件
CPU是如何制造出来的(附高清全程图解)
CPU是现代计算机的核心部件,又称为“微处理器”。对于PC而言,CPU的规格与频率常常被用来作为衡量一台电脑性能强弱重要指标。Intelx86架构已经经历了二十多个年头,而x86架构的CPU对我们大多数人的工作、生活影响颇为深远。
刘盼
2021/04/29
2.3K0
CPU是如何制造出来的(附高清全程图解)
2. 从入射光到JPEG相片-数码相机内部的秘密
虽然你可能拥有不止一个相机,而且现在用手机也能拍出精彩的照片,但你肯定也曾困惑过,为什么数码相机(单反),包括手机,可以拍出精彩的照片,它们跟传统的照相机到底区别在哪里?其实我自己也曾很困惑。我依稀记得我大学期间使用的相机都还是胶卷式的,怎么突然满大街都是数码相机和手机,人们甚至已经习惯了用手机来拍照,连数码相机都要被淘汰掉了似的。科技实在是进步得太快了。
HawkWang
2020/04/21
1.3K0
2. 从入射光到JPEG相片-数码相机内部的秘密
ISP基础(0y):图像传感器
Samsung(三星)、OmniVision(OV 美国)、SONY(索尼)、SK Hynix(海力士)、Aptina(拆分与美光公司 美国)、ST Micro(意法半导体)、Toshiba(东芝)、格科微(中国)
233333
2020/11/11
1.4K0
ISP基础(0y):图像传感器
晶体管救命稻草来了:3D堆叠CMOS,摩尔定律又续10年?
---- 新智元报道   编辑:David 桃子 【新智元导读】3D堆叠CMOS将是把摩尔定律延伸到下一个十年的关键。 晶体管,被誉为「20世纪最伟大的发明」。 它的出现为集成电路、微处理器以及计算机内存的产生奠定了基础。 1965年,「摩尔定律」的提出成为半导体行业几十年来的金科玉律。 它表明,每隔 18~24 个月,封装在微芯片上的晶体管数量便会增加一倍,芯片的性能也会随之翻一番。 然而,随着新工艺节点的不断推出,晶体管中原子的数量已经越来越少,种种物理极限制约着摩尔定律的进一步发展。 甚至有
新智元
2022/08/26
5090
晶体管救命稻草来了:3D堆叠CMOS,摩尔定律又续10年?
CCD传感器成像、尺寸、曝光时间「建议收藏」
参考博主@机器视觉001的博文 https://blog.csdn.net/liubing8609/article/details/78254703
全栈程序员站长
2022/09/05
3.6K0
Nature新研究:摄像头是天生的神经网络,速度超越传统方法千倍
作为各家厂商比拼的重点,今天手机上的摄像头已经做到了一亿像素,而摄像头感光器件也是典型的半导体芯片,本质是二极管,这类精密的结构用来做神经网络运算效果如何?最新一期《自然》杂志上的研究告诉我们:速度是传统处理方法的上千倍。
机器之心
2020/03/11
4730
IMEC:300mm硅光平台的64Gb/s O波段GeSi电吸收调制器EAM
IMEC最近在JLT发了个文章,介绍了他们在300 mm硅光平台上的O波段GeSi QCSE EAM的进展。高速EAM是CPO/OIO调制方案的一个重要选项,比MZ小,带宽密度大,比微环稳定,控制简单。但目前做得比较好的单次外延GeSi EAM都只能工作在L波段,与短距O波段标准不兼容,而通过多层堆叠的Ge/GeSi多量子阱结构,利用量子斯塔克效应实现光吸收边带实现强烈的光谱漂移,可以实现工作在O波段的GeSi EAM,但技术难度也挺大的。
光芯
2025/04/08
1420
IMEC:300mm硅光平台的64Gb/s O波段GeSi电吸收调制器EAM
台积电3nm工艺细节曝光,3nm良率或高达80%!
2023年1月3日消息,据Semiwiki报道,台积电在 2022 年 IEDM 上发表了两篇关于 3nm 的论文:“关键工艺特性可实现3nm CMOS及更高技术的激进接触栅极间距缩放”和“3nm CMOS FinFlex为移动SOC和高性能计算应用提供增强的能效和性能的平台技术”。
芯智讯
2023/02/09
8570
推荐阅读
相关推荐
当像素缩放遇上超广角:三星的自适应超表面微透镜技术破解CMOS传感器像差难题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档