سؤال

والآن أنا عندي برنامج نصي mod_wsgi هذا ما المهيكلة مثل هذا ..

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

وأنا أتساءل عما اذا كان أي شخص يعرف من وسيلة لتغيير هذا للعمل على أساس yield بدلا من return، وبهذه الطريقة أستطيع أن أرسل الصفحة كما أنها يتم إنشاؤها وليس مرة واحدة فقط انها كاملة، وبالتالي فإن تحميل الصفحة يمكن أن يذهب أسرع للمستخدم.

ولكن، كلما كنت مبادلة الناتج للحصول على قائمة وتسفر في التطبيق ()، فإنه يلقي خطأ:

TypeError: sequence of string values expected, value of type list found
هل كانت مفيدة؟

المحلول

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    yield output
<اقتباس فقرة>   

"ومع ذلك، كلما كنت مبادلة الناتج للحصول على قائمة وتسفر في التطبيق ()، فإنه يلقي خطأ:"

حسنا، لا تسفر عن القائمة. ينتج كل عنصر بدلا من ذلك:

for part in mylist:
    yield part

وأو إذا كانت القائمة المحتوى بأكمله، فقط:

return mylist

ولأن القائمة بالفعل مكرر ويمكن أن تسفر في حد ذاته.

نصائح أخرى

لاحظ أن "العائد" ينبغي تجنب الا للضرورة القصوى. ولا سيما "العائد" ستكون غير فعالة إذا استسلام الكثير من السلاسل الصغيرة. وذلك لأن مواصفات WSGI تتطلب بعد أثمرت كل سلسلة على أن الرد يجب أن يتم مسح. اباتشي / mod_wsgi، وبيغ سائل كل سلسلة إجبارهم من خلال إخراج دلو لواء وتصفية نظام أباتشي وعلى المقبس. تجاهل النفقات العامة للنظام إخراج أباتشي مرشح، والكتابة الكثير من سلاسل صغيرة على مأخذ هو ببساطة مجرد سيئة لتبدأ.

وجود هذه المشكلة أيضا حيث يتم إرجاع صفيف سلاسل من تطبيق كما يحتوي على تدفق أيضا التي يتعين القيام بها بين كل سلسلة في الصفيف. وذلك لأن يتم التعامل السلسلة مع باعتبارها iterable وليس القائمة. وبالتالي للحصول على قائمة متشكلة من السلاسل، هو أفضل بكثير للانضمام إلى سلاسل الفردية في سلسلة واحدة كبيرة وإرجاع قائمة تحتوي على سلسلة مجرد أن واحدا. القيام بذلك كما يسمح تطبيق WSGI لتولد طول المحتوى للاستجابة تلقائيا إذا لم يتم توفير واحد صراحة.

وفقط للتأكد من أنه عندما يتلاقى كل السلاسل في قائمة واحدة، يتم إرجاع النتيجة في القائمة. إذا لم يتم ذلك وبدلا من ذلك يتم إرجاع سلسلة، يتم التعامل مع هذه السلسلة بمثابة iterable، حيث كل عنصر في السلسلة سلسلة أحرف واحدة. هذه النتائج في مطاردة يجري بعد كل حرف، والتي سوف يكون أسوأ مما لو لم انضم السلاسل.

لا ترسل طول محتوى وإرسال إخراج النحو الذي تستمد منه. لا تحتاج إلى معرفة حجم الانتاج اذا كنت ببساطة لا إرسال رأس طول المحتوى. وبهذه الطريقة يمكن أن ترسل جزءا من الاستجابة قبل كنت قد تحسب ما تبقى منه.

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/html')]
    start_response(status, response_headers)

    yield head()
    yield part1()
    yield part2()
    yield part3()
    yield "<!-- bye now! -->"

وإلا فإنك سوف تحصل على أي فائدة من إرسال في قطع، منذ حساب المخرجات وربما كان جزء بطيئة و فإن بروتوكول الإنترنت بإرسال الإخراج في قطع أي حال.

للأسف، هذا لا يعمل في الحالة التي يكون فيها، على سبيل المثال، حساب من يقرر PART2 () كنت حقا بحاجة الى تغيير رأس (مثل ملفات الكوكيز) أو بحاجة إلى بناء هياكل البيانات الصفحات العالمية الأخرى - إذا كان هذا يحدث من أي وقت مضى، تحتاج إلى حساب الانتاج بالكامل قبل إرسال رؤوس، وقد تستخدم كذلك لreturn [output]

وعلى سبيل المثال http://aaron.oirt.rutgers.edu/myapp/ مستندات / W1200_1200.config_template يحتاج إلى بناء صفحة هيكل البيانات العالمية للروابط لأقسام فرعية التي تظهر في أعلى الصفحة - لذلك يجب أن تكون المقدمة القسم الفرعي الماضي قبل أن يتم تسليمها أول قطعة من الإخراج إلى العميل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top