class HeaderDict(dict):''' A dictionary with case insensitive (titled) keys.You may add a list of strings to send multible headers with the same name.'''def __setitem__(self, key, value):return dict.__setitem__(self,key.title(), value) #注意这里使用title函数,它能将每个单词的开头大写def __getitem__(self, key):return dict.__getitem__(self,key.title())def __delitem__(self, key):return dict.__delitem__(self,key.title())def __contains__(self, key):return dict.__contains__(self,key.title())def items(self):""" Returns a list of (key, value) tuples """for key, values in dict.items(self):if not isinstance(values, list):values = [values]for value in values:yield (key, str(value))def add(self, key, value):""" Adds a new header without deleting old ones """if isinstance(value, list):for v in value:self.add(key, v) #注意这里使用了递归elif key in self:if isinstance(self[key], list):self[key].append(value)else:self[key] = [self[key], value]else:self[key] = [value]

HeaderDict封装了dict,并将字典的键的单词的首字母进行大写。并且将value变成一个可迭代的对象,将value变成一个list对象,即value=[value]。WSGI标准中定义了要将一个字符串类型转换成list类型,这样会使其有更好的表现形式。server也可以不用一次全部输出可以用yield进行控制输出,以免一次输出过多。总而言之,这个封装了dict的类就实现了两个功能:

  1. 将value转换为list,优化数据表现形式
  2. 将key中单词的首字母大写
def abort(code=500, text='Unknown Error: Appliction stopped.'):""" Aborts execution and causes a HTTP error. """raise HTTPError(code, text)def redirect(url, code=307):""" Aborts execution and causes a 307 redirect """response.status = coderesponse.header['Location'] = urlraise BreakTheBottle("")def send_file(filename, root, guessmime = True, mimetype = 'text/plain'):""" Aborts execution and sends a static files as response. """root = os.path.abspath(root) + '/'filename = os.path.normpath(filename).strip('/')filename = os.path.join(root, filename)#判断文件是否可获得if not filename.startswith(root): #主目录下的文件不可以下载abort(401, "Access denied.")if not os.path.exists(filename) or not os.path.isfile(filename):abort(404, "File does not exist.")if not os.access(filename, os.R_OK):abort(401, "You do not have permission to access this file.")# 获得文件类型if guessmime:guess = mimetypes.guess_type(filename)[0]if guess:response.content_type = guesselif mimetype:response.content_type = mimetypeelif mimetype:response.content_type = mimetype#设置Content_typestats = os.stat(filename)# TODO: HTTP_IF_MODIFIED_SINCE -> 304 (Thu, 02 Jul 2009 23:16:31 CEST)if 'Content-Length' not in response.header:response.header['Content-Length'] = stats.st_sizeif 'Last-Modified' not in response.header:ts = time.gmtime(stats.st_mtime)ts = time.strftime("%a, %d %b %Y %H:%M:%S +0000", ts)response.header['Last-Modified'] = tsraise BreakTheBottle(open(filename, 'r'))

上面的三个函数分别实现了,服务器内部错误、重定向、以及文件下载。文件下载这个函数实现了,文件类型的判断,Content_type的设置、文件权限的判断、文件状态的获得等。这个函数还是很简单,可以做定制。

转载于:https://www.cnblogs.com/zhuozi/p/7152063.html

Bottle源码阅读(3) HeaderDict相关推荐

  1. 应用监控CAT之cat-client源码阅读(一)

    CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...

  2. centos下将vim配置为强大的源码阅读器

    每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...

  3. 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking

    该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...

  4. 源码阅读:SDWebImage(六)——SDWebImageCoderHelper

    该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...

  5. mybatis源码阅读

    说下mybatis执行一个sql语句的流程 执行语句,事务等SqlSession都交给了excutor,excutor又委托给statementHandler SimpleExecutor:每执行一次 ...

  6. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

  7. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  8. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  9. 源码阅读:AFNetworking(八)——AFAutoPurgingImageCache

    该文章阅读的AFNetworking的版本为3.2.0. AFAutoPurgingImageCache该类是用来管理内存中图片的缓存. 1.接口文件 1.1.AFImageCache协议 这个协议定 ...

最新文章

  1. Windows Azure Cloud Service (4) Windows Azure 平台高可用性的实现
  2. 优秀程序员的45个习惯
  3. boost::multi_array模块实现index_range 的测试
  4. php图片显示框,【转】php让图片弹出下载框的方法
  5. python信息找人的算法_算法篇-python查找算法
  6. 名词解释说明用英语怎么说_“恍然大悟”用英语怎么说?
  7. tsql是mysql中的吗_Mysql中的sql是如何执行的
  8. python的数据结构
  9. max-height、min-height、height优先级的问题
  10. 模块 calendar
  11. STM32 f103 实现命令终端
  12. oracle中isnumber函数,Oracle 函数isnumber问题
  13. 001_iBase4J学习之环境搭建
  14. MITK通用插件(四)The Dicom Browser Plugin
  15. android图片背景颜色透明度,android:设置背景图片、背景颜色透明
  16. 语音识别框架之kaldi
  17. 教育知识与能力-第一章教育基础知识和基本原理
  18. 实验三 基于A*迷宫的算法
  19. 如何在中国高等教育学生信息网上在线查询自己的学历信息
  20. java邮箱发送验证码_java实现使用QQ邮箱发送验证码功能

热门文章

  1. linux重新安装mysql步骤_Linux下MySQL安装及相关操作过程
  2. SideFX Houdini FX中文版
  3. HyperWorks2020中文版
  4. 精益设计: 设计团队如何改善用户体验
  5. 使用Swagger创建Api
  6. adreno-gpu-profiler
  7. 设计模式(三) | 为别人做嫁衣---代理模式
  8. Verilog_Day2
  9. I Love You的真正含义
  10. Binder通信机制介绍