2016-04-21 4 views
0

Ich versuche, ein Bild mit Boto in S3-Bucket hochzuladen. Nachdem das Bild erfolgreich hochgeladen wurde, möchte ich eine bestimmte Operation unter Verwendung der Datei-URL des Bilds im S3-Bucket ausführen. Das Problem ist, dass das Bild manchmal nicht schnell genug hochgeladen wird und ich einen Serverfehler erhalte, wenn ich den Vorgang abhängig von der Datei-URL des Bildes ausführen möchte.Wie kann überprüft werden, ob eine Datei das Hochladen in S3 Bucket mit Boto in Python abgeschlossen hat?

Dies ist mein Quellcode. Ich benutze Pythonflasche.

Die Methode jsonify benötigt eine gültige Image-URL, um den Vorgang auszuführen. Es funktioniert manchmal, manchmal nicht. Der Grund dafür liegt vermutlich darin, dass das Bild zum Zeitpunkt der Ausführung dieser Codezeile noch nicht hochgeladen wurde.

Die perform_actual_search Methode ist wie folgt:

def get_image_search_results(image_url): 
global description 
url = ('http://style.vsapi01.com/api-search/by-url/?apikey=%s&url=%s' % (just_visual_api_key, image_url)) 
h = httplib2.Http() 
response, content = h.request(url, 
           'GET') # alternatively write content=h.request((url,'GET')[1]) ///Numbr 2 in our array 
result = json.loads(content) 

result_dictionary = [] 

for i in range(0, 10): 
    if result: 
     try: 
      if result['errorMessage']: 
       result_dictionary = [] 
     except: 
      pass 

      if result['images'][i]: 
       images = result['images'][i] 
       jv_img_url = images['imageUrl'] 
       title = images['title'] 
       try: 
        if images['description']: 
         description = images['description'] 
        else: 
         description = "no description" 
       except: 
        pass 

       # print("\njv_img_url: %s,\ntitle: %s,\ndescription: %s\n\n"% (
       # jv_img_url, title, description)) 

       image_info = { 
        'image_url': jv_img_url, 
        'title': title, 
        'description': description, 
       } 
       result_dictionary.append(image_info) 

if result_dictionary != []: 
    # for i in range(len(result_dictionary)): 
    #  print (result_dictionary[i]) 
    #  print("\n\n") 
    return result_dictionary 
else: 
    return [] 


def performSearch(jv_input_dictionary, imagernce_products_dict): 
print jv_input_dictionary 
print imagernce_products_dict 

global common_desc_ratio 
global isReady 
image_search_results = [] 
if jv_input_dictionary != []: 
    for i in range(len(jv_input_dictionary)): 
     print jv_input_dictionary[i] 
     for key in jv_input_dictionary[i]: 
      if key == 'description': 
       input_description = jv_input_dictionary[i][key] 
       s1w = re.findall('\w+', input_description.lower()) 
       s1count = Counter(s1w) 
       print input_description 
       for j in imagernce_products_dict: 
        if j == 'Products': 
         for q in range(len(imagernce_products_dict['Products'])): 
          for key2 in imagernce_products_dict['Products'][q]: 
           if key2 == 'description': 
            search_description = imagernce_products_dict['Products'][q]['description'] 
            print search_description 
            s2w = re.findall('\w+', search_description.lower()) 
            s2count = Counter(s2w) 
            # Commonality magic 
            common_desc_ratio = difflib.SequenceMatcher(None, s1w, s2w).ratio() 
            print('Common ratio is: %.2f' % common_desc_ratio) 

          if common_desc_ratio > 0.09: 
           image_search_results.append(imagernce_products_dict['Products'][q]) 

if image_search_results: 

    print image_search_results 
    return image_search_results 
else: 
    return {'404': 'No retailers registered with us currently own this product.'} 


def perform_actual_search(image_url, imagernce_product_dictionary): 
return performSearch(get_image_search_results(image_url), imagernce_product_dictionary) 

Jede Hilfe dieser Lösung würde sehr geschätzt werden.

Antwort

1

können Sie Bytes, die mit s3 geschrieben wurden, mit der Dateigröße vergleichen. können Sie sagen Methode s3 benutzen folgendes zu schreiben: Ich würde vergleichen, bytes_written mit p_product_image_url.seek(0, os.SEEK_END)

es set_contents_from_string

dann

bytes_written = key.set_contents_from_file(file_binary, rewind=True) in Ihrem Fall, wenn sie übereinstimmen. Die ganze Datei wurde in s3 hochgeladen.

0

Ich würde S3 konfigurieren Sie Benachrichtigungen über Ereignisse wie s3 zu generieren: ObjectCreated: *

Benachrichtigungen können an ein SNS Thema geschrieben werden, um eine SQS-Warteschlange oder direkt eine Lambda-Funktion auslösen.

Mehr Details über S3 Benachrichtigungen: http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

Sie sollten Ihren Code neu schreiben den Upload-Teil und das Bildbearbeitungsteil zu trennen. Letzteres kann in Python als Lambda-Funktion implementiert werden.
Das Arbeiten in einer asynchronen Weise ist der Schlüssel hier, Schreiben Blocking-Code ist in der Regel nicht skalierbar.

+0

Ich habe versucht, meinen Code wie oben zu trennen und noch habe ich Probleme .. – KudzieChase

Verwandte Themen