В Python App Engine Как однозначно идентифицировать экземпляр моего приложения, работающего на Dev SDK? - PullRequest
1 голос
/ 25 августа 2011

Мое приложение использует внешнюю службу, с которой оно связывается с помощью urlfetch.У меня есть несколько разработчиков, каждый из которых запускает свой экземпляр своего приложения на своих компьютерах для разработки, в то время как они добавляют функции.Каждый экземпляр разработчика должен иметь возможность уникально идентифицировать себя для внешней службы, чтобы внешняя служба могла хранить свои данные разделенными.

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

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

Кроме того, я мог бы прочитать некоторую информацию об оборудованиина компьютере (например, MAC-адрес) и используйте его, но я хочу, чтобы этот код использовал только те вещи, которые работают на производственном сервере, чтобы я мог в конечном итоге использовать его и там.

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Единственный трюк, который я видел для идентификации экземпляров, - это использование адреса глобальной переменной.

UNIQUE_INSTANCE_ID = {} # at module level
logging.debug("Instance %s." % (str("%X" % id( UNIQUE_INSTANCE_ID )).zfill(16)))

Это, кажется, работает довольно хорошо для уникальной идентификации экземпляра; но он идентифицирует только экземпляр, а не машину. Поэтому, если вы перезапустите свой экземпляр, вы получите новый идентификатор. Это может быть «фича».

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

По крайней мере, вы можете сделать инъекцию UUID в часть хранилища данных; сохраните вид метаданных в хранилище данных и в кэше и включите этот UUID в запросы.

from uuid import uuid4
from google.appengine.ext import db
from google.appengine.api import memcache

cache = memcache.Client()

class InstanceStamp(db.Model):
    code = db.StringProperty()

    INSTANCE_STAMP_KEY = "instance_stamp"

    @classmethod
    def get_stamp(cls):
        cache_key = cls.INSTANCE_STAMP_KEY 
        stamp_code = cache.get(cache_key)
        if stamp_code is None:
            code = uuid4().hex
            stamp = cls.get_or_insert('instance_stamp', code=code)
            if stamp is not None:
                cache.set(cache_key, stamp.code, 300)
                stamp_code = stamp.code
        return stamp_code
0 голосов
/ 25 августа 2011

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

Например, строковый ключ для Foo: 1 на одном компьютере:

ahNkZXZ-bWVkaWFjb29sZXItYXBwcgkLEgNGb28YAQw

На другой машине это:

ahFzfm1lZGlhY29vbGVyLWFwcHIJCxIDRm9vGAEM

Я не уверен, сколько символов (битов?) Ключа представляет имя приложения вместо типа и идентификатора объекта, поэтому я не считаю правильным использование подстроки, содержащей первые N символов, способ сделать это.

Первая попытка:

def get_unique_id():
    return str(db.Key.from_path('UNIQUE_INSTANCE_ID', 1))

То, что он делает, это создает фиктивную db.Key для типа модели, который не существует. На разных машинах это дает различное значение, а на одном и том же компьютере оно последовательно дает одно и то же значение.

UPDATE:

Как отметил @ Ник Джонсон, на самом деле это работает не так, как я ожидал, и не решает проблему. Я предполагал, что это appid в app.yaml, используемый в ключе, однако appid, используемый для ключей, - это appid из app.yaml с префиксом в зависимости от того, выполняется ли приложение в SDK или в хранилище данных HR, поэтому строковое представление этих ключей отличается, потому что appid в них отличается.

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