У меня есть приложение, которое хранит пользовательские данные в хранилище данных GCP. Я сделал задание cron, которое запланировано для экспорта данных в Datastore, используя инструкции, данные здесь.
Однако мне нужно изменить python2 на python3.
Согласно документы, приложение использует библиотеку app_identity для получения токенов.
from google.appengine.api import app_identity
access_token, _ = app_identity.get_access_token('https://www.googleapis.com/auth/datastore')
Но эта библиотека не поддерживается в python3 согласно здесь.
Как я могу получить access_token в python3?
Импорт google.appengine выдает ошибку как ошибку в python3:ModuleNotFoundError: нет модуля с именем 'google.appengine'
Ознакомьтесь с библиотекой google-api-python-клиент. Он поддерживается в Python 3 и упрощает создание запросов для API облачного хранилища данных.
Еще одна вещь, которую вам нужно изменить, — это библиотека webapp2
, поскольку она также не поддерживается в Python 3. Вы можете заменить ее чем-то вроде Flask.
Вот пример приложения, переписанного для Python 3:
приложение.yaml
runtime: python37
handlers:
- url: /.*
script: auto
(при необходимости разверните службу, отличную от службы по умолчанию, с помощью service: service_name
)
требования.txt
Flask
google-api-python-client
main.py
import datetime
import os
from googleapiclient.discovery import build
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
@app.route('/cloud-datastore-export')
def export():
# Deny if not from the Cron Service
assert request.headers['X-Appengine-Cron']
# Deny if output_url_prefix not set correctly
output_url_prefix = request.args.get('output_url_prefix')
assert output_url_prefix and output_url_prefix.startswith('gs://')
timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
if '/' not in output_url_prefix[5:]:
# Only a bucket name has been provided - no prefix or trailing slash
output_url_prefix += '/' + timestamp
else:
output_url_prefix += timestamp
kinds = request.args.getlist('kind')
namespace_ids = request.args.getlist('namespace_id')
entity_filter = {
'kinds': kinds,
'namespace_ids': namespace_ids
}
body = {
'output_url_prefix': output_url_prefix,
'entity_filter': entity_filter
}
project_id = os.environ.get('GOOGLE_CLOUD_PROJECT')
client = build('datastore', 'v1')
client.projects().export(projectId=project_id, body=body).execute()
return 'Operation started'
if __name__ == '__main__':
# This is used when running locally only. When deploying to Google App
# Engine, a webserver process such as Gunicorn will serve the app. This
# can be configured by adding an `entrypoint` to app.yaml.
# Flask's development server will automatically serve static files in
# the "static" directory. See:
# http://flask.pocoo.org/docs/1.0/quickstart/#static-files. Once deployed,
# App Engine itself will serve those files as configured in app.yaml.
app.run(host='127.0.0.1', port=8080, debug=True)
Вы уверены, что он не поддерживается? для меня это просто их документация, которая не актуальна. app_identity должен иметь своего корреспондента в python3