2011-04-10 4 views
11

मैं उन सभी चीजों को सहेजना चाहता हूं जिनका उपयोग आंकड़ों के लिए किया जा सकता है, जैसे रेफरर, ओएस, ब्राउज़र इत्यादि। क्या उपलब्ध है और इसे स्टोर करने का सबसे अच्छा तरीका क्या है?Django आंकड़ों के लिए पूरा अनुरोध सहेज रहा है, क्या उपलब्ध है?

यह परियोजना में 1 एप्लिकेशन (1 पृष्ठ) के लिए केवल महत्वपूर्ण है, अन्य पेज कुछ मानक एनालिटिक्स उत्पाद का उपयोग Google Analytics जैसे किया जाएगा।

मैंने डीजेंगो-ट्रैकिंग पर एक नज़र डाली थी, लेकिन ऐसा लगता है कि यह अधिक है क्योंकि मैं केवल 1 व्यू पर इसका उपयोग करना चाहता हूं। आदर्श स्थिति, पूरे अनुरोध ऑब्जेक्ट को टास्कक्यू में पास कर देगी और बाद में प्रसंस्करण करेगी। तो उपयोगकर्ता को पहले रीडायरेक्ट किया जाता है और दृश्यों के पीछे एनालिटिक्स प्रोसेसिंग किया जाएगा।

उत्तर

12

हम कुछ साधारण मिडलवेयर का उपयोग करते हैं .. नीचे एक अंश है। आप इसे सीधे दृश्य में उपयोग करने के लिए संशोधित कर सकते हैं।

class WebRequest(models.Model): 
    time = models.DateTimeField(auto_now_add=True) 
    host = models.CharField(max_length=1000) 
    path = models.CharField(max_length=1000) 
    method = models.CharField(max_length=50) 
    uri = models.CharField(max_length=2000) 
    status_code = models.IntegerField() 
    user_agent = models.CharField(max_length=1000,blank=True,null=True) 
    remote_addr = models.IPAddressField() 
    remote_addr_fwd = models.IPAddressField(blank=True,null=True) 
    meta = models.TextField() 
    cookies = models.TextField(blank=True,null=True) 
    get = models.TextField(blank=True,null=True) 
    post = models.TextField(blank=True,null=True) 
    raw_post = models.TextField(blank=True,null=True) 
    is_secure = models.BooleanField() 
    is_ajax = models.BooleanField() 
    user = models.ForeignKey(User,blank=True,null=True) 

def dumps(value): 
    return json.dumps(value,default=lambda o:None) 

class WebRequestMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     setattr(request,'hide_post',view_kwargs.pop('hide_post',False)) 


    def process_response(self, request, response): 

     if request.path.endswith('/favicon.ico'): 
      return response 

     if type(response) == HttpResponsePermanentRedirect and settings.APPEND_SLASH: 
      new_location = response.get('location',None) 
      content_length = response.get('content-length',None) 

      if new_location and content_length is '0': 
       new_parsed = urlparse(new_location) 

       old = (('http','https')[request.is_secure()], request.get_host(), '{0}/'.format(request.path), request.META['QUERY_STRING']) 
       new = (new_parsed.scheme, new_parsed.netloc, new_parsed.path, new_parsed.query) 

       if old == new: 
        #dont log - it's just adding a/
        return response 
     try: 
      self.save(request, response) 
     except Exception as e: 
      print >> sys.stderr, "Error saving request log", e 

     return response 

    def save(self, request, response): 
     if hasattr(request, 'user'): 
      user = request.user if type(request.user) == User else None 
     else: 
      user = None 

     meta = request.META.copy() 
     meta.pop('QUERY_STRING',None) 
     meta.pop('HTTP_COOKIE',None) 
     remote_addr_fwd = None 

     if 'HTTP_X_FORWARDED_FOR' in meta: 
      remote_addr_fwd = meta['HTTP_X_FORWARDED_FOR'].split(",")[0].strip() 
      if remote_addr_fwd == meta['HTTP_X_FORWARDED_FOR']: 
       meta.pop('HTTP_X_FORWARDED_FOR') 

     post = None 
     uri = request.build_absolute_uri() 
     if request.POST and uri != '/login/': 
      post = dumps(request.POST) 

     models.WebRequest(
      host = request.get_host(), 
      path = request.path, 
      method = request.method, 
      uri = request.build_absolute_uri(), 
      status_code = response.status_code, 
      user_agent = meta.pop('HTTP_USER_AGENT',None), 
      remote_addr = meta.pop('REMOTE_ADDR',None), 
      remote_addr_fwd = remote_addr_fwd, 
      meta = None if not meta else dumps(meta), 
      cookies = None if not request.COOKIES else dumps(request.COOKIES), 
      get = None if not request.GET else dumps(request.GET), 
      post = None if (not request.POST or getattr(request,'hide_post') == True) else dumps(request.POST), 
      raw_post = None if getattr(request,'hide_post') else request.raw_post_data, 
      is_secure = request.is_secure(), 
      is_ajax = request.is_ajax(), 
      user = user 
     ).save() 
+0

धन्यवाद https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/fields/#jsonfield

तुम कर सकते हो कुछ इस अद्भुत कोड है:

अधिक पढ़ सकते हैं। मुझे बहुत काम बचाएगा! मॉडल के बारे में सिर्फ एक सवाल है। क्या आप MySQL का उपयोग कर रहे हैं? क्या यह वचर (1000) बनायेगा? बस यहां प्रलेखन पर एक नज़र डालें: http://docs.djangoproject.com/en/dev/ref/databases/#notes-on- स्पेसिफिक- फ़ील्ड –

+0

हम वास्तव में ओरेकल का उपयोग करते हैं, इसलिए टेक्स्टफ़िल्ल्ड (यदि यह है कि आप ' फिर से संदर्भित) एक एनएलओबी है। –

+0

मैं मेजबान = मॉडल का जिक्र कर रहा था। खरीफिल्ड (max_length = 1000)। इसके अलावा आप मेटा को स्पष्ट रूप से क्यों कॉपी करते हैं? मेटा = request.META.copy() –

1

बस इसे मैन्युअल रूप से अनुरोध से खींचें।

दस्तावेज़ दस्तावेज़ की बहुत सारी जानकारी को रेखांकित करते हैं जिसे अनुरोध ऑब्जेक्ट से खींचा जा सकता है।

उदाहरण के लिए, हेडर request.META में जमा हो जाती,, request.GET में पैरामीटर प्राप्त आदि
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

यह स्टोर करने के लिए सबसे अच्छा तरीका क्या है? निर्भर करता है कि आप क्या कर रहे हैं। इसे लॉग करें, इसे डीबी में स्टोर करें, इसे कहीं और भेजें ... आप आंकड़ों के लिए कहते हैं, इसलिए डेटाबेस को यह कहने में आसान जगह के रूप में अच्छी जगह की तरह लगता है।

+0

डेटा के रूप में कौन सा डेटाबेस MySQL या MongoDB बड़ा होगा? या एकाधिक MySQL डेटाबेस, विशेष रूप से अनुरोध डेटा संग्रहीत करने के लिए? –

0

जोश उत्तर में विस्तार, यदि आप पोस्टेज को अपने बैकएंड के रूप में उपयोग कर रहे हैं तो आप पोस्ट डेटा के लिए JSONField का उपयोग कर सकते हैं। यह मैन्युअल रूप से लोड करने के बजाय सीधे जेसन से निपटने में मदद करेगा। इस तरह

from django.contrib.postgres.fields import JSONField 

class WebRequest(models.Model): 
    post = JSONField(default=dict) 
संबंधित मुद्दे