Flask + Облачное хранилище данных: маршрутизирует параметры, собирающие идентификаторы сущностей, которые имеют родственные связи - PullRequest
0 голосов
/ 09 марта 2020

Google Cloud Datastore использует ключи для идентификации и запроса Entities. Это хорошо работает с параметрами URL Flask .route при запросе сущностей:

from google.cloud import datastore
client = datastore.Client()

@app.route('/post/<post_id>', methods=['GET', 'POST'])
def post(post_id):
    post = client.get(client.key('Post', post_id)) 
    return client

Однако это работает, только если у клавиши Post нет ancestors:

Key('Post', 'post123')

Но что, если клавиша Post на самом деле имеет ancestors, как показано ниже?

Key('User', 'user123', 'Post', 'post123')

Это означает, что маршрут flask больше не будет обрабатывать /post/<post_id>, поскольку post_id вдоль не представляет всю сущность.

Каковы возможные решения этой ситуации?

1 Ответ

0 голосов
/ 11 марта 2020

То же, что и файловая система каталогов. Объекты иерархически структурированы в облачном хранилище данных. Этот тип структуры делает его аккуратным при организации ваших данных.

Из Документация :

Полный ключ, идентифицирующий объект, состоит из последовательности пар идентификатора вида, указывающих путь его предка и оканчивающихся таковыми у самого объекта:

Категория объекта -> Вид

Один объект -> Объект

Отдельные данные для объекта -> Свойство

Уникальный идентификатор объекта -> Ключ

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

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

from flask import Flask, render_template, redirect, request
from google.cloud import datastore
from markupsafe import escape

# Starting Datastore Client.
client = datastore.Client()

# Home page will do a redirect to the specified URL.
@app.route('/')
def hello():
    return redirect('/post/<post_id>', code=302)

# The URL that we are intestered in. 
@app.route('/post/<post_id>', methods=['GET', 'POST'])
def profile(post_id):

# Query the post ID using its ancestors. 

# Method is always 'GET' by default, I kept it 'GET' just for testing purposes.
if request.method == 'GET' and request.url == '<post_id>':
    return '{} is the post ID'.format(escape(post_id))
else:
    return '{} is the post ID'.format(escape(post_id))



# The actual Flask app.
app = Flask(__name__)

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)

Хотя я знаю, что это может не дать вам прямой ответ, я верю этому укажет вам в правильном направлении.

...