CherryPy - บริการทางเว็บ

บริการเว็บคือชุดของส่วนประกอบบนเว็บที่ช่วยในการแลกเปลี่ยนข้อมูลระหว่างแอปพลิเคชันหรือระบบซึ่งรวมถึงโปรโตคอลและมาตรฐานแบบเปิดด้วย สามารถเผยแพร่ใช้งานและพบได้บนเว็บ

บริการเว็บมีหลากหลายประเภทเช่น RWS (RESTfUL Web Service), WSDL, SOAP และอื่น ๆ อีกมากมาย

REST - การถ่ายโอนสถานะตัวแทน

ประเภทของโปรโตคอลการเข้าถึงระยะไกลซึ่งถ่ายโอนสถานะจากไคลเอนต์ไปยังเซิร์ฟเวอร์ซึ่งสามารถใช้เพื่อจัดการสถานะแทนการเรียกโพรซีเดอร์ระยะไกล

  • ไม่กำหนดการเข้ารหัสหรือโครงสร้างเฉพาะและวิธีการส่งคืนข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์

  • ใช้ "กริยา" HTTP เพื่อดำเนินการโอนสถานะ

  • ทรัพยากรถูกระบุโดยไม่ซ้ำกันโดยใช้ URL

  • ไม่ใช่ API แต่เป็นเลเยอร์การขนส่ง API แทน

REST รักษาระบบการตั้งชื่อของทรัพยากรบนเครือข่ายและจัดเตรียมกลไกแบบรวมเพื่อดำเนินการกับทรัพยากรเหล่านี้ ทรัพยากรแต่ละรายการถูกระบุโดยตัวระบุอย่างน้อยหนึ่งตัว หากโครงสร้างพื้นฐาน REST ถูกนำไปใช้กับฐานของ HTTP ตัวระบุเหล่านี้จะถูกเรียกว่าเป็นUniform Resource Identifiers (URIs).

ต่อไปนี้เป็นชุดย่อยทั่วไปสองชุดของชุด URI -

ชุดย่อย แบบเต็ม ตัวอย่าง
URL Uniform Resource Locator http://www.gmail.com/
โกศ ชื่อทรัพยากรที่เหมือนกัน โกศ: isbn: 0-201-71088-9 โกศ: uuid: 13e8cf26-2a25-11db-8693-000ae4ea7d46

ก่อนที่จะทำความเข้าใจกับการใช้สถาปัตยกรรม CherryPy เรามาดูสถาปัตยกรรมของ CherryPy กันก่อน

CherryPy มีส่วนประกอบสามอย่างต่อไปนี้ -

  • cherrypy.engine - ควบคุมการเริ่มต้นกระบวนการ / การรื้อถอนและการจัดการเหตุการณ์

  • cherrypy.server - กำหนดค่าและควบคุมเซิร์ฟเวอร์ WSGI หรือ HTTP

  • cherrypy.tools - กล่องเครื่องมือของยูทิลิตี้ที่ตั้งฉากกันเพื่อประมวลผลคำขอ HTTP

REST Interface ผ่าน CherryPy

บริการเว็บ RESTful ใช้สถาปัตยกรรม CherryPy แต่ละส่วนด้วยความช่วยเหลือดังต่อไปนี้ -

  • Authentication
  • Authorization
  • Structure
  • Encapsulation
  • การจัดการข้อผิดพลาด

การรับรองความถูกต้อง

การพิสูจน์ตัวตนช่วยในการตรวจสอบผู้ใช้ที่เรากำลังโต้ตอบด้วย CherryPy มีเครื่องมือสำหรับจัดการวิธีการตรวจสอบสิทธิ์แต่ละวิธี

def authenticate():
   if not hasattr(cherrypy.request, 'user') or cherrypy.request.user is None:
      # < Do stuff to look up your users >
		
      cherrypy.request.authorized = False # This only authenticates. 
         Authz must be handled separately.
		
      cherrypy.request.unauthorized_reasons = []
      cherrypy.request.authorization_queries = []
		
cherrypy.tools.authenticate = \
   cherrypy.Tool('before_handler', authenticate, priority=10)

ฟังก์ชันข้างต้น authenticate () จะช่วยตรวจสอบการมีอยู่ของไคลเอ็นต์หรือผู้ใช้ เครื่องมือในตัวช่วยให้กระบวนการเสร็จสมบูรณ์อย่างเป็นระบบ

การอนุญาต

การอนุญาตช่วยในการรักษาความถูกต้องของกระบวนการผ่าน URI กระบวนการนี้ยังช่วยในการปรับเปลี่ยนวัตถุตามโอกาสในการขายโทเค็นของผู้ใช้

def authorize_all():
   cherrypy.request.authorized = 'authorize_all'
	
cherrypy.tools.authorize_all = cherrypy.Tool('before_handler', authorize_all, priority=11)

def is_authorized():
   if not cherrypy.request.authorized:
      raise cherrypy.HTTPError("403 Forbidden",
         ','.join(cherrypy.request.unauthorized_reasons))
			
cherrypy.tools.is_authorized = cherrypy.Tool('before_handler', is_authorized, 
priority = 49)

cherrypy.config.update({
   'tools.is_authorized.on': True,
   'tools.authorize_all.on': True
})

เครื่องมือการอนุญาตในตัวช่วยในการจัดการกิจวัตรอย่างเป็นระบบดังที่กล่าวไว้ในตัวอย่างก่อนหน้านี้

โครงสร้าง

การรักษาโครงสร้างของ API ช่วยในการลดภาระงานในการทำแผนที่ URI ของแอปพลิเคชัน จำเป็นต้องรักษา API ให้ค้นพบและสะอาดอยู่เสมอ โครงสร้างพื้นฐานของ API สำหรับกรอบงาน CherryPy ควรมีดังต่อไปนี้ -

  • บัญชีและผู้ใช้
  • Autoresponder
  • Contact
  • File
  • Folder
  • รายการและฟิลด์
  • ข้อความและแบทช์

การห่อหุ้ม

Encapsulation ช่วยในการสร้าง API ซึ่งมีน้ำหนักเบามนุษย์สามารถอ่านได้และเข้าถึงได้โดยไคลเอนต์ต่างๆ รายการของรายการพร้อมกับการสร้างการเรียกคืนการอัปเดตและการลบจำเป็นต้องมีการห่อหุ้ม API

การจัดการข้อผิดพลาด

กระบวนการนี้จะจัดการข้อผิดพลาดหากมีหาก API ไม่สามารถดำเนินการได้ตามสัญชาตญาณเฉพาะ ตัวอย่างเช่น 400 เป็นคำขอที่ไม่ถูกต้องและ 403 เป็นคำขอที่ไม่ได้รับอนุญาต

ตัวอย่าง

พิจารณาสิ่งต่อไปนี้เป็นตัวอย่างสำหรับฐานข้อมูลการตรวจสอบความถูกต้องหรือข้อผิดพลาดของแอปพลิเคชัน

import cherrypy
import json

def error_page_default(status, message, traceback, version):
   ret = {
      'status': status,
      'version': version,
      'message': [message],
      'traceback': traceback
   }
	
   return json.dumps(ret)
	
class Root:
   _cp_config = {'error_page.default': error_page_default}
	
@cherrypy.expose
   def index(self):
      raise cherrypy.HTTPError(500, "Internal Sever Error")
cherrypy.quickstart(Root())

โค้ดด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -

การจัดการ API (Application Programming Interface) ทำได้ง่ายผ่าน CherryPy เนื่องจากมีเครื่องมือการเข้าถึงในตัว

วิธี HTTP

รายการวิธีการ HTTP ที่ดำเนินการกับทรัพยากรมีดังนี้ -

ส. เลขที่ วิธีการและการทำงานของ HTTP
1.

HEAD

ดึงข้อมูลเมตาของทรัพยากร

2.

GET

ดึงข้อมูลเมตาของทรัพยากรและเนื้อหา

3.

POST

ร้องขอเซิร์ฟเวอร์เพื่อสร้างรีซอร์สใหม่โดยใช้ข้อมูลที่อยู่ในเนื้อหาคำร้องขอ

4.

PUT

ร้องขอเซิร์ฟเวอร์เพื่อแทนที่รีซอร์สที่มีอยู่ด้วยรีซอร์สที่แนบมาในเนื้อหาคำร้องขอ

5.

DELETE

ร้องขอให้เซิร์ฟเวอร์ลบทรัพยากรที่ระบุโดย URI นั้น

6.

OPTIONS

ร้องขอให้เซิร์ฟเวอร์ส่งคืนรายละเอียดเกี่ยวกับความสามารถทั้งแบบทั่วโลกหรือเฉพาะสำหรับทรัพยากร

Atom Publishing Protocol (APP)

APP เกิดขึ้นจากชุมชน Atom เป็นโปรโตคอลระดับแอปพลิเคชันที่อยู่ด้านบนของ HTTP เพื่ออนุญาตให้เผยแพร่และแก้ไขทรัพยากรบนเว็บ หน่วยของข้อความระหว่างเซิร์ฟเวอร์ APP และไคลเอนต์ขึ้นอยู่กับรูปแบบเอกสาร Atom XML

Atom Publishing Protocol กำหนดชุดของการดำเนินการระหว่างบริการ APP และตัวแทนผู้ใช้โดยใช้ HTTP และกลไกและรูปแบบเอกสาร Atom XML เป็นหน่วยของข้อความ

ก่อนอื่นแอปจะกำหนดเอกสารบริการซึ่งจะให้ URI ของคอลเลกชันต่างๆที่ให้บริการโดยบริการ APP แก่ตัวแทนผู้ใช้

ตัวอย่าง

ให้เราดูตัวอย่างเพื่อสาธิตการทำงานของ APP -

<?xml version = "1.0" encoding = "UTF-8"?>
<service xmlns = "http://purl.org/atom/app#" xmlns:atom = "http://www.w3.org/2005/Atom">
   
   <workspace>
      <collection href = "http://host/service/atompub/album/">
         <atom:title> Albums</atom:title>
         <categories fixed = "yes">
            <atom:category term = "friends" />
         </categories>
      </collection>
      
      <collection href = "http://host/service/atompub/film/">
         <atom:title>Films</atom:title>
         <accept>image/png,image/jpeg</accept>
      </collection>
   </workspace>
	
</service>

APP ระบุวิธีดำเนินการ CRUD พื้นฐานกับสมาชิกของคอลเล็กชันหรือตัวรวบรวมโดยใช้วิธี HTTP ตามที่อธิบายไว้ในตารางต่อไปนี้ -

การดำเนินการ วิธี HTTP รหัสสถานะ เนื้อหา
ดึงข้อมูล รับ 200 รายการ Atom ที่แสดงถึงทรัพยากร
สร้าง โพสต์ 201 URI ของทรัพยากรที่สร้างขึ้นใหม่ผ่านส่วนหัว Location และ Content-Location
อัปเดต วาง 200 รายการ Atom ที่แสดงถึงทรัพยากร
ลบ ลบ 200 ไม่มี