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 พร้อมกับผลลัพธ์จะกล่าวถึงในบทถัดไป