شوكة vweb مع نمذجة البيانات والتحقق من صحتها.
وهذا دليل على المفهوم.
mkdir modules
cd modules
git clone https://github.com/intangere/tea.git
ربما ينطبق كل الاستخدام العادي لـ Vweb.
هذا مجرد غلاف رفيع أعلى Vweb يعرض ما يكفي للسماح بتغيير توقيعات المسار.
هناك الكثير من الأمثلة في example.v
مثال كامل بسيط هو كما يلي:
لنقم بإنشاء مسار /login
يأخذ نموذج المستخدم.
قم أولاً باستيراد الشاي والإعلان عن متغير التطبيق الخاص بك على هذا النحو:
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 user_id
بعد المعلمات الأخرى. أي // 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
معلمات مسار عنوان URL عندما تكون قابلة للتطبيق map[string]string
: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 )
}