เซิร์ฟเวอร์ Http ในตัวและเอ็นจิ้นภายใน

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

web server ทำหน้าที่เป็นประตูสู่แอปพลิเคชันด้วยความช่วยเหลือซึ่งคำขอและการตอบกลับทั้งหมดจะถูกติดตาม

ในการเริ่มต้นเว็บเซิร์ฟเวอร์ผู้ใช้ต้องทำการโทรต่อไปนี้ -

cherryPy.server.quickstart()

internal engine of CherryPy รับผิดชอบกิจกรรมต่อไปนี้ -

  • การสร้างและการจัดการอ็อบเจ็กต์การร้องขอและการตอบกลับ
  • การควบคุมและจัดการกระบวนการ CherryPy

CherryPy - การกำหนดค่า

เฟรมเวิร์กมาพร้อมกับระบบคอนฟิกูเรชันของตัวเองที่ให้คุณกำหนดพารามิเตอร์เซิร์ฟเวอร์ HTTP การตั้งค่าสำหรับการกำหนดค่าสามารถจัดเก็บไว้ในไฟล์ข้อความที่มีไวยากรณ์ใกล้เคียงกับรูปแบบ INI หรือเป็นพจนานุกรม Python ที่สมบูรณ์

ในการกำหนดค่าอินสแตนซ์เซิร์ฟเวอร์ CherryPy นักพัฒนาจำเป็นต้องใช้ส่วนส่วนกลางของการตั้งค่า

global_conf = {
   'global': {
      'server.socket_host': 'localhost',
      'server.socket_port': 8080,
   },
}

application_conf = {
   '/style.css': {
      'tools.staticfile.on': True,
      'tools.staticfile.filename': os.path.join(_curdir, 'style.css'),
   }
}

This could be represented in a file like this:
[global]
server.socket_host = "localhost"
server.socket_port = 8080
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = "/full/path/to.style.css"

การปฏิบัติตาม HTTP

CherryPy มีการพัฒนาอย่างช้าๆ แต่รวมถึงการรวบรวมข้อมูลจำเพาะของ HTTP ด้วยการสนับสนุน HTTP / 1.0 ในภายหลังการถ่ายโอนด้วยการสนับสนุน HTTP / 1.1

CherryPy ได้รับการกล่าวถึงว่าเป็นไปตามเงื่อนไขกับ HTTP / 1.1 เนื่องจากใช้ทุกระดับที่จำเป็นและจำเป็น แต่ไม่ใช่ทุกระดับที่ควรของข้อกำหนด ดังนั้น CherryPy จึงรองรับคุณสมบัติต่อไปนี้ของ HTTP / 1.1 -

  • หากไคลเอ็นต์อ้างว่าสนับสนุน HTTP / 1.1 ไคลเอ็นต์จะต้องส่งฟิลด์ส่วนหัวในคำขอใด ๆ ที่สร้างด้วยโปรโตคอลเวอร์ชันที่ระบุ หากไม่ดำเนินการ CherryPy จะหยุดดำเนินการตามคำขอทันที

  • CherryPy สร้างฟิลด์ส่วนหัววันที่ซึ่งใช้ในการกำหนดค่าทั้งหมด

  • CherryPy สามารถจัดการรหัสสถานะการตอบกลับ (100) ด้วยการสนับสนุนจากลูกค้า

  • เซิร์ฟเวอร์ HTTP ในตัวของ CherryPy รองรับการเชื่อมต่อแบบต่อเนื่องซึ่งเป็นค่าเริ่มต้นใน HTTP / 1.1 ผ่านการใช้ส่วนหัว Connection: Keep-Alive

  • CherryPy จัดการคำขอและการตอบกลับที่เรียงเป็นกลุ่มอย่างถูกต้อง

  • CherryPy รองรับคำขอในสองวิธีที่แตกต่างกัน - ส่วนหัว If-Modified-Since และ If-Unmodified-Since และส่งการตอบกลับตามคำขอ

  • CherryPy อนุญาตวิธี HTTP ใด ๆ

  • CherryPy จัดการการรวมกันของเวอร์ชัน HTTP ระหว่างไคลเอนต์และการตั้งค่าที่กำหนดไว้สำหรับเซิร์ฟเวอร์

แอ็พพลิเคชันเซิร์ฟเวอร์แบบมัลติเธรด

CherryPy ได้รับการออกแบบตามแนวคิดมัลติเธรด ทุกครั้งที่นักพัฒนาได้รับหรือกำหนดค่าลงในเนมสเปซ CherryPy จะมีการดำเนินการในสภาพแวดล้อมแบบมัลติเธรด

ทั้ง cherrypy.request และ cherrypy.response เป็นที่เก็บข้อมูลแบบเธรดซึ่งหมายความว่าแอปพลิเคชันของคุณเรียกใช้โดยอิสระโดยการรู้ว่าคำขอใดเป็นพร็อกซีผ่านทางรันไทม์

แอ็พพลิเคชันเซิร์ฟเวอร์ที่ใช้รูปแบบเธรดไม่ได้รับการพิจารณาอย่างสูงเนื่องจากการใช้เธรดถูกมองว่าเป็นการเพิ่มโอกาสที่จะเกิดปัญหาเนื่องจากข้อกำหนดในการซิงโครไนซ์

ทางเลือกอื่น ๆ ได้แก่ -

รูปแบบหลายกระบวนการ

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

รูปแบบอะซิงโครนัส

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

การส่ง URL

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

  • แอปพลิเคชันที่ใช้ในการพัฒนาวิธี HTTP (รับโพสต์วาง ฯลฯ )
  • เส้นทางที่กำหนดเส้นทางใน URL - Routes Dispatcher

HTTP Method Dispatcher

ในบางแอ็พพลิเคชัน URI ไม่ขึ้นอยู่กับการดำเนินการซึ่งเซิร์ฟเวอร์จะดำเนินการบนทรัพยากร

ตัวอย่างเช่น,http://xyz.com/album/delete/10

URI ประกอบด้วยการดำเนินการที่ลูกค้าต้องการดำเนินการ

โดยค่าเริ่มต้นผู้มอบหมายงาน CherryPy จะแมปด้วยวิธีต่อไปนี้ -

album.delete(12)

ผู้มอบหมายงานที่กล่าวถึงข้างต้นถูกกล่าวถึงอย่างถูกต้อง แต่สามารถทำให้เป็นอิสระได้ด้วยวิธีต่อไปนี้ -

http://xyz.com/album/10

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

DELETE /album/12 HTTP/1.1

Routes Dispatcher

นี่คือรายการพารามิเตอร์สำหรับวิธีการที่จำเป็นในการจัดส่ง -

  • พารามิเตอร์ name คือชื่อเฉพาะสำหรับเส้นทางที่จะเชื่อมต่อ

  • เส้นทางคือรูปแบบที่ตรงกับ URI

  • คอนโทรลเลอร์คืออินสแตนซ์ที่มีตัวจัดการเพจ

  • การใช้ Routes dispatcher จะเชื่อมต่อรูปแบบที่ตรงกับ URI และเชื่อมโยงตัวจัดการเพจเฉพาะ

ตัวอย่าง

ให้เรายกตัวอย่างเพื่อทำความเข้าใจวิธีการทำงาน -

import random
import string
import cherrypy

class StringMaker(object):
   @cherrypy.expose
   def index(self):
      return "Hello! How are you?"
   
   @cherrypy.expose
   def generate(self, length=9):
      return ''.join(random.sample(string.hexdigits, int(length)))
		
if __name__ == '__main__':
   cherrypy.quickstart(StringMaker ())

ทำตามขั้นตอนด้านล่างเพื่อรับผลลัพธ์ของโค้ดด้านบน -

Step 1 - บันทึกไฟล์ที่กล่าวถึงข้างต้นเป็นไฟล์ tutRoutes.py.

Step 2 - ไปที่ URL ต่อไปนี้ -

http://localhost:8080/generate?length=10

Step 3 - คุณจะได้รับผลลัพธ์ต่อไปนี้ -