Bottle 源码阅读(五)-- WSGI 服务封装, 热部署原理



1. WSGI 服务

Python 内置了一个 WSGI 服务 wsgiref, 借用 simple_server.py 中的例子, 看下简单的使用, :

from wsgiref.simple_server import make_server


def demo_app(environ, start_response):
    from io import StringIO
    stdout = StringIO()
    print("Hello world!", file=stdout)
    print(file=stdout)
    h = sorted(environ.items())
    for k, v in h:
        print(k, '=', repr(v), file=stdout)
    start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
    return [stdout.getvalue().encode("utf-8")]


def start_wsgi():
    httpd = make_server('', 8000, demo_app)
    sa = httpd.socket.getsockname()
    print("Serving HTTP on", sa[0], "port", sa[1], "...")
    httpd.serve_forever()

demo_app() 函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

environ:一个包含所有HTTP请求信息的dict对象, 从截图可以看出来包含的信息非常多
start_response:一个发送HTTP响应的函数

阅读全文 »


Bottle 源码阅读(四) -- 注解, functools, yield, inspect



1. Python 注解使用

高阶函数, 指的是能将函数当成入参来操作, Python 注解也是这么做的, 使用 @ 符号, 让代码更简洁.

示例

def logger(fn):
    def wrapper():
        print('%s starts to executing' % fn.__name__)
        fn()
        print('%s finished executing' % fn.__name__)
    return wrapper


@logger
def hello():
    print('Hello world!')
##
hello starts to executing
Hello world!
hello finished executing

阅读全文 »


Bottle 源码阅读(三) -- ArgumentParser, __slots__, __call__, templefile, @property 使用



1. Python 命令行解析工具

(pycharm_env) ➜  six_web git:(six_20171018) ✗ ifconfig --help
ifconfig: illegal option -- -
usage: ifconfig [-C] [-L] interface address_family [address [dest_address]]
                [parameters]
       ifconfig interface create
       ifconfig -a [-C] [-L] [-d] [-m] [-u] [-v] [address_family]
       ifconfig -l [-d] [-u] [address_family]
       ifconfig [-C] [-L] [-d] [-m] [-u] [-v]

类似在 Linux 系统上执行 command -help 命令, C 语言使用的 getopt() 进行命令行交互. Python 标准库中自带的 argparse 的用法几乎一样.

阅读全文 »


Bottle 源码阅读(二) -- Python 项目的开源到 Pypi 服务器



Pypi 服务, 类似 Java 的 maven 仓库, 用来托管开源的 Python 模块. 发布 Python 模块, 必须要配置好 setup.py 等配置文件.

一般待发布的项目目录, 大概有下面文件

.
|-- LICENSE.txt
|-- MANIFEST.in
|-- README.rst
|-- data
|   `-- data_file
|-- sample
|   |-- __init__.py
|   `-- package_data.dat
|-- sample.egg-info
|   |-- PKG-INFO
|   |-- SOURCES.txt
|   |-- dependency_links.txt
|   |-- entry_points.txt
|   |-- requires.txt
|   `-- top_level.txt
|-- setup.cfg
|-- setup.py
|-- tests
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- __pycache__
|   |   `-- test_simple.cpython-27-PYTEST.pyc
|   `-- test_simple.py
`-- tox.ini

阅读全文 »


Bottle 源码阅读(一) -- 使用 Travis CI 及 Coveralls 持续集成



Clone 下来 Bottle 源码后, 逐个文件分析, 发现 .travis.yml 文件中的配置比较有意思, 如下图. Google 了一下, 发现是 Github 项目持续集成用的.

language: python
sudo: required

python:
  - "2.7.3" # Ubuntu 12.4LTS (precise) and Debian 7 LTS (wheezy)
  - "2.7"
  - "3.3"
  - "3.4"
  - "3.5"
  - "3.6"
  - "nightly"

install:
  - travis_retry bash test/travis_setup.sh

script:
  - python -m coverage run --source=. test/testall.py fast
  - python -m coverage combine
  - python -m coverage report 2>&1

notifications:
  irc: "irc.freenode.org#bottlepy"
  on_success: "never"

after_success:
  coveralls

1. 什么是 Travis 和 Coveralls

Github 项目经常会看到类似 图标, 分别对应了 Travis 和 Coveralls.

Travis-CI是一个开源的持续构建项目,同步你在GitHub上托管的项目,每当你Commit Push之后, 就会在几分钟内开始按照你的要求测试部署你的项目, 并跑一遍测试用例.

Coveralls 是用来显示项目代码覆盖率的.

阅读全文 »