บริบทคำขอทั่วโลก - รูปแบบต่อต้าน?


12

ฉันได้พูดคุยกับเพื่อนร่วมงานของฉันในวันนี้เกี่ยวกับโครงร่างเว็บของ Python และความประทับใจของเราที่มีต่อพวกเขา ฉันบอกเขาว่าฉันคิดว่า Flask ที่มีคำขอทั่วโลกมีกลิ่นไม่ดีและเป็นรูปแบบการต่อต้าน

เอกสารพูดเกี่ยวกับบริบทคำขอ:

ในทางตรงกันข้ามระหว่างการจัดการคำขอมีกฎอื่นอยู่สองข้อ:

  • ในขณะที่คำขอใช้งานอยู่วัตถุบริบทท้องถิ่น (flask.request และอื่น ๆ ) ชี้ไปที่คำขอปัจจุบัน
  • รหัสใด ๆ สามารถถือวัตถุเหล่านี้ได้ตลอดเวลา

ฉันคิดว่าฉันเข้าใจแนวคิดเบื้องหลังการตัดสินใจออกแบบนี้ - เพื่อทำให้แอปพลิเคชันง่ายขึ้น เป็นเพียงการประนีประนอมเช่นในกรณีของThread Locals :

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

การแพตช์ออบเจกต์โกลบอลกับข้อมูลการร้องขอปัจจุบันเป็นรูปแบบการต่อต้านหรือไม่?

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

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


2
คุณยังไม่ได้ระบุว่าผลกระทบเชิงลบที่เฉพาะเจาะจงของแอนตี้พาสเทอร์นั้นจะเป็นอย่างไร ฉันไม่ไว้วางใจกวาดทั่วไปที่ไม่มีพื้นฐานความเป็นจริง
Robert Harvey

2
เป็นคำถามที่ดี แต่น่าเสียดายที่ไม่มีคำตอบที่มีคุณภาพมากมาย
sleepycal

คำตอบ:


4

เฟรมเวิร์กเว็บจำนวนมากมีโครงสร้างเดียวกันนี้: คำขอทั่วโลก ในความรู้สึกมันเป็นสิ่งที่ถูกต้องที่จะทำเพราะเฮ้มีเพียงครั้งเดียวเท่านั้นขอ

ดังนั้นมีจุดในการผ่านการร้องขอรอบเป็นพารามิเตอร์ใด ๆ ไม่คำขอคือคำขอและพารามิเตอร์ใช้สำหรับส่งผ่านสิ่งต่าง ๆ ในเวลาต่างกัน

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

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

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


3

(ฉันจะกล้าหาญและตอบคำถามนี้แม้ว่าฉันจะได้คะแนนแย่ ๆ )

Flask เป็นไมโครเฟรมเวิร์ก คุณได้รับประโยชน์จากความเรียบง่ายในขณะที่ยอมแพ้กับความหรูหรา ในขณะที่อยู่ในระดับเดียวกับที่ฉันเห็นด้วยกับคุณฉันรู้ว่าฉันใช้ flask + gunicorn ที่ร้านหนึ่งเพื่อให้เธรดแบบมัลติเธรดที่ฉันต้องการ มันทำงานได้ดีจริงๆ แต่ละอินสแตนซ์ของสคริปต์ส่งคำขอเดียว (เช่นหนึ่งเธรด) และ gunicorn จัดการ "fan out" ในหลายเธรด มันยอดเยี่ยมมาก

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

(นี่คือสิ่งที่ฉันอาจมีปัญหา) เธรดและการเกิดขึ้นพร้อมกันนั้นแตกต่างกันไปในโลกของ Python และถ้าคุณมาพร้อมกับกรอบความคิดของจาวามันยากที่จะบีบมันเข้ามาประสบการณ์ของฉันคือปัญหาที่เกิดขึ้นพร้อมกัน ให้สิทธิ์ใน Java หรือที่จัดการโดยโปร่งใสโดยคอนเทนเนอร์แอปพลิเคชันมีมากใกล้กับพื้นผิวใน Python

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


4
ฉันไม่กังวลเกี่ยวกับความปลอดภัยของด้ายและเช่น ฉันเชื่อว่า Flask ทำงานได้ดีในกรณีเหล่านี้ คำถามของฉันเกี่ยวกับการออกแบบแอปพลิเคชันและสถาปัตยกรรม มันเป็นการปฏิบัติที่ดีที่จะส่งคำขอเป็นข้อโต้แย้งไปยังมุมมองหรือไม่? ฉันคิดว่าสามารถอ่านได้ชัดเจนและง่ายขึ้นในการดีบัก
warvariuc

2

ใน Python คุณมีprintคำสั่ง (ฟังก์ชันตั้งแต่ v3) ที่พิมพ์ไปยังเอาต์พุตมาตรฐาน คุณไม่ได้ระบุอย่างชัดเจนว่าคุณต้องการพิมพ์ไปที่ STDOUT - มันทำเพื่อคุณโดยปริยายเบื้องหลัง

โดยปริยาย ในภาษาไพ ธ อน และไม่มีใครมีปัญหากับมัน ทำไม?

printเป็นส่วนหนึ่งของภาษา Python และข้อกำหนดหนึ่งของการเขียนโปรแกรมใน Python ก็คือ ... ดี ... การรู้จัก Python และถ้าคุณรู้จัก Python คุณก็รู้printเป้าหมายนั้นSTDOUT ไม่มีความประหลาดใจ

Python - เป็นภาษา - สามารถกำหนดแบบแผนของตนเองและสมมติว่าโปรแกรมเมอร์รับรู้ถึงมัน

กรอบยังสนุกกับสิทธิพิเศษ - นั่นเป็นหนึ่งในความแตกต่างที่สำคัญระหว่างกรอบและห้องสมุด คุณไม่จำเป็นต้องเรียนรู้ห้องสมุดเพื่อใช้งาน - คุณเพียงแค่ต้องค้นหาส่วนของ API ที่คุณต้องการและสมมติว่าเป็นไปตามอนุสัญญาของภาษา (หรือกรอบ) นั่นเป็นเหตุผลที่คุณไม่เห็นนายหน้าที่มองหาคนที่มีความรู้ใน GSON หรือ Apache Commons แต่คุณจะเห็นนายหน้าที่มองหาคนที่มีประสบการณ์กับ JQuery หรือ Ruby on Rails หรือ ASP.NET MVC เพราะเป็นเฟรมเวิร์กที่กำหนดอนุสัญญาของตนเองที่คุณต้องเรียนรู้และรับรู้

Flask ในฐานะเฟรมเวิร์กสามารถกำหนดแบบแผนสำหรับการจัดเก็บบริบทในเธรดโลคัลโกลบอล - และไม่ควรแปลกใจใครเลยดังนั้นจึงไม่ใช่รูปแบบการต่อต้าน


2
โปรดทราบว่า "stdout" sys.stdoutหมายถึงไฟล์สิ่งที่บ่งชี้ถึงโดย หากคุณเปลี่ยนแปลงการพิมพ์ไปที่อื่น
Phoshi

1
นอกจากนี้คุณสามารถแทนที่สตรีมเอาต์พุตโดยใช้>>โอเปอเรเตอร์หรือส่งผ่านfileอาร์กิวเมนต์ไปยังprintฟังก์ชันใน Python3 ดังนั้นsys.stdoutเป็นเพียงค่าเริ่มต้นซึ่งสามารถแทนที่ได้
warvariuc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.