tea
1.0.0
vweb 的分支,具有資料建模和驗證功能。
這是一個概念證明。
mkdir modules
cd modules
git clone https://github.com/intangere/tea.git
可能 Vweb 的所有正常用法都適用。
這只是 Vweb 之上的一個薄包裝,它暴露了足夠的內容以允許更改路由簽名。
example.v有很多例子
一個簡單完整的例子如下:
讓我們建立一個接受使用者模型的/login
路由。
首先導入 tea 並聲明您的應用程式變量,如下所示:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
定義您的user
模型:
struct User {
username string
password string
}
定義一個函數來檢查user
模型是否有效:
fn ( user User ) is_valid () bool {
username := user . username . strip_margin ()
password := user . password . strip_margin ()
return username . len > 3 &&
password . len > 8
}
定義您的/login
路由:
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
定義你的主要功能:
fn main () {
mut app := App {}
}
現在,在該主函數中,您可以建立user
資料驗證器。
(您也可以將其定義為命名函數)
login_validator := fn ( mut app App ) {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
app . login ( model )
}
資料驗證器應該解壓縮某種資料(在本例中為請求 json 正文),對其進行驗證,並根據結果傳回驗證錯誤或將驗證後的模型傳遞給路由。
現在應用程式需要了解驗證器以及在哪一條路由上運行它。因此,在聲明驗證器後,您需要將其新增至app.validators
:
app . validators . validators ['/ login '] = login_validator
然後就像使用 Vweb 一樣運行該應用程式:
tea . run ( & app , 8080 )
/user/:user_id
等 url 參數與其他參數組合,則 url 參數user_id
必須位於其他參數之後。 IE // this will not compile (with or without a validator defined. However it does require one)
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string , user User ) {
}
// this will compile with or without a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string ) {
}
// this will compile with a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id int ) {
}
// this is how it has to be defined and will compile (requires a validator defined for /user/:user_id)
['/ user / : user_id ']
fn ( mut app App ) user ( user User , user_id string ) {
}
tea.decode_model<T>(string)
將 json 字串作為輸入並將其解碼為結構體app.url_params
當適用於map[string]string
時公開 url 路徑參數:user_id
作為參數但仍可以存取它的經過驗證的路由tea.from_map<T>(map[string]string)
可用於取得 app.query 並將其轉換為僅包含字串欄位的結構每當 V 中的編譯時反射更加完整時,應該可能會出現這樣的情況,這將隱藏大部分內部結構:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
['/ login '; validator ]
fn ( mut app App ) login_validator () User {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
return model
}
fn main () {
mut app := App {}
tea . run ( & app , 8080 )
}