python bottle支持https_python bottle 简介

bottle是一个轻量级的python

web框架, 可以适配各种

web服务器,包括python自带的wsgiref(默认),gevent, cherrypy,gunicorn等等。bottle是单文件形式发布,源码在

这里可以下载,代码量不多,可以用来学习web框架。

这里也有官方文档的中文翻译。     首先我们来运行一下bottle的hello world

from bottle importrunif __name__ == '__main__':defapplication(environ, start_response):

start_response('200 OK', [('Content-Type', 'text/html')])return ['

Hello world!

']

run(host='localhost', port=8080, app=application)

上面的代码看起来也非常符合wsgi的接口规范。启动改代码,可以看到输出         Bottle v0.13-dev server starting up (using

WSGIRefServer())…         Listening on http://localhost:8080/         Hit Ctrl-C to quit.      输出中加粗部分表明使用的web服务器是

python自带的wsgiref。也可以使用其他web server,比如gevent,前提是需要安装gevent,修改后的代码如下:

from bottle importrunimportgevent.monkey

gevent.monkey.patch_all()if __name__ == '__main__':defapplication(environ, start_response):

start_response('200 OK', [('Content-Type', 'text/html')])return ['

Hello world!

']

run(host='localhost', port=8080, app=application, server = 'gevent')

通过server关键字指定web服务器为‘gevent’,输出的第一行变成了:

Bottle v0.13-dev server starting up (using

GeventServer())…   不管bottle用什么web服务器启动,在浏览器输入127.0.0.1:8080,都可以看到

      下面介绍bottle中部分类和接口

bottle.Bottle     代表一个独立的wsgi应用,由一下部分组成:routes, callbacks, plugins, resources and configuration。     __call__: Bottle定义了__call__函数, 使得Bottle的实例能成为一个

callable。在

前文提到,web框架(或Application)需要提供一个callbale对象给web服务器,bottle提供的就是Bottle实例

def __call__(self, environ, start_response):"""Each instance of :class:'Bottle' is a WSGI application."""

return self.wsgi(environ, start_response)

下面是Bottle.wsgi函数的核心代码,主要调用两个比较重要的函数:_handle, _cast

defwsgi(self, environ, start_response):"""The bottle WSGI-interface."""

try:

out=self._cast(self._handle(environ))#rfc2616 section 4.3

if response._status_code in (100, 101, 204, 304)\or environ['REQUEST_METHOD'] == 'HEAD':if hasattr(out, 'close'): out.close()

out=[]

start_response(response._status_line, response.headerlist)return out

_handle:处理请求,最终调用到application ,简化后的代码如下:

1   def_handle(self, environ):2 self.trigger_hook('before_request')3 route, args =self.router.match(environ)4 out = route.call(**args)5 self.trigger_hook('after_request')6 return out

_cast:         标准的wsgi接口对Application的返回值要求严格,必须迭代返回字符串。bottle做了一些扩展,可以允许App返回更加丰富的类型,比如dict,File等。 _cast函数对_handle函数返回值进行处理,使之符合wsgi规范

bottle.Route     封装了路由规则与对应的回调

bottle.Router

A Router is an ordered collection of route->target pairs. It is used to  efficiently match WSGI requests against a number of routes and return the first target that satisfies the request.

ServerAdapter     所有bottle适配的web服务器的基类,子类只要实现run方法就可以了,bottle里面有大量的Web服务器的适配。下表来自官网,介绍了bottle支持的各种web服务器,以及各自的特性。

Name

Homepage

Description

cgi

Run as CGI script

flup

Run as FastCGI process

gae

Helper for Google App Engine deployments

wsgiref

Single-threaded default server

cherrypy

Multi-threaded and very stable

paste

Multi-threaded, stable, tried and tested

rocket

Multi-threaded

waitress

Multi-threaded, poweres Pyramid

gunicorn

Pre-forked, partly written in C

eventlet

Asynchronous framework with WSGI support.

gevent

Asynchronous (greenlets)

diesel

Asynchronous (greenlets)

fapws3

Asynchronous (network side only), written in C

tornado

Asynchronous, powers some parts of Facebook

twisted

Asynchronous, well tested but… twisted

meinheld

Asynchronous, partly written in C

bjoern

Asynchronous, very fast and written in C

auto

Automatically selects an available server adapter

可以看到,bottle适配的web服务器很丰富。工作模式也很全面,有多线程的(如paste)、有多进程模式的(如gunicorn)、也有基于协程的(如gevent)。具体选择哪种web服务器取决于应用的特性,比如是CPU bound还是IO bound

bottle.run     启动wsgi服务器。几个比较重要的参数     app: wsgi application,即可以是bottle.Bottle 也开始是任何满足wsgi 接口的函数     server: wsgi http server,字符串     host:port: 监听端口          核心逻辑:     ServerAdapter.run(app)。   最后,bottle源码中有一些使用descriptor的例子,实现很巧妙,值得一读,

前文也有介绍。   references;

http://www.bottlepy.org/docs/dev/

https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py

http://blog.csdn.net/huithe/article/details/8087645

http://simple-is-better.com/news/59

http://www.bottlepy.org/docs/dev/deployment.html#server-options

http://blog.rutwick.com/use-bottle-python-framework-with-google-app-engine

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA重磅发布NVAIE 3.0,AI时代的操作系统来了

文|卖萌酱近年来,AI技术发展迅速,随着以Pytorch、TensorFlow为代表的深度学习框架的成熟,AI模型的训练流程已经变得相对清晰、成熟。然而,预训练模型和后续一系列超大模型的出现,使得对于大部分AI开发者和企…

python序列符号_Python中的文本和字节序列

导语:本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。本章重点:1、了解字符字节等概念,编解码问题;2、熟悉字符的规范化处理和双模式API。一、基本概…

LeetCode 258. 各位相加

1. 题目 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 8 11, 1 1 2。 由于 2 是一位数,所以返回 2。 进阶: 你可以不使用循环或者递归&#xff0…

读取 Radio 的值

读取 Radio 的值 2 <form id"form1"action""method"">3 <div><input type"radio"name"r"id"r1"value"一"><label for"r1">选项一</label></div>4 <d…

够快,首个“开源ChatGPT项目“来了!网友吐槽:这谁能跑

文&#xff5c;明敏 源&#xff5c;量子位就说程序员的手速有多快吧&#xff0c;首个开源ChatGPT项目已经出现了&#xff01;基于谷歌语言大模型PaLM架构&#xff0c;以及使用从人类反馈中强化学习的方法&#xff08;RLHF&#xff09;&#xff0c;华人小哥Phillip Wang复刻了一…

linux 串口工具_会C++就能开发Linux/Android应用!这款Yoxios X3串口屏火了...

大家好&#xff0c;我是小月月。今天给大家介绍一款搭载YOXIOS操作系统的YOXIOS X3串口屏&#xff0c;只要你会C/C就能开发Linux/Android应用&#xff01;而且小月月带来了福利——“免费试用名额”&#xff01;&#xff01;YOXIOS X3介绍YOXIOS X3串口屏比传统串口屏要强大得多…

LeetCode 278. 第一个错误的版本(二分查找)

1. 题目 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。 不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。 由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff0c;…

LeetCode 284. 顶端迭代器

1. 题目 给定一个迭代器类的接口&#xff0c;接口包含两个方法&#xff1a; next() 和 hasNext()。 设计并实现一个支持 peek() 操作的顶端迭代器 – 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。 示例: 假设迭代器被初始化为列表 [1,2,3]。调用 next() 返回 1…

ChatGPT国内镜像站

ChatGPT介绍 ChatGPT是OpenAI开发的一个大型预训练语言模型。它是GPT-3模型的变体&#xff0c;GPT-3经过训练&#xff0c;可以在对话中生成类似人类的文本响应。ChatGPT 旨在用作聊天机器人&#xff0c;我们可以对其进行微调&#xff0c;以完成各种任务&#xff0c;如回答问题…

【转】DATAGRIDVIEW控制

目录&#xff1a; 取得或者修改当前单元格的内容 设定单元格只读 不显示最下面的新行 判断新增行 行的用户删除操作的自定义 行、列的隐藏和删除 禁止列或者行的Resize ★ DataGridView 取得或者修改当前单元格的内容&#xff1a; GO TO TOP 当前单元格指的是 DataGridView…

matlab 动画_MATLAB绘图动画(1)

今天写一个案列&#xff0c;绘图动画画出以下曲面函数随着theta角的变化的动图程序代码&#xff1a;clc,clear,close allx-8:0.5:8;[X,Y]meshgrid(x);rsqrt(X.^2Y.^2);Zsin(r)./r;figure(color,w);surf(Z); %画出帧theAxes axis; %保存…

LeetCode 2020 力扣杯全国春季编程大赛(1644/4093,前40.2%)

文章目录1. 比赛结果2. 题目解析2.1 拿硬币 Easy2.2 传递信息 Esay2.3 剧情触发时间 Medium2.4 最小跳跃次数 Hard2.5 二叉树任务调度 Hard1. 比赛结果 前两题比较顺利&#xff0c;24分钟做出来了&#xff0c;第3&#xff0c;4两题试了好久&#xff0c;都显示超时&#xff0c;…

silverlight2.0 demo实例,源码下载

这是最近发现的微软官方网站上提供的学习例子&#xff0c;并有源码下载&#xff0c;与大家分享。 http://silverlight.net/Community/gallerydetail.aspx?catsl2 下面这个链接是银光开源中心提供的&#xff0c;也不错哦。。 http://www.slcenter.cn/ YoLing音频播放器v1.0 for…

网页设计框架布局代码_网页设计中的分屏切割布局法

今天和大家聊的是一种关于网页设计中的视觉呈现方法&#xff0c;一般我们称之为“分屏布局”&#xff0c;是一种常见的网页设计排版方式&#xff0c;将页面分割为均等或者不均等的两部分&#xff0c;这种方式的好处就是可以将文字信息和图像元素进行更有效的布局区分&#xff0…

LeetCode 第 24 场双周赛(326/1898,前17.2%)

文章目录1. 比赛结果2. 题目1. LeetCode 5372. 逐步求和得到正数的最小值 easy2. LeetCode 5373. 和为 K 的最少斐波那契数字数目 medium3. LeetCode 5374. 长度为 n 的开心字符串中字典序第 k 小的字符串 medium4. LeetCode 5375. 恢复数组 hard1. 比赛结果 做出来了 1、2、3…

货物与产品的区别_超市货架和仓储式货架有什么区别?

在生活中&#xff0c;超市货架和仓储货架咱们都叫货架&#xff0c;这样导致了很多客户都认为货架不就是超市里面摆货的那个货架吗&#xff1f;其实&#xff0c;虽然两种都叫货架&#xff0c;两者之间都有存储功能&#xff0c;但还有其它的区别。仓库货架注重的是存储量和承重量…

详细解析Java中抽象类和接口的区别

详细解析Java中抽象类和接口的区别 在Java语言中&#xff0c; abstract class 和interface 是支持抽象类定 义的两种机制。正是由于这两种机制的存在&#xff0c;才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性&a…

LeetCode 1417. 重新格式化字符串

1. 题目 给你一个混合了数字和字母的字符串 s&#xff0c;其中的字母均为小写英文字母。 请你将该字符串重新格式化&#xff0c;使得任意两个相邻字符的类型都不同。 也就是说&#xff0c;字母后面应该跟着数字&#xff0c;而数字后面应该跟着字母。 请你返回 重新格式化后 …

[分享]天轰穿VS2005视频教程

谈到学习,虽然有很多很多人有自己一套的自学方法. 但有时候,有个好的老师来教,一个好的拍档一同促进也是十分重要的. 就在一个星期前我偶然在Google上点入了天轰穿的blog 发现里面的VS2005视频教程对于一些新学.net的朋友是在是太有帮助了 从基础到高级应用都能够涉及到,实在是…

svn忽略指定文件夹下的文件_管理SteamLibrary文件夹下的acf文件

管理SteamLibrary文件夹下的acf文件众所周知&#xff0c;steam中下载的游戏会在SteamLibrarysteamappscommon文件夹下创建一个以游戏名称为名的文件夹用来存放文件&#xff0c;并在SteamLibrarysteamapps文件夹下创建一个acf文件&#xff0c;里面储存着游戏的一些信息&#xff…