[장고] 관리자 리스트 페이지에서 이미지 출력하기
Django는 웹 애플리케이션 개발을 위해 강력하고 유연한 프레임워크를 제공합니다. 그러나 기본적으로 Django는 보안을 위해 autoescape 기능을 활성화해둡니다. 이로 인해 관리자 페이지에서 HTML 태그를 사용해도 태그 자체가 텍스트로 표시되는 경우가 발생합니다. 이 문제를 해결하기 위해 mark_safe()를 사용하여 안전하다고 판단되는 입력값을 표시할 수 있습니다.
Django의 Autoescape 기능
Django의 autoescape 기능은 HTML 파일이 아닌 외부로부터 입력된 코드를 모두 이스케이프 처리하여 표시합니다. 예를 들어, 사용자가 입력한 텍스트에 <img> 태그가 포함되어 있다면, 이 태그는 실제 이미지로 렌더링되지 않고 <img>라는 텍스트로 그대로 표시됩니다. 이러한 기본 설정은 보안을 강화하기 위함입니다. 외부 입력값을 신뢰하지 않고 무조건 이스케이프 처리함으로써 XSS(교차 사이트 스크립팅) 공격에 대한 취약성을 줄일 수 있습니다.
mark_safe() 함수의 사용
관리자 페이지에서 이미지를 표시하려면 Django의 mark_safe 함수를 사용해야 합니다. 이 함수는 전달된 문자열이 안전하다는 것을 명시적으로 표시하며, 이를 통해 HTML 태그가 실제로 렌더링되도록 합니다. 예를 들어, 블로그 게시물의 내용에 이미지 태그가 포함된 경우, mark_safe를 사용하여 해당 태그가 이스케이프 처리되지 않고 실제 이미지로 표시되도록 할 수 있습니다.
예제 코드: 관리자 페이지에서 이미지 출력
아래는 관리자 페이지에서 이미지를 출력하기 위한 구체적인 예제 코드입니다. 이 예제에서는 AnswerAdmin 클래스에서 list_display 속성을 사용하여 관리자가 이미지와 함께 게시물 내용을 볼 수 있도록 합니다.
from django.contrib import admin
from django.utils.safestring import mark_safe
from .models import Answer
class AnswerAdmin(admin.ModelAdmin):
list_display = ('pk', 'short_content_with_image',)
def short_content_with_image(self, obj):
return mark_safe(f'<img src="{obj.image_url}" width="50" height="50"> {obj.short_content}')
short_content_with_image.short_description = 'Content with Image'
이 코드에서는 AnswerAdmin 클래스의 list_display 속성에 short_content_with_image 메서드를 추가했습니다. 이 메서드는 mark_safe 함수를 사용하여 HTML <img> 태그를 포함한 문자열을 반환합니다. 이를 통해 관리자는 이미지와 함께 게시물의 내용을 확인할 수 있습니다.
결론
Django의 autoescape 기능은 보안을 위한 중요한 기능이지만, 때로는 HTML 태그를 렌더링해야 할 필요가 있습니다. 이럴 때 mark_safe 함수를 사용하면 안전하다고 판단되는 입력값을 이스케이프 처리하지 않고 그대로 렌더링할 수 있습니다. 관리자 페이지에서 이미지를 표시해야 하는 경우, 이 방법을 통해 손쉽게 구현할 수 있습니다. 이를 통해 사용자 경험을 개선하고 관리자의 편의성을 높일 수 있습니다.
참고