Werkzeug: فشل في تلوين وحدة تحكم Windows

تم إنشاؤها على ٣ مايو ٢٠٢٠  ·  6تعليقات  ·  مصدر: pallets/werkzeug

على النوافذ ، تطبع Flask الجديدة أحرفًا غريبة على وحدة التحكم ، بدلاً من تلوين الخط كما هو الحال في Linux. على سبيل المثال: "← [37m

أفضل الذهاب إلى الأسود / الأبيض (كما في الإصدار السابق) إذا لم يعمل التلوين.

2020-05-03 14: 05: 47،398 - INFO - 127.0.0.1 - - [03 / May / 2020 14:05:47] "← [37mGET / نتيجة HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 06: 42،922 - INFO - 127.0.0.1 - - [03 / May / 2020 14:06:42] "← [37mGET / نتيجة HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24،007 - INFO - 127.0.0.1 - - [03 / May / 2020 14:07:24] "← [37mGET / نتيجة HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 07: 24،210 - INFO - 127.0.0.1 - - [03 / May / 2020 14:07:24] "← [37mGET /static/images/favicon.ico HTT
2020-05-03 14: 08: 19،539 - INFO - 127.0.0.1 - - [03 / May / 2020 14:08:19] "← [37mGET / نتيجة HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 09: 15،065 - INFO - 127.0.0.1 - - [03 / May / 2020 14:09:15] "← [37mGET / نتيجة HTTP / 1.1 ← [0m" 200 -
2020-05-03 14: 10: 10،579 - INFO - 127.0.0.1 - - [03 / May / 2020 14:10:10] "← [37mGET / نتيجة HTTP / 1.1 ← [0m" 200 -

Env:
قارورة == 1.1.2
Win7 إلى x64
Python 3.6.7 إلى x64
Werkzeug == 1.0.1

bug

التعليق الأكثر فائدة

تمكنت من تصحيح المشكلة عن طريق إضافة الكود التالي إلى تطبيق flask الخاص بي

import os
import sys

if sys.platform.lower() == "win32": 
    os.system('color')

راجع https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python للحصول على التفاصيل.

يبدو أنه يتم تصفية الأقواس المزدوجة في السجلات كما اقترح @ mrx23dot .

ال 6 كومينتر

لم أتمكن من التكرار.

عرض موجه الأوامر:
image

محطة بيشارم:
image

تشغيل PyCharm:
image

أنا أقوم بتشغيل Windows 10 x64 و Python 3.7.4 و flask 1.1.2 و Werkzeug 1.0.1

لست متأكدًا حقًا من كيفية شرح ذلك. إذا كان هناك أي شيء ، فهذه مشكلة في Click ، ​​ولكن ليس من المفترض أن يرسل Click معلومات الألوان على Windows إذا لم يتم تثبيت colorama. لقد رأيت المزيد من التقارير عن ذلك منذ التبديل إلى Click ، ​​ولكنها ليست متسقة ، كما هو موضح في لقطات الشاشة السابقة.

تم اختباره على نفس المشكلة Win7 و Win10 ، على الرغم من أنني أرى التلوين يعمل ، ليس فقط لمكالمات REST:
2020-05-04_215343

لقد قمت بتثبيت هذه:
انقر == 7.1.1
colorama == 0.4.3
colorlogs == 14.0

كل هذه تعمل مع التلوين:
من كولوراما استيراد الجبهة ، العودة ، ستايل
طباعة (للأحمر الأمامي + "بعض النص الأحمر")
طباعة ('033 [31m' + 'بعض النص الأحمر')

انقر فوق الاستيراد
click.echo ('033 [31m' + 'بعض النص الأحمر')

من Flask:
"← [37mGET" <- قد يتم تخطي هذا بشكل غير صحيح في الكود (يحتاج إلى شُرط مزدوجة للخلف؟) ، لقد نجح معي مع

تمكنت من تصحيح المشكلة عن طريق إضافة الكود التالي إلى تطبيق flask الخاص بي

import os
import sys

if sys.platform.lower() == "win32": 
    os.system('color')

راجع https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python للحصول على التفاصيل.

يبدو أنه يتم تصفية الأقواس المزدوجة في السجلات كما اقترح @ mrx23dot .

قضيت بعض الوقت في التحقيق في هذه المشكلة. تأتي إضافة اللون من click.style . هذا هو الرمز ذو الصلة من serving.WSGIRequestHandler :

def log_request(self, code="-", size="-") -> None:
        try:
            path = uri_to_iri(self.path)
            msg = f"{self.command} {path} {self.request_version}"
        except AttributeError:
            # path isn't set if the requestline was bad
            msg = self.requestline

        code = str(code)

        if click:
            color = click.style

            if code[0] == "1":  # 1xx - Informational
                msg = color(msg, bold=True)
            elif code[0] == "2":  # 2xx - Success
                msg = color(msg, fg="white")
            elif code == "304":  # 304 - Resource Not Modified
                msg = color(msg, fg="cyan")
            elif code[0] == "3":  # 3xx - Redirection
                msg = color(msg, fg="green")
            elif code == "404":  # 404 - Resource Not Found
                msg = color(msg, fg="yellow")
            elif code[0] == "4":  # 4xx - Client Error
                msg = color(msg, fg="red", bold=True)
            else:  # 5xx, or any other response
                msg = color(msg, fg="magenta", bold=True)

        self.log("info", '"%s" %s %s', msg, code, size)

يمكنك أن ترى أن الوظيفة click.style تقوم ببساطة بتغليف الرسالة الأولية في أكواد نمط ANSI. بالنسبة إلى Linux و OS X ، يتم دعم رموز ANSI افتراضيًا ، لذلك لن يلاحظ هؤلاء المستخدمون هذه المشكلة. ومع ذلك ، في Windows ، لا يدعم الجهاز هذا افتراضيًا. إذا كنت تستخدم نظام التشغيل Windows 10 ، فإن الحل البسيط هو استخدام الأمر التالي لتمكين تصميم ANSI:

import sys
import os

if sys.platform.lower() == 'win32':
    os.system('color')

سيعالج هذا معظم المستخدمين الذين يعانون من المشكلة ، ولكن قد لا يصلح بعض حالات الحواف (مثل البصمة الصغيرة أو توزيعات يونكس المضمنة). يمكن وضع os.system('color') (أو أي مكالمة os.system ) تقريبًا في أي مكان في قاعدة الشفرة. طالما يتم استدعاؤه قبل طباعة الإخراج ، سيظهر الإخراج ملونًا بشكل صحيح. ربما هذا هو السبب في أن مستخدمي PyCharm لا يلاحظون الخطأ. من المحتمل أن تقوم محطة PyCharm python باستدعاء os.system للتعامل مع إخراج النص الملون.

إذن بالطريقة التي أراها هناك سؤالان:

  1. هل يجب على werkzeug إصلاح هذه المشكلة البسيطة أو ترك العبء على مستخدمي Windows 10 للاتصال بـ os.system ؟
  2. إذا أصلحنا هذا في werkzeug ، فأين يجب أن نضيف المكالمة os.system ؟ يجب أن يتم استدعاؤها مرة واحدة فقط ، لذلك ربما يمكن إضافتها إلى WSGIRequestHandler.__init__ ؟ ربما تكون هناك خيارات أفضل ، لكن هذا كل ما يمكنني التفكير فيه الآن.

تمكنت من تصحيح المشكلة عن طريق إضافة الكود التالي إلى تطبيق flask الخاص بي

import os
import sys

if sys.platform.lower() == "win32": 
    os.system('color')

راجع https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-python للحصول على التفاصيل.

يبدو أنه يتم تصفية الأقواس المزدوجة في السجلات كما اقترح @ mrx23dot .

شكر. أضف الكود في config.py ، فهو يعمل بالنسبة لي. 😀

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات