2016-12-08 15 views
1

S3에 이미지를 업로드하기 위해 Flask-Admin에 ImageUploadField 사용자 정의를 작성했습니다. 단일 레코드를 선택하는 경우를 제외하고는 효과가 있습니다. 이제 img src 태그는 모든 파일 경로에 /static/을 앞에 붙이며 이미지를 볼 수 없습니다. 나는 또한 이렇게 전 세계적으로 좋은 생각되지 않을 것 static 디렉토리를 변경, 내 응용 프로그램에서 정적 파일을 제공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> 

:이 플라스크-관리자에서 생성 된 태그입니다.

이 필요 (endpoint, url_relative_path, relative_pathbase_path) 수정할 수 있습니다 ImageUploadField에 여러 속성을 수있는 듯하지만, 난 여전히 문제를 해결할 수 없습니다.

답변

0

URL을 생성하는 역할은 widget입니다. 또한 static 엔드 포인트에서 이미지를 찾습니다 (ImageUploadField 클래스를 초기화 할 때 endpoint의 기본값이 static 인 이유). 이를 해결하기 위해이 위젯의 ​​하위 클래스를 만들고 양식에 저장된 S3 URL을 직접 가리 키도록 HTML을 수정했습니다.

위젯은 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

Flask-Admin은 urlparse.urljoin을 사용하여 파일 이름을 만듭니다. 따라서 'relative_path' 매개 변수에 슬래시가없는 경우 '/static' 앞에 붙을 수 있습니다.

그냥 생각, 행운을 빌어 요!

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', 
    ) 
) 
DICT하기