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