2017-08-17 39 views
1

所以我有一個燒瓶+忍者的設置,我試圖在由jinja渲染的html文件中顯示圖像。如何在jinja html模板中發送圖像?

在Python中,我將它轉換爲base64,然後發送給模板。然後我使用圖像標籤來顯示圖像。

<img src="data:image/jpeg;base64,{{ myimage }}"> 

我已經證實了Python編碼是正確的,它顯示爲它應該當我簡單的寫有嵌入它以base64一個HTML文件。它似乎失敗的地方在於模板修改輸出一點點。特別是:

<img src=3D"data:;base64,/9j/4QAYR 
... 
baW4WqWj/2Q=3D=3D"/> 

神社似乎是在幾個地方,它看起來像它不應該添加文本3D各地擰。我沒有指定任何不同的東西,當我以文本方式打印出myimage時,它按照我預期的方式出現,以/ 9j開頭並以/ 2Q結尾=

我不確定是否有我在Jijna中解釋它的方式或什麼,但它只是不加載。我在電子郵件源中看到了圖像src標籤,但沒有任何我期望圖像被加載的地方。

回答

0

這看起來像一個URL編碼問題,因爲=是該base64字母表中使用的字符,其URL編碼爲%3D。在使用Jinja進行渲染之前,請嘗試對base64數據執行urllib.quote

+0

變量假冒到神社之前,我試圖做urllib.parse.quote但這並沒有改變結果。 –

+0

您可以發佈您嘗試呈現的base64數據以及呈現的HTML中顯示的內容嗎?我正在測試一個尾隨'=='的數據示例,並且在渲染時沒有問題。 – jackarms

+0

不幸的是,我目前無法發佈這些數據。我只能確認,當我通過base64解碼器拋出它時,或者將該html寫入一個普通的.html文件時,它可以正確渲染。 –

0

標記變量myimage爲安全:

<img src="data:image/jpeg;base64,{{ myimage | safe }}"> 

簡單的單文件的應用程序(使用請求庫):

from flask import Flask, render_template_string 
import base64 
import requests 

app = Flask(__name__) 

global _base64_encoded_image 


@app.route('/') 
def index(): 
    _html_template = ''' 
     <p><img src="data:image/jpeg;base64,{{ myimage | safe }}"><p> 
     <p><img src="data:image/jpeg;base64,{{ myimage | e }}"><p>  
     <p><img src="data:image/jpeg;base64,{{ myimage }}"><p> 
    ''' 
    global _base64_encoded_image 
    return render_template_string(_html_template, myimage=_base64_encoded_image) 


@app.before_first_request 
def before_first_request(): 
    global _base64_encoded_image 
    _url = "http://via.placeholder.com/200?text=Flask/Jinja2" 
    _r = requests.get(_url) 
    _base64_encoded_image = base64.b64encode(_r.content) 
    print _base64_encoded_image 


if __name__ == '__main__': 
    app.run() 
+0

不幸的是,這並沒有奏效。它仍然像引用內容傳輸編碼一樣引用,並且仍然搞亂了「3D」的編碼,而這種編碼不應該在那裏。 –