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 )
}