Извлечение и отображение из Azure хранилища BLOB-объектов, до Flask Python, в HTML / JS? - PullRequest
0 голосов
/ 28 января 2020

У меня есть простое Flask Azure -webapp, которое я хотел бы, чтобы пользователь мог загружать изображения. Изображения затем сохраняются в Azure Blob.

import os, uuid
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient

try:
    print("Azure Blob storage v12 - Python quickstart sample")
    # Quick start code goes here
except Exception as ex:
    print('Exception:')
    print(ex)

connect_str = "XXXXX"
blob_service_client = BlobServiceClient.from_connection_string(connect_str)

container_name = 'kdprivatecontainer'
container_client = blob_service_client.get_container_client(container_name)

# List the blobs in the container
print("\nListing blobs...")
blob_list = container_client.list_blobs()
for blob in blob_list:
    print("\t" + blob.name)

. Я вижу имена файлов с помощью этого метода ... как передать изображения на интерфейсную веб-страницу, сохраняя при этом контейнер как «приватный».

Общий удар в темноте: но, очевидно, не работает: /

from flask import Flask, render_template
app = Flask(app)

@app.route("/showimg')
def showimage():
    blobimage = blob[9].url????
    return render_template('showimage.html, img=blobimage)

Any guidance is appreciated. :)

Ответы [ 2 ]

1 голос
/ 28 января 2020

Я полностью согласен с ответом @ GauravMantri: вам нужно создать URL с токеном sas для ваших изображений в виде больших двоичных объектов в личном контейнере, используя функцию generate_container_sas или generate_blob_sas из Azure Blob Storage SDK v12 для Python.

Кроме того, я думаю, что вам может понадобиться некоторый пример кода, который может работать для вас немедленно, поэтому я работал над ним.

Вот мой пример кода.

from datetime import datetime, timedelta
from azure.storage.blob import generate_container_sas, ContainerSasPermissions

account_name = "<your account name>"
account_key = "<your account key>"
container_name = "<your container name, such as `test`>"

# using generate_container_sas
def get_img_url_with_container_sas_token(blob_name):
    container_sas_token = generate_container_sas(
        account_name=account_name,
        container_name=container_name,
        account_key=account_key,
        permission=ContainerSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    blob_url_with_container_sas_token = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}?{container_sas_token}"
    return blob_url_with_container_sas_token

from azure.storage.blob import generate_blob_sas, BlobSasPermissions

# using generate_blob_sas
def get_img_url_with_blob_sas_token(blob_name):
    blob_sas_token = generate_blob_sas(
        account_name=account_name,
        container_name=container_name,
        blob_name=blob_name,
        account_key=account_key,
        permission=ContainerSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    blob_url_with_blob_sas_token = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}?{blob_sas_token}"
    return blob_url_with_blob_sas_token

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/showimg")
@app.route("/showimg/<blob_name>")
def hello_world(blob_name=None):
    img_url_with_sas_token = get_img_url_with_blob_sas_token(blob_name)
    # Or 
    # img_url_with_sas_token = get_img_url_with_container_sas_token(blob_name)
    return render_template('showimage.html', img_url_with_sas_token=img_url_with_sas_token)

app.run()

И мой templates/showimage.html очень прост, как показано ниже.

<html>
<head>
</head>
<body>
    <img src="{{img_url_with_sas_token}}" />
</body>
</html>

В моем контейнере test есть изображение с именем test_cat2.jpg, которое я использовал для тестирования, поэтому результат показан на рисунке ниже.

enter image description here

1 голос
/ 28 января 2020

как передать изображения на интерфейсную веб-страницу, сохраняя контейнер как «приватный».

Учитывая, что контейнер больших двоичных объектов равен private, вам необходимо создать токен Shared Access Signature (SAS) с разрешением не менее Read и добавьте его к URL-адресу большого двоичного объекта (чтобы получить URL-адрес SAS). Когда вы будете использовать этот URL-адрес SAS во внешнем интерфейсе, вы сможете отобразить содержимое BLOB-объекта.

Вы можете создать SAS для контейнера с помощью generate_container_sas и использовать его с все BLOB-объекты или создать уникальный SAS для каждого BLOB-объекта в списке, используя generate_blob_sas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...