文檔: https://docs.masoniteproject.com/
初次體驗架構,感覺裡邊提供了豐富的指令行工具可以快速開發,
主要是ORM很棒,差別于
Python 生态 Django 等的ORM,和PHP的 laravel 很像,簡單高效一、環境配置
環境
Python 3.4+
masonite 2.2.26
masonite-cli 2.2.2
安裝
$ pip install masonite-cli
$ craft # 檢視幫助
二、建立一個項目
# 1、建立項目
craft new project_name
cd project_name
# 2、安裝依賴
craft install
# 3、啟動服務
craft serve
通路:
http://127.0.0.1:8000/出現歡迎界面
三、示例1:Hello World
1、建立控制器
$ craft controller Index
app/http/controllers/IndexController.py
"""A IndexController Module."""
from masonite.request import Request
from masonite.view import View
from masonite.controllers import Controller
class IndexController(Controller):
"""IndexController Controller Class."""
def __init__(self, request: Request):
"""IndexController Initializer
Arguments:
request {masonite.request.Request} -- The Masonite Request class.
"""
self.request = request
def show(self, view: View):
return "Hello world"
2、配置路由
routes/web.py
"""Web Routes."""
from masonite.routes import Get, Post
ROUTES = [
Get('/', 'IndexController@show'),
]
masonite預設會自動重新開機服務
再次通路
顯示:Hello world
示例2:建立TODOLIST項目
1、配置資料庫,使用sqlite
.env
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=data.db
DB_USERNAME=root
DB_PASSWORD=root
DB_LOG=True
2、建立遷移檔案
$ craft migration create_todolist_table --create todolist
設定3個字段:id,title,complete_time
databases/migrations/create_todolist_table.py
from orator.migrations import Migration
class CreateTodolistTable(Migration):
def up(self):
"""
Run the migrations.
"""
with self.schema.create('todolist') as table:
table.increments('id')
table.string('title')
table.datetime('complete_time').nullable() # 可以為null
table.timestamps()
def down(self):
"""
Revert the migrations.
"""
self.schema.drop('todolist')
遷移資料, 建表
$ craft migrate
檢視建表語句
CREATE TABLE "todolist" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" VARCHAR NOT NULL,
"complete_time" DATETIME NULL,
"created_at" DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
"updated_at" DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
);
可以看到預設多加了2個字段:created_at,updated_at
3、建立Model
$ craft model TodoList
稍作修改
app/TodoList.py
"""TodoList Model."""
from config.database import Model
class TodoList(Model):
"""TodoList Model."""
# 查詢資料庫的時候會在類名後加s,是以自定義表名
__table__ = "todolist"
# 要寫入的字段
__fillable__ = ['title', 'complete_time']
4、建立模闆
$ craft view index
$ craft view detail
其中模闆引擎使用的是 Jinja2
resources/templates/index.html
<h1>TODO LIST</h1>
<a href="/add"><button>添加</button></a>
<a href="/truncate"><button>清空</button></a>
<table border="1">
<thead>
<tr>
<td>序号</td>
<td>任務</td>
<td>完成時間</td>
<td>編輯</td>
<td>删除</td>
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr>
<td>{{ row.id }} </td>
<td>{{ row.title }} </td>
{% if row.complete_time %}
<td>{{ row.complete_time }}</td>
{% else %}
<td>
<a href="/complete/{{ row.id }}">
<button>完成</button>
</a>
</td>
{% endif %}
<td><a href="/edit/{{ row.id }}">
<button>修改</button>
</a></td>
<td><a href="/delete/{{ row.id }}">
<button>删除</button>
</a></td>
</tr>
{% endfor %}
</tbody>
</table>
resources/templates/edit.html
<form action="/save" method="post">
{{ csrf_field }}
<input type="hidden" name="id" id="title" value="{{ row.id }}">
<label for="title"></label>
<input type="text" name="title" id="title" value="{{ row.title }}">
<input type="submit" value="送出">
</form>
5、編寫對應的控制器方法
"""A IndexController Module."""
from masonite.request import Request
from masonite.view import View
from masonite.controllers import Controller
from app.TodoList import TodoList
from datetime import datetime
class IndexController(Controller):
"""IndexController Controller Class."""
def __init__(self, request: Request, view: View):
"""IndexController Initializer
Arguments:
request {masonite.request.Request} -- The Masonite Request class.
"""
self.request = request
self.view = view
def index(self):
rows = TodoList.all()
return self.view.render('index', {"rows": rows})
def save(self):
uid = self.request.input("id")
title = self.request.input("title")
if uid:
TodoList.where('id', '=', uid).update({'title': title})
else:
TodoList.create(title=title)
return self.request.redirect("/")
def detail(self):
uid = self.request.param("id")
row = TodoList.find(uid)
return self.view.render('edit', {"row": row})
def delete(self):
uid = self.request.param("id")
TodoList.find(uid).delete()
return self.request.redirect("/")
def complete(self):
uid = self.request.param("id")
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
TodoList.where('id', '=', uid).update({'complete_time': current_time})
return self.request.redirect("/")
def truncate(self):
TodoList.truncate()
return self.request.redirect("/")
6、配置路由檔案
"""Web Routes."""
from masonite.routes import Get, Post
ROUTES = [
Get('/', 'IndexController@index'),
Get('/add', 'IndexController@detail'),
Get('/edit/@id', 'IndexController@detail'),
Get('/delete/@id', 'IndexController@delete'),
Get('/complete/@id', 'IndexController@complete'),
Get('/truncate', 'IndexController@truncate'),
Post('/save', 'IndexController@save'),
]
7、界面展示
參考文章
https://docs.masoniteproject.com/creating-a-blog