2017-06-28 13 views
5

Chcę importować obrazy w MongoDB wraz z dowolnym słownikiem. Słownik powinien zawierać tagi graficzne, których typów, liczb i nazw nie mogę znać w chwili, gdy definiuję schemat. Próbuję dodać słownika w przeddzień bez powodzenia:Dodawanie niepotwierdzonego słownika z python eve wraz z obrazkiem

curl -F"attr={\"a\":1}" -F "img_id=2asdasdasd" -F "[email protected]:\path\ 
1.png;type=image/png" http://127.0.0.1:5000/images 
{"_status": "ERR", "_issues": {"attr": "must be of dict type"}, "_error": {"message": "Insertion failure: 1 document(s) 
contain(s) error(s)", "code": 422}} 

Moja definicja schematu wygląda tak:

'schema': { 
    #Fixed attributes 
     'original_name': { 
      'type': 'string', 
      'minlength': 4, 
      'maxlength': 1000, 
     }, 
     'img_id': { 
      'type': 'string', 
      'minlength': 4, 
      'maxlength': 150, 
      'required': True, 

      'unique': True, 
     }, 
     'img_data': { 
      'type': 'media' 
     }, 
    #Additional attributes 
     'attr': { 
      'type': 'dict' 

     } 
    } 

Czy to w ogóle możliwe? Czy należy naprawić schemat dyktowania?

EDIT Chciałem dodać zdjęcie pierwsze i słownika po nim, ale pojawia się błąd w żądaniu patch:

C:\Windows\SysWOW64>curl -X PATCH -i -H "Content-Type: application/json" -d "{\ 
"img_id\":\"asdasdasd\", \"attr\": {\"a\": 1}}" http://localhost:5000/images/asd 
asdasd 
HTTP/1.0 405 METHOD NOT ALLOWED 
Content-Type: application/json 
Content-Length: 106 
Server: Eve/0.7.4 Werkzeug/0.9.4 Python/2.7.3 
Date: Wed, 28 Jun 2017 22:55:54 GMT 

{"_status": "ERR", "_error": {"message": "The method is not allowed for the requested URL.", "code": 405}} 
+0

Sprawdziłem, jak listonosz wykonuje podobną prośbę, a wysyłanie wiadomości z '--data-binary' działa. Wiem, że Twój typ zawartości powinien być dostosowany do wieloczęści, ponieważ razem wysyłasz obrazy: 'curl 'http: // localhost: 5000/images /' -H 'Content-Type: application/json' --data-binary ' {"attr": {"a": 1}} ". – gcw

+0

@ gcw: Tak, podając dane przez -d pracował (twój json powinien zawierać img_id, ponieważ ma wymagany atrybut), ale nie mogę przesłać obrazu. Próbowałem najpierw wysłać obraz, a następnie dodać meta-intormację przy użyciu opcji -X PATCH, ale również się nie udało. –

+0

jaki był błąd w żądaniu PATCH? – gcw

Odpowiedz

0

Pisałem problem na Github w tej samej sytuacji. Jednak przyszedłem z obejściem.

Przestawianie walidatora dict:

class JsonValidator(Validator): 

    def _validate_type_dict(self, field, value): 
     if type(value) is dict: 
      pass 
     try: 
      json.loads(value) 
     except: 
      self._error(value, "Invalid JSON") 

app = Eve(validator=JsonValidator) 

Następnie dodaj hak insert:

def multi_request_json_parser(documents): 
    for item in documents: 
     if 'my_json_field' in item.keys(): 
      item['my_json_field'] = json.loads(item['my_json_field']) 

app.on_insert_myendpoint += multi_request_json_parser 

dict walidator należy overidden, ponieważ inny hak wkładka nie zostanie wywołana z powodu walidacji błąd.

+0

OK, interesujące! Testuję to. –