سؤال

وأنا استخدم render_to_response جانغو للعودة وثيقة XML. وتهدف هذه الوثيقة XML معينة لمكتبة الرسوم البيانية المرتكزة على فلاش. تتطلب المكتبة أن وثيقة XML تبدأ مع BOM (بايت ترتيب علامة). كيف يمكنني جعل جانغو prepent وBOM إلى الرد؟

وكان يعمل لإدراج BOM في القالب، لكنه غير مريح بسبب إيماكس بإزالته في كل مرة كنت تعديل الملف.

ولقد حاولت أن إعادة كتابة render_to_response على النحو التالي، لكنه فشل لأن BOM يتم ترميز UTF-8:

def render_to_response(*args, **kwargs):
    bom = kwargs.pop('bom', False)
    httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
    s = django.template.loader.render_to_string(*args, **kwargs)
    if bom:
        s = u'\xef\xbb\xbf' + s
    return HttpResponse(s, **httpresponse_kwargs)
هل كانت مفيدة؟

المحلول

وأنت لا نتحدث في الواقع عن BOM (علامة ترتيب البايت)، منذ UTF-8 لايوجد BOM. من مثال التعليمات البرمجية، تتوقع مكتبة النص ليكون 3 بايت القمامة إرفاق مسبقا لسبب ما لا يمكن تفسيره.

وكود الخاص بك هو الصحيح تقريبا، ولكن يجب إلحاقها بايت ك <م> بايت ، وليس حرفا. جرب هذا:

def render_to_response(*args, **kwargs):
    bom = kwargs.pop('bom', False)
    httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
    s = django.template.loader.render_to_string(*args, **kwargs)
    if bom:
        s = '\xef\xbb\xbf' + s.encode("utf-8")
    return HttpResponse(s, **httpresponse_kwargs)

نصائح أخرى

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

class AddBOMMiddleware(object):
    def process_response(self, request, response):
        import codecs
        if getattr(response, 'bom', False):
            response.content = codecs.BOM_UTF8 + response.content
        return response

إضافة اسمها إلى MIDDLEWARE_CLASSES في الإعدادات. ثم إعادة render_to_response:

def render_to_response(*args, **kwargs):
    bom = kwargs.pop('bom', False)
    httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
    rendered = django.template.loader.render_to_string(*args, **kwargs)
    response = django.http.HttpResponse(rendered, **httpresponse_kwargs)
    if bom:
        response.bom = True
    return response

والآن، يمكنك أن تفعل render_to_response("foo.xml", mimetype="text/xml", bom=True) من أجل إلحاقها في BOM إلى استجابة معينة.

وأبسط شيء يمكن أن يكون لتكوين إيماكس عدم إزالة BOM.

ولكن render_to_response ليس وظيفة معقدة. انها في الاساس:

def render_to_response(*args, **kwargs):
    return HttpResponse(loader.render_to_string(*args, **kwargs))

هل يمكن تسمية render_to_string بسهولة وإلحاقها في BOM.

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