Web2py - หลัก
ตัวเลือกบรรทัดคำสั่ง
เราได้เรียนรู้วิธีการเริ่มต้นเซิร์ฟเวอร์ web2py โดยใช้วิดเจ็ต GUI ในบทที่แล้ว
วิดเจ็ตนี้สามารถข้ามได้โดยเริ่มต้นเซิร์ฟเวอร์จาก command line พรอมต์
python web2py.py -a 'รหัสผ่านของคุณ' -i 127.0.0.1 -p 8000
เมื่อใดก็ตามที่เซิร์ฟเวอร์ web2py เริ่มทำงานเซิร์ฟเวอร์จะสร้างไฟล์ "parameters_8000.py"โดยที่รหัสผ่านทั้งหมดจะถูกเก็บไว้ในรูปแบบที่แฮช
เพื่อความปลอดภัยเพิ่มเติมสามารถใช้บรรทัดคำสั่งต่อไปนี้ -
python web2py.py -a '<recycle>' -i 127.0.0.1 -p 8000
สำหรับสถานการณ์ข้างต้น web2py จะใช้รหัสผ่านที่แฮชที่เก็บไว้ใน "parameters_8000.py".
ในกรณีถ้าไฟล์ "parameters_8000.py"ถูกลบโดยไม่ได้ตั้งใจหรือเนื่องจากสาเหตุอื่น ๆ อินเทอร์เฟซการดูแลระบบบนเว็บถูกปิดใช้งานใน web2py
การแมป URL / การจัดส่ง
การทำงานของ web2py ขึ้นอยู่กับ model-view-controller ซึ่งแมป URL ในรูปแบบเฉพาะ - http://127.0.0.1:8000/a/d/f.html
เส้นทางไปจนถึงฟังก์ชัน “f()” กล่าวถึงในคอนโทรลเลอร์ d.pyอยู่ภายใต้แอปพลิเคชันชื่อ“ a” หากไม่มีตัวควบคุมในแอปพลิเคชัน web2py จะใช้ตัวควบคุมเริ่มต้นที่ชื่อ“default.py”.
หากไม่มีฟังก์ชันตามที่ระบุใน URL แสดงว่าฟังก์ชันเริ่มต้นที่เรียกว่า init()ถูกนำมาใช้. การทำงานของ URL แสดงตามแผนผังในภาพด้านล่าง
ส่วนขยาย .htmlเป็นทางเลือกสำหรับ URL ส่วนขยายกำหนดส่วนขยายของViewที่แสดงผลลัพธ์ของฟังก์ชันที่กำหนดไว้ในคอนโทรลเลอร์ เนื้อหาเดียวกันให้บริการในหลายรูปแบบเช่น html, xml, json, rss เป็นต้น
การร้องขอถูกส่งผ่านโดยขึ้นอยู่กับฟังก์ชันซึ่งยอมรับอาร์กิวเมนต์และให้ผลลัพธ์ที่เหมาะสมแก่ผู้ใช้ เป็นตัวควบคุมซึ่งโต้ตอบกับโมเดลและมุมมองของแอปพลิเคชันเพื่อให้ได้ผลลัพธ์ตามความต้องการของผู้ใช้
web2py - เวิร์กโฟลว์
ขั้นตอนการทำงานของ web2py จะกล่าวถึงด้านล่าง -
เว็บเซิร์ฟเวอร์จะจัดการคำขอ HTTP แต่ละรายการพร้อมกันในเธรดของตนเอง
ส่วนหัวของคำขอ HTTP จะถูกแยกวิเคราะห์และส่งผ่านไปยังผู้มอบหมายงาน
Dispatcher จัดการคำขอแอปพลิเคชันและแมปไฟล์ PATH_INFOใน URL ของการเรียกใช้ฟังก์ชัน ทุกการเรียกใช้ฟังก์ชันจะแสดงใน URL
คำขอทั้งหมดสำหรับไฟล์ที่รวมอยู่ในโฟลเดอร์แบบคงที่ได้รับการจัดการโดยตรงและไฟล์ขนาดใหญ่จะถูกสตรีมไปยังไคลเอนต์
การร้องขอสิ่งใดก็ตามยกเว้นไฟล์แบบคงที่จะถูกแมปลงในการดำเนินการ
หากส่วนหัวของคำขอมีคุกกี้เซสชันสำหรับแอปวัตถุเซสชันจะถูกเรียกคืน หรือมิฉะนั้นรหัสเซสชันจะถูกสร้างขึ้น
หากการดำเนินการส่งคืนค่าเป็นสตริงค่านี้จะส่งกลับไปยังไคลเอ็นต์
หากการดำเนินการส่งคืนสามารถทำซ้ำได้จะใช้เพื่อวนซ้ำและสตรีมข้อมูลไปยังไคลเอนต์
แบบจำลองเงื่อนไข
ในบทที่แล้วเราเห็นการทำงานของไฟล์ Controllers. web2py ใช้โมเดลมุมมองและคอนโทรลเลอร์ในแต่ละแอปพลิเคชัน ดังนั้นจึงจำเป็นต้องเข้าใจการทำงานของไฟล์Model.
ไม่เหมือนกับแอปพลิเคชัน MVC อื่น ๆ โมเดลใน web2py จะถือว่าเป็นไปตามเงื่อนไข โมเดลในโฟลเดอร์ย่อยจะถูกดำเนินการตามการใช้งานของคอนโทรลเลอร์ สิ่งนี้สามารถแสดงให้เห็นได้ด้วยตัวอย่างต่อไปนี้ -
พิจารณา URL - http://127.0.0.1:8000/a/d/f.html
ในกรณีนี้, ‘a’ เป็นชื่อของแอปพลิเคชัน ‘d’ คือชื่อตัวควบคุมและ f()เป็นฟังก์ชันที่เกี่ยวข้องกับคอนโทรลเลอร์ รายชื่อรุ่นที่จะดำเนินการมีดังนี้ -
applications/a/models/*.py
applications/a/models/d/*.py
applications/a/models/d/f/*.py
ห้องสมุด
web2py มีไลบรารีซึ่งสัมผัสกับแอปพลิเคชันทั้งหมดเป็นวัตถุ วัตถุเหล่านี้ถูกกำหนดภายในไฟล์หลักภายใต้ไดเร็กทอรีชื่อ "gluon"
หลายโมดูลเช่นเทมเพลต DAL ไม่มีการอ้างอิงและสามารถนำไปใช้นอกกรอบของ web2py นอกจากนี้ยังรักษาการทดสอบหน่วยซึ่งถือเป็นแนวปฏิบัติที่ดี
การใช้งาน
แอปพลิเคชัน web2py แสดงอยู่ด้านล่างในรูปแบบไดอะแกรม
Applications พัฒนาใน web2py ประกอบด้วยส่วนต่างๆดังต่อไปนี้ -
Models - แสดงข้อมูลและตารางฐานข้อมูล
Controllers - อธิบายตรรกะของแอปพลิเคชันและขั้นตอนการทำงาน
Views - ช่วยในการแสดงผลการแสดงข้อมูล
Languages - อธิบายวิธีการแปลสตริงในแอปพลิเคชันเป็นภาษาต่างๆที่รองรับ
Static files - ไม่ต้องการการประมวลผล (เช่นรูปภาพสไตล์ชีท CSS เป็นต้น)
ABOUT และ README - รายละเอียดโครงการ.
Errors - จัดเก็บรายงานข้อผิดพลาดที่สร้างโดยแอปพลิเคชัน
Sessions - จัดเก็บข้อมูลที่เกี่ยวข้องกับผู้ใช้แต่ละคน
Databases - จัดเก็บฐานข้อมูล SQLite และข้อมูลตารางเพิ่มเติม
Cache - จัดเก็บรายการแอปพลิเคชันที่แคชไว้
Modules - โมดูลเป็นโมดูล Python เสริมอื่น ๆ
Private - ไฟล์ที่รวมอยู่นั้นเข้าถึงได้โดยคอนโทรลเลอร์ แต่ไม่ใช่โดยนักพัฒนาโดยตรง
Uploads - ไฟล์ถูกเข้าถึงโดยโมเดล แต่ไม่ได้รับการเข้าถึงโดยตรงจากผู้พัฒนา
API
ใน web2py models, controllers และ views ถูกดำเนินการในสภาพแวดล้อมที่มีการนำเข้าวัตถุบางอย่างสำหรับนักพัฒนา
Global Objects - คำขอการตอบสนองเซสชันแคช
Helpers- web2py มีคลาสตัวช่วยซึ่งสามารถใช้สร้าง HTML โดยใช้โปรแกรม มันสอดคล้องกับแท็ก HTML เรียกว่า“HTML helpers”.
ตัวอย่างเช่น A, B, FIELDSET, FORM เป็นต้น
เซสชัน
เซสชันสามารถกำหนดให้เป็นที่เก็บข้อมูลฝั่งเซิร์ฟเวอร์ซึ่งจะคงอยู่ตลอดการโต้ตอบของผู้ใช้ตลอดทั้งเว็บแอปพลิเคชัน
เซสชันใน web2py เป็นอินสแตนซ์ของคลาสพื้นที่เก็บข้อมูล
ตัวอย่างเช่นตัวแปรสามารถเก็บไว้ในเซสชันเป็น
session.myvariable = "hello"
ค่านี้สามารถเรียกคืนเป็น
a = session.myvariable
ค่าของตัวแปรสามารถเรียกคืนได้ตราบเท่าที่โค้ดถูกเรียกใช้ในเซสชันเดียวกันโดยผู้ใช้คนเดียวกัน
หนึ่งในวิธีการที่สำคัญใน web2py สำหรับเซสชันคือ “forget” -
session.forget(response);
มันสั่งให้ web2py ไม่บันทึกเซสชัน
ทำงานในพื้นหลัง
คำขอ HTTP มาถึงเว็บเซิร์ฟเวอร์ซึ่งจัดการแต่ละคำขอในเธรดของตัวเองแบบขนาน งานซึ่งมีการใช้งานอยู่จะเกิดขึ้นในส่วนหน้าในขณะที่งานอื่น ๆ จะอยู่เบื้องหลัง การจัดการงานเบื้องหลังเป็นหนึ่งในคุณสมบัติหลักของ web2py
ควรเก็บงานที่ต้องใช้เวลามากในพื้นหลัง กลไกบางอย่างมีการระบุไว้ดังต่อไปนี้ซึ่งจัดการงานเบื้องหลัง -
CRON
Queues
Scheduler
CRON
ใน web2py CRONให้ความสามารถในการรันงานภายในช่วงเวลาที่กำหนด แต่ละแอปพลิเคชันมีไฟล์ CRON ซึ่งกำหนดฟังก์ชันการทำงาน
เครื่องมือจัดกำหนดการ
ตัวกำหนดตารางเวลาในตัวช่วยในการรันงานในพื้นหลังโดยการตั้งค่าลำดับความสำคัญ มีกลไกในการสร้างกำหนดเวลาและปรับเปลี่ยนงาน
เหตุการณ์ที่กำหนดเวลาไว้จะแสดงรายการในโมเดลที่มีชื่อไฟล์ “scheduler.py”.
การสร้างแอปพลิเคชัน
เรามีภาพรวมของการสร้างโมเดลและคอนโทรลเลอร์ใน web2py ที่นี่เราจะมุ่งเน้นไปที่การสร้างแอปพลิเคชันที่ชื่อ“Contacts”. แอปพลิเคชันจำเป็นต้องรักษารายชื่อ บริษัท และรายชื่อบุคคลที่ทำงานใน บริษัท เหล่านั้น
การสร้างแบบจำลอง
ที่นี่การระบุตารางสำหรับพจนานุกรมข้อมูลเป็นแบบจำลอง โมเดลสำหรับแอปพลิเคชันผู้ติดต่อจะถูกสร้างขึ้นภายใต้ "models” โฟลเดอร์ ไฟล์ถูกเก็บไว้ในmodels/db_contacts.py.
# in file: models/db_custom.py
db.define_table('company', Field('name', notnull = True, unique = True), format = '%(name)s')
db.define_table(
'contact',
Field('name', notnull = True),
Field('company', 'reference company'),
Field('picture', 'upload'),
Field('email', requires = IS_EMAIL()),
Field('phone_number', requires = IS_MATCH('[\d\-\(\) ]+')),
Field('address'),
format = '%(name)s'
)
db.define_table(
'log',
Field('body', 'text', notnull = True),
Field('posted_on', 'datetime'),
Field('contact', 'reference contact')
)
เมื่อสร้างไฟล์ด้านบนแล้วคุณสามารถเข้าถึงตารางได้ด้วยความช่วยเหลือของ URL http://127.0.0.1:8000/contacts/appadmin
การสร้างตัวควบคุม
Controller จะรวมฟังก์ชั่นบางอย่างสำหรับการแสดงรายการแก้ไขและลบรายชื่อ
# in file: controllers/default.py
def index():return locals()
def companies():companies = db(db.company).select(orderby = db.company.name)
return locals()
def contacts():company = db.company(request.args(0)) or redirect(URL('companies'))
contacts = db(db.contact.company == company.id).select(orderby = db.contact.name)
return locals()
@auth.requires_login()
def company_create():form = crud.create(db.company, next = 'companies')
return locals()
@auth.requires_login()
def company_edit():company = db.company(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.company, company, next='companies')
return locals()
@auth.requires_login()
def contact_create():db.contact.company.default = request.args(0)
form = crud.create(db.contact, next = 'companies')
return locals()
@auth.requires_login()
def contact_edit():contact = db.contact(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.contact, contact, next = 'companies')
return locals()
def user():return dict(form = auth())
การสร้างไฟล์ view พร้อมกับผลลัพธ์จะกล่าวถึงในบทถัดไป