2011-09-18 15 views
14

मैं एक Django व्यू लिखना चाहता हूं जो अनुरोध के आधार पर भिन्न सामग्री को प्रस्तुत करता है। उदाहरण के लिए, "टेक्स्ट/एक्सएमएल" के लिए, "टेक्स्ट/जेसन" के लिए एक्सएमएल की सेवा करें, जेएसओएन की सेवा करें, आदि। क्या अनुरोध ऑब्जेक्ट से इसे निर्धारित करने का कोई तरीका है? कुछ इस तरह भयानक होगा:अनुरोधित सामग्री प्रकार का निर्धारण करें?

def process(request): 
    if request.type == "text/xml": 
     pass 
    elif request.type == "text/json": 
     pass 
    else: 
     pass 

इसके लिए HttpRequest पर एक संपत्ति है?

उत्तर

10

HttpRequest.META, और अधिक विशेष HttpRequest.META.get('HTTP_ACCEPT') — और नहीं HttpRequest.META.get('CONTENT_TYPE') उल्लेख के रूप में पहले

+4

में यहाँ उल्लेख किया मैं जानता हूँ कि यह पुराना है, लेकिन हालांकि यह स्वीकार जवाब है, यह नहीं सही है । जैसा कि नीचे जनवरी की टिप्पणी में उल्लेख किया गया है, सही विधि 'स्वीकार करें' हैडर, 'HttpRequest.META.get (' HTTP_ACCEPT ') के माध्यम से सुलभ है। –

+2

आप दोनों मामलों (प्लस एक डिफ़ॉल्ट) को संभालने के लिए फ़ॉलबैक कर सकते हैं: 'request.META.get ('HTTP_ACCEPT', request.META.get ('CONTENT_TYPE', 'application/your_default')) –

16

'सामग्री-प्रकार' शीर्षक इंगित करता है मीडिया प्रकार HTTP अनुरोध में भेज देते हैं। इसका उपयोग उन अनुरोधों के लिए किया जाता है जिनमें सामग्री (POST, PUT) है।

'सामग्री-प्रकार' का उपयोग पसंदीदा प्रतिक्रिया प्रारूप को इंगित करने के लिए नहीं किया जाना चाहिए, 'स्वीकार करें' हेडर इस उद्देश्य को पूरा करता है। Django प्रयोग में यह पहुंचने के लिए: HttpRequest.META.get ('HTTP_ACCEPT')

See more detailed description of these headers

1

के रूप में कहा अन्य उत्तर में, यह जानकारी Accept अनुरोध हेडर में स्थित है। HttpRequest.META['HTTP_ACCEPT'] के रूप में अनुरोध में उपलब्ध है।

हालांकि कोई भी सामग्री अनुरोध प्रकार नहीं है, और यह हेडर अक्सर स्वीकृत/पसंदीदा सामग्री प्रकारों की एक सूची है। यह सूची ठीक से शोषण करने के लिए थोड़ा परेशान हो सकती है। यदि request.META['HTTP_ACCEPT']"text/html;q=0.9,application/xhtml+xml,application/xml;q=0.8,*/*;q=0.7" के बराबर है,

import re 

def get_accepted_content_types(request): 
    def qualify(x): 
     parts = x.split(';', 1) 
     if len(parts) == 2: 
      match = re.match(r'(^|;)q=(0(\.\d{,3})?|1(\.0{,3})?)(;|$)', 
          parts[1]) 
      if match: 
       return parts[0], float(match.group(2)) 
     return parts[0], 1 

    raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',') 
    qualified_content_types = map(qualify, raw_content_types) 
    return (x[0] for x in sorted(qualified_content_types, 
           key=lambda x: x[1], reverse=True)) 

उदाहरण के लिए: यहाँ एक समारोह है कि काम करता है है। यह वापस आ जाएगा: ['application/xhtml+xml', 'text/html', 'application/xml', '*/*'](वास्तव में, क्योंकि यह जनरेटर लौटाता है)

फिर आप पहली सामग्री प्रकार का चयन करने के लिए परिणामी सूची में पुन: प्रयास कर सकते हैं, जिसे आप सही तरीके से जवाब देना चाहते हैं।

ध्यान दें कि इस फ़ंक्शन को अधिकांश मामलों के लिए काम करना चाहिए, लेकिन q=0 जैसे मामलों को संभाल न करें जिसका अर्थ है "स्वीकार्य नहीं"।

सूत्रों का कहना है: HTTP Accept header specification और Quality Values specification

+0

यह उत्तर चाहिए शीर्ष और स्वीकृत उत्तर को प्रतिस्थापित करें। – user73657

संबंधित मुद्दे