Bottle源码之HeaderDict详解

        所有的框架请求响应都基于一个原理http请求 –> wsgi服务器 –> wsgi接口(实际就是框架中自定义实现的函数经过底层封装) –> 响应可以参考廖雪峰的教程中关于wsgi接口的讲解

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的类就实现了两个功能:

将value转换为list,优化数据表现形式

将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 = code    response.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的设置、文件权限的判断、文件状态的获得等。这个函数还是很简单,可以做定制。

以上就是Bottle源码HeaderDict详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2268224.html

(0)
上一篇 2025年2月27日 10:37:00
下一篇 2025年2月18日 07:17:36

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python轻量级Web框架:Bottle库!

    和它本身的轻便一样,Bottle库的使用也十分简单。相信在看到本文前,读者对python也已经有了简单的了解。那么究竟何种神秘的操作,才能用百行代码完成一个服务器的功能?让我们拭目以待。 1. Bottle库安装 1)使用pip安装 2)下…

    2025年2月26日 编程技术
    200
  • Python中的Web开发:Bottle实战

    随着互联网的普及和发展,web开发在现代计算机科学中日益重要。python作为一门强大而又易于使用的编程语言,自然也拥有着丰富的web开发框架。本文将介绍其中的一种框架——bottle,并通过一个实例来演示如何在python中使用bottl…

    编程技术 2025年2月26日
    200
  • Scrapy底层架构探索与源码解析

    scrapy底层架构探索与源码解析 Scrapy是一个基于Python的高效Web爬虫框架,能够快速、简单地从网页中抽取数据,支持数据存储和导出格式多样化,成为了很多爬虫爱好者和开发者的首选框架。Scrapy在底层实现上采用了异步I/O模型…

    编程技术 2025年2月26日
    200
  • Python在软件源码保护中的应用实践

    python语言作为一种高级编程语言,具有简单易学、易读易写等特点,在软件开发领域中得到了广泛的应用。然而,由于python的开源特性,源代码很容易被他人轻易获取,这就给软件源码保护带来了一些挑战。因此,在实际应用中,我们常常需要采取一些方…

    编程技术 2025年2月26日
    200
  • php源码搭建网站详细步骤介绍

    php源码建站步骤: 1、首先在本地运行php源码,测试源码是否能运行正常。 2、购买域名和服务器,如果不会配置可以购买轻云服务器,有FTP账号和密码。 3、在万网下做域名解析,解析到你的服务器IP地址。 4、在服务器管理页面添加域名 立即…

    2025年2月25日
    200
  • 使用php如何获取网页源码?

    文章正文内容: 一下是几种常用的获取网页源码的几种方式: 1. file_get_contents 2.curl 立即学习“PHP免费学习笔记(深入)”; 3.fopen->fread->fclose 注意: 1.使用file_…

    2025年2月25日 编程技术
    200
  • linux下安装php源码详细讲解

    php源码的安装有以下几个步骤: 1、将下载的二进制包移动到/usr/local目录,解压缩文件包 tar zxvf php-7.1.4.tar.gz 登录后复制 2、进入解压的php文件夹下/usr/local/php-7.1.4,安装依…

    2025年2月25日
    200
  • php源码该怎么设置数据库

    php源码该怎么设置数据库 php源码修改数据库的设置方法:首先在源码中找到程序的配置文件;然后用文本编辑器打开;之后修改数据库地址、数据库名、用户名、连接密码、数据库前缀等参数;最后保存即可。这里以织梦程序为例,演示修改的方法。 找到de…

    2025年2月25日
    200
  • php短链接源码有哪些

    php短链接源码有:1、Bit.ly API,使用Bit.ly API,可以将长链接转换为短链接,并获取有关链接的统计信息;2、TinyURL API,使用TinyURL API,可以将长链接转换为短链接,并获取有关链接的统计信息;3、自定…

    2025年2月23日
    200
  • [Leveldb]源码分析之三 BloomFilter模块的实现

    应用场景: 由于Leveldb采用的是分层的存储结构,那么当Get一个key的时候最坏情况就是在所有的层级上都查询一遍这个key,这个开销是非常大的,引入BloomFilter之后,利用BloomFilter能够快速判断是否存在的特点可以很…

    数据库 2025年2月22日
    200

发表回复

登录后才能评论