Abaixo está meu código com um círculo dentro de um elemento svg que eu quero renderizar através do jinja2 usando st.html no streamlit. O problema é que o contêiner está visível, mas o elemento svg não está. Ele está em branco. Veja o código abaixo.
<style>
html,body {
height: 100%;
background-color: #404040;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
}
.container {
display: flex;
width: 500px;
/* Extended width for pipe */
height: 500px;
border: 3px solid #EEEEEE;
justify-content: center;
align-items: center;
border-radius: 20px;
}
.drawing {
position: relative;
width: 2000px;
/* Extended width for pipe */
height: 600px;
}
.circle-svg {
width: 100%;
height: 100%;
}
.c3 {
fill: none;
stroke: grey;
stroke-width: 10;
}
</style>
<body>
<div class="container">
<div class="drawing">
<svg viewBox="0 0 500 500" class="circle-svg">
<!-- Circle -->
<circle class="c3" cx="250" cy="250" r="198"></circle>
</svg>
</div>
</div>
</body>
código python:
def cutting_dimention(html_content):
# Directly use the HTML content without treating it as a file path
template = Template(html_content)
rendered_html = template.render() # Render the HTML with Jinja2
st.text(rendered_html) # Display rendered HTML text
st.html(rendered_html) # Display rendered HTML as an HTML block in Streamlit
Chame a função com o conteúdo HTML
dimensão_de_corte(meu_círculo)
Acabei de dar uma olhada na página do playground do Streamlit e percebi que
st.html()
ele aceita<p>A paragraph</p>
, mas não sua tag SVG .Conforme documentado, eles fazem uma higienização interna com DOMPurify , que a remove da sua saída porque a
<svg>
tag não está na lista de tags aceitas.Eu sugeriria duas opções:
A. Criar um componente
Você pode criar seu próprio componente Streamlit , seguindo a documentação oficial .
B. Tente permitir a
<svg>
tagNão vi como modificar a configuração do DOMPurify . Parece que não está exposto na API deles.
Então perguntei ao Google Gemini :
Ele me disse que não é possível modificar a configuração diretamente, pois ela não é acessível via API, mas também propôs usar o componente html via
st.components.v1.html(your_svg_code, height=110)
.Claramente não estou convencido, pois isso colocará sua imagem SVG dentro de um
<iframe>
, o que significa que você não poderá estilizá-la. Em segundo lugar, você terá que definir uma altura para este iframe, o que é estúpido no seu caso.Então vá para a opção A, criando um componente personalizado .