cloudoll 云端玩具(python)
文档
Docs: https://cloudoll.chuchur.com
环境准备
- 操作系统:支持 macOS,Linux,Windows
 - 运行环境:最低要求 3.6.0。
 
快速开始
$ mkdir cloudoll-demo && cd cloudoll-demo
$ pip3 install cloudoll
$ vi app.py
app.py 内容如下:
## /app.py
from cloudoll.web import app
if __name__ == "__main__":
    app.create().run()
编写 Controller
$ mkdir -p controllers/home
$ touch controllers/home/__init__.py
$ vi controllers/home/index.py
controllers/home/index.py 内容如下:
# /controllers/home/index.py
from cloudoll.web import get
@get('/')
async def home():
    return {"name": "chuchur" ,"msg": "ok"}
运行:
$ cloudoll start
$ open http://localhost:9001
在浏览器打开 http://127.0.0.1:9001/
就能看到:
{ 
    "name": "chuchur" ,
    "msg": "ok" ,
    "timestamp": 1681993906410 
}
恭喜, 你已经成功的写好了一个 Restful API接口. 
模板渲染
绝大多数情况,我们都需要读取数据后渲染模板,然后呈现给用户。
cloudoll 内置的模板引擎为 jinja2 ,开箱即用。
$ mkdir templates
$ vi templates/index.html
index.html 内容如下:
<!-- /templates/index.html -->
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home</title>
</head>
<body>
    <p>My name is {{name} }</p>
</body>
</html>
修改 /controllers/home/index.py 内容如下:
# /controllers/home/index.py
from cloudoll.web import get, view
@get('/')
async def home():
    data = {"name": "chuchur" ,"msg": "ok"}
    return view("index.html",data)
这时 页面正常渲染 ,可以看到  “My name is chuchur”
恭喜, 你已经成功的写好了一个视图页面.
静态资源
我们想在模版里面嵌入静态资源,如图片,js ,css , 这个时候就得用到静态资源. 我们把这些js ,css ,image  都放到 static 目录
线上环境建议部署到 CDN,或者使用 nginx 等相关服务器
$ mkdir -p static/img
$ mkdir -p static/js
$ mkdir -p static/css
在 img目录 放入在张图 名logo.png
在 js 目录新建 index.js ,内容如下:
点击页面 弹出 "hello world"
// /static/js/index.js
document.addEventListener('DOMContentLoaded',function(){
    document.body.addEventListener('click',function(){
        alert('hello world.')
    })
})
在 css 目录新建 index.css ,内容如下:
 /* /static/css/index.css */
html,body {
    width: 100%;
    height: 100%;
    color: red;
}
修改视图 /templates/index.html ,在 head 引入 静态资源, 内容如下:
<!-- /templates/index.html -->
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" type="image/png" href="/static/img/logo.png"/>
    <link rel="stylesheet" href="/static/css/index.css">
    <script src="/static/js/index.js"></script>
    <title>Home</title>
</head>
<body>
    <p>My name is {{name} }</p>
</body>
</html>
我们新建一个配置文件, 在配置文件里面配置静态 资源.
$ mkdir config
$ vi config/conf.local.yaml
/config/conf.local.yaml 内容如下:
server:
  static:
    prefix: /static
刷新页面之后, 我们所改动即可呈现.
编写 Middleware
假设有个需求:我们的新闻站点,禁止百度爬虫访问。
所以可以通过 Middleware 判断 User-Agent,如下:
$ mkdir middlewares
$ vi middlewares/robot.py
修改 middlewares/robot.py, 内容如下:
# /middlewares/robot.py
from cloudoll.web import middleware, render
import re
@middleware()
def mid_robot():
    async def robot(request, handler):
        ua = request.headers.get('user-agent')
        if re.match('Baiduspider', ua):
            return render(status=403, text="Go away , robot.")
        return await handler(request)
    return robot
重新启动之后, 现在可以使用 curl http://localhost:7001/news -A "Baiduspider" 看看效果。
更多参见中间件文档。
配置文件
写业务的时候,不可避免的需要有配置文件,使用代码管理配置,在代码中添加多个环境的配置,在启动时传入当前环境的参数即可.
cloudoll 支持根据环境来加载配置,定义多个环境的配置文件
config
|- conf.local.yaml
|- conf.prod.yaml
`- conf.test.yaml
我们创建配置文件:
$ mkdir -p config/conf.local.yaml
$ vi config/conf.local.yaml
如下是 mysql 和 server 的配置:
server:
  host: 192.168.0.1
  port: 9001
  static: false
  client_max_size: 1024000
  static: 
    prefix: /static
    show_index: true
    append_version: true
    follow_symlinks: true
database:
  mysql:
    host: 127.0.0.1
    port: 3306
    username: root
    password: abcd
    db: blog
    charset: utf8mb4
默认开发会使用默认的local作为配置。 启动时 通过 env 加载对应的配置。 如 python3 app.py --env=prod 会加载 conf.prod.yaml