Fork von vweb mit Datenmodellierung und -validierung.
Dies ist ein Proof of Concept.
mkdir modules
cd modules
git clone https://github.com/intangere/tea.git
Wahrscheinlich gilt die gesamte normale Verwendung von Vweb.
Dies ist nur ein dünner Wrapper über Vweb, der genug freigibt, um eine Änderung der Routensignaturen zu ermöglichen.
Es gibt viele Beispiele in example.v
Ein einfaches vollständiges Beispiel lautet wie folgt:
Erstellen wir eine /login
-Route, die ein Benutzermodell aufnimmt.
Importieren Sie zunächst tea und deklarieren Sie Ihre App-Variable als solche:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
Definieren Sie Ihr user
:
struct User {
username string
password string
}
Definieren Sie eine Funktion, um zu überprüfen, ob das user
gültig ist:
fn ( user User ) is_valid () bool {
username := user . username . strip_margin ()
password := user . password . strip_margin ()
return username . len > 3 &&
password . len > 8
}
Definieren Sie Ihre /login
Route:
['/ 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 "}')
}
Definieren Sie Ihre Hauptfunktion:
fn main () {
mut app := App {}
}
Jetzt können Sie in dieser Hauptfunktion Ihren user
erstellen.
(Sie könnten dies auch als benannte Funktion definieren)
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 )
}
Der Datenvalidator sollte irgendeine Art von Daten entpacken (in diesem Fall den JSON-Körper der Anforderung), sie validieren und abhängig vom Ergebnis einen Validierungsfehler zurückgeben oder das/die validierte(n) Modell(e) an die Route übergeben.
Jetzt muss die App den Validator kennen und wissen, auf welcher Route er ausgeführt werden soll. Nachdem Sie den Validator deklariert haben, müssen Sie ihn zu app.validators
hinzufügen:
app . validators . validators ['/ login '] = login_validator
Dann führen Sie einfach die App aus, wie Sie es mit Vweb tun würden:
tea . run ( & app , 8080 )
/user/:user_id
mit anderen Parametern kombinieren, muss der URL-Parameter user_id
nach den anderen Parametern stehen. dh // 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)
nimmt einen JSON-String als Eingabe und dekodiert ihn in eine Strukturapp.url_params
stellt die URL-Pfadparameter, sofern anwendbar, als map[string]string
zur Verfügung:user_id
nicht als Parameter verwenden, aber dennoch darauf zugreifentea.from_map<T>(map[string]string)
kann verwendet werden, um app.query in eine Struktur mit Nur-String-Feldern umzuwandelnImmer wenn die Reflexion zur Kompilierungszeit in V vollständiger ist, sollte so etwas möglich sein, das die meisten Interna verbergen würde:
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 )
}