Как я могу динамически загружать шаблоны Jinja2 из Google Cloud Storage в App Engine? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть приложение на App Engine, и я хочу развернуть шаблоны Jinja2 таким образом, чтобы я мог динамически обновлять их без необходимости повторного развертывания всего приложения.

В идеале они должны храниться в облачном хранилище Google, что позволило бы мне просто заменить файлы шаблонов в корзине и немедленно использовать их в реальном приложении. Однако Flask требует, чтобы шаблоны были локальными для приложения.

Это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вот хорошая оболочка для вызова метода Flask render_template (), чтобы достичь этого, либо

  • 1) загружает статический файл с URL, передавая параметры
  • 2) или передает имя файла и параметры в обычный метод Flask render_template.

Затем вы можете скопировать файл / templates в ваш CDN Google и сослаться на публичный URL

-

from flask import Flask, render_template, render_template_string


def renderTemplateLocalOrRemote(file, **kwargs): 
     if REMOTE_LOADING_ENABLED is defined: # Load the template file remotely
         r = requests.get('https://'+YOUR_BASE_URL+"/templates/"+file)
         template_string = r.content.decode('utf-8')
         return render_template_string(template_string, **kwargs)
     else: # Load the template file from local, pass on to standard method
         return render_template(file, **kwargs)

Затем вы можете использовать эту оболочку везде, где вы использовали flask.render_template ()

@app.route('/')
def hello():
    return renderTemplateLocalOrRemote('hello.html', name='lalala', another_param='lilili')

@app.route('/another_route')
def hello2():
    return renderTemplateLocalOrRemote('hello2.html', different_param='lilili')

и включить / выключить его с помощью

REMOTE_LOADING_ENABLED
0 голосов
/ 05 сентября 2018

Это можно сделать, загрузив каждый шаблон непосредственно из Google Cloud Storage для каждого запроса и используя функцию render_template_string из Flask.

Например, если ваш файл шаблона hello.html выглядит так:

<h1>Hello {{ name }}!</h1>

Добавьте ресурс облачного хранилища Google в свое приложение, создайте новый сегмент (назовем его your-bucket) и загрузите этот файл в корзину.

В вашем requirements.txt:

flask
google-cloud-storage

В вашем main.py:

from flask import Flask, render_template_string
from google.cloud import storage

app = Flask(__name__)

# Initialize the bucket you created containing the templates
bucket = storage.Client().bucket('your-bucket')

@app.route('/')
def hello():
    # Load the template string from Cloud Storage
    template_string = bucket.blob('hello.html').download_as_string().decode('ascii')

    # Now use render_template_string the same way you'd use render_template
    return render_template_string(template_string, name='World')

Обратите внимание, что, поскольку это приложение будет повторно загружать шаблон для каждого запроса, для приложений с большим трафиком это может потребовать значительного дополнительного времени для запроса, а также затрат.

В связи с этим было бы идеально «кэшировать» строку шаблона каким-либо образом (например, через Cloud Memorystore ), а затем использовать Уведомление об изменении объекта ( возможно с помощью триггера Google Cloud Function ), чтобы определить, когда файл изменился в корзине, и обновить кэш.

...