2016-12-08 4 views
1

Я создал пользовательский ImageUploadField в Flask-Admin для загрузки изображений на S3. Он отлично работает, за исключением случаев, когда я выбираю одну запись - тег img src теперь добавляет /static/ ко всем моим маршрутам файла, и я не вижу изображение. Это сгенерированный тег из Колба-Admin:Flask-Admin: отображение изображений с S3

<div class="image-thumbnail"> <img src="/static/https://mybucket.s3.amazonaws.com/mypicture.jpg"> </div><input class="form-control" id="image1" name="image1" type="file"></div> 

Я также служат статические файлы из моего приложения, так глобально изменяя каталог static не будет хорошей идеей.

Там, как представляется, несколько свойств на ImageUploadField, которые могут быть изменены для этой потребности (endpoint, url_relative_path, relative_path и base_path), но я все еще не мог исправить.

ответ

0

Оказалось, что для генерации URL-адреса отвечает widget. Он также ищет изображение в конечной точке static (следовательно, почему endpoint по умолчанию равен static при инициализации класса ImageUploadField). Чтобы решить эту проблему, я создал подкласс этого виджета и изменил HTML, чтобы указать прямо на URL-адрес S3, который будет храниться в форме.

Хотя виджеты в документации Flask-Admin подробно не описаны, вы можете увидеть, как они работают с фрагментами source code.

Ниже приведен полный код виджета, а также часть моего заказа ImageUploadField.

class S3ImageUploadInput(ImageUploadInput): 

    def __call__(self, field, **kwargs): 
     kwargs.setdefault('id', field.id) 
     kwargs.setdefault('name', field.name) 

     args = { 
      'file': html_params(type='file', 
           **kwargs), 
      'marker': '_%s-delete' % field.name 
     } 

     if field.data and isinstance(field.data, string_types): 
      # calling field.data to directly return S3 URL 
      url = field.data 
      args['image'] = html_params(src=url) 

      template = self.data_template 
     else: 
      template = self.empty_template 

     return HTMLString(template % args) 


class S3ImageUploadField(ImageUploadField): 

    widget = S3ImageUploadInput() 

    def __init__(self, *args, **kwargs): 
     super(S3ImageUploadField, self).__init__(*args, **kwargs) 
0

Колба-Admin использует urlparse.urljoin для создания файла, так что он может предварять '/static' если 'relative_path' параметр не имеет косую черту.

Просто подумайте, удачи!

0

добавить "конечной точки" в Сыроватского some_image

form_args = dict(
    some_image=dict(
     endpoint=you_url_complete, 
     base_path='/some/folder/static', 
     relative_path='some_image/', 
     url_relative_path='uploads/', 
     namegen=your_namegen_func_here, 
     storage_type_field='some_image_storage_type', 
     bucket_name_field='some_image_storage_bucket_name', 
    ) 
)