Módulo google.appengine.ext.blobstore.blobstore

Resumo

Uma blobstore API do Python usada por desenvolvedores de apps.

Este módulo contém métodos usados para interagir com a Blobstore API. O módulo inclui uma classe semelhante a db.Model que representa uma referência a um blob muito grande. O módulo importa uma classe semelhante a db.Key que representa uma chave de blob.

Conteúdo

exception google.appengine.ext.blobstore.blobstore.BlobFetchSizeTooLargeErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

Não foi possível buscar o bloco porque ele era muito grande.

class google.appengine.ext.blobstore.blobstore.BlobInfo(entity_or_blob_key, _values=None)Fonte

Bases: object

Informações sobre blobs no Blobstore.

Classe semelhante a db.Model que contém informações sobre blobs armazenados por um aplicativo. Assim como db.Model, esta classe tem o apoio de uma entidade Datastore. Porém, as instâncias BlobInfo são somente leitura e têm uma interface muito mais limitada.

Cada BlobInfo tem uma chave do tipo BlobKey associada. Essa chave é específica da Blobstore API e não é compatível com db.get. A chave pode ser usada para pesquisa rápida, basta passá-la para BlobInfo.get. Essa chave é convertida facilmente em uma string segura para a Web e que pode ser incorporada a URLs.

Propriedades:
  • content_type: tipo de conteúdo do blob

  • creation: data de criação ou upload do blob

  • filename: nome de arquivo selecionado pelo usuário na máquina dele

  • size: tamanho do blob descompactado

  • md5_hash: valor de hash MD5 do blob enviado

gs_object_name: nome do objeto, caso o blob esteja armazenado no

Google Cloud Storage, no formato /[nome_do_bucket]/[nome_do_objeto]

Todas as propriedades são somente leitura. A tentativa de atribuir um valor a uma propriedade vai gerar um NotImplementedError.

classmethod all()Fonte

Cria uma consulta para todos os objetos BlobInfo associados ao app.

Retorna

Um objeto db.Query que consulta o tipo de armazenamento de dados do BlobInfo.

content_type

Retorna o tipo de conteúdo do blob.

Retorna

O tipo de conteúdo do blob.

creation

Retorna a data de criação ou a hora do upload do blob.

Retorna

Data de criação ou hora do upload do blob.

delete(_token=None)Fonte

Exclui permanentemente um blob do Blobstore.

filename

Retorna o nome de arquivo que o usuário selecionou na máquina dele.

Retorna

O nome do arquivo que o usuário selecionou.

classmethod from_entity(entity)Fonte

Converte uma entidade em BlobInfo.

Parâmetros

entity: entidade que você está tentando converter.

Retorna

O BlobInfo convertido pela entidade.

classmethod get(blob_keys)Fonte

Recupera um BlobInfo por chave ou por uma lista de chaves.

Parâmetros

blob_keys: uma chave ou uma lista de chaves. As chaves podem estar em formato string, Unicode ou BlobKey.

Retorna

Uma instância de BlobInfo associada à chave fornecida ou uma lista de instâncias de BlobInfo, caso uma lista de chaves tenha sido fornecida. As chaves não encontradas no Blobstore retornam None.

classmethod gql(query_string, *args, **kwds)Fonte

Retorna uma consulta que usa uma string de consulta GQL.

Consulte GQL source para mais informações sobre GQL.

Parâmetros
  • query_string: uma string de consulta GQL formatada corretamente que omite SELECT * FROM <entity>

  • *args: os demais argumentos de posição usados para vincular referências numéricas na consulta

  • **kwds: os argumentos baseados em dicionário para parâmetros nomeados

Retorna

Um objeto gql.GqlQuery que consulta o tipo de armazenamento de dados do BlobInfo.

gs_object_name
key()Fonte

Recebe a chave de um blob.

Retorna

A instância de BlobKey que identifica esse blob.

classmethod kind()Fonte

Recebe o tipo de entidade do BlobInfo.

Retorna

O tipo de entidade de BlobInfo.

md5_hash

Retorna o valor de hash MD5 do blob descompactado.

Retorna

O valor de hash do blob descompactado.

open(*args, **kwargs)Fonte

Retorna um BlobReader para este blob.

Parâmetros
  • *args: argumentos a serem passados para o construtor BlobReader

  • **kwargs: argumentos de palavra-chave a serem passados para o construtor BlobReader

Retorna

Uma instância de BlobReader.

classmethod properties()Fonte

Define o conjunto de propriedades pertencentes a BlobInfo.

Retorna

Um conjunto de todas as propriedades pertencentes a BlobInfo.

size

Retorna o tamanho do blob descompactado.

Retorna

O tamanho do blob descompactado.

exception google.appengine.ext.blobstore.blobstore.BlobInfoParseErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

O parâmetro CGI não contém um registro BlobInfo válido.

class google.appengine.ext.blobstore.blobstore.BlobKey(blob_key)Fonte

Bases: object

Chave usada para identificar um blob no Blobstore.

Esse objeto encapsula uma string usada internamente pela Blobstore API para identificar blobs de aplicativo. O BlobKey corresponde ao nome da entidade BlobReference subjacente.

Essa classe é exposta na API em google.appengine.ext.db e google.appengine.ext.blobstore.

ToXml()Fonte
class google.appengine.ext.blobstore.blobstore.BlobMigrationRecord(parent=None, key_name=None, _app=None, _from_entity=False, **kwds)Fonte

Bases: google.appengine.ext.db.Model

Define um modelo que registra o resultado de uma migração de blob.

classmethod get_by_blob_key(old_blob_key)Fonte

Busca o BlobMigrationRecord da chave de blob especificada.

Parâmetros

old_blob_key: a chave de blob usada no app anterior

Retorna

Uma instância de blobstore.BlobMigrationRecord ou None.

classmethod get_new_blob_key(old_blob_key)Fonte

Pesquisa a nova chave em busca de um blob.

Parâmetros

old_blob_key: a chave de blob original

Retorna

O blobstore.BlobKey do blob migrado.

classmethod kind()Fonte

Especifica o tipo de blob que você está migrando.

Retorna

O tipo de blob que você está migrando

new_blob_ref

Propriedade compatível com classes db.Model.

Adiciona referências a blobs para modelos de domínio que usam BlobReferenceProperty:

class Picture(db.Model):
  title = db.StringProperty()
  image = blobstore.BlobReferenceProperty()
  thumbnail = blobstore.BlobReferenceProperty()

Para encontrar o tamanho de uma imagem que usa esse modelo:

picture = Picture.get(picture_key)
print picture.image.size

Os objetos BlobInfo são carregados lentamente. Dessa maneira, iterar modelos para BlobKeys é eficiente. O seguinte código de amostra não precisa acessar o Datastore para cada chave de imagem:

list_of_untitled_blobs = []
for picture in Picture.gql("WHERE title=''"):
  list_of_untitled_blobs.append(picture.image.key())
exception google.appengine.ext.blobstore.blobstore.BlobNotFoundErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

O blob não existe.

class google.appengine.ext.blobstore.blobstore.BlobReferenceProperty(verbose_name=None, name=None, default=None, required=False, validator=None, choices=None, indexed=True)Fonte

Bases: google.appengine.ext.db.Property

Propriedade compatível com classes db.Model.

Adiciona referências a blobs para modelos de domínio que usam BlobReferenceProperty:

class Picture(db.Model):
  title = db.StringProperty()
  image = blobstore.BlobReferenceProperty()
  thumbnail = blobstore.BlobReferenceProperty()

Para encontrar o tamanho de uma imagem que usa esse modelo:

picture = Picture.get(picture_key)
print picture.image.size

Os objetos BlobInfo são carregados lentamente. Dessa maneira, iterar modelos para BlobKeys é eficiente. O seguinte código de amostra não precisa acessar o Datastore para cada chave de imagem:

list_of_untitled_blobs = []
for picture in Picture.gql("WHERE title=''"):
  list_of_untitled_blobs.append(picture.image.key())
data_type

alias de BlobInfo

get_value_for_datastore(model_instance)Fonte

Retorna uma propriedade de modelo traduzida para um valor de armazenamento de dados.

Parâmetros

model_instance: propriedade de modelo que você quer traduzir

Retorna

A propriedade de modelo traduzida do armazenamento de dados.

make_value_from_datastore(value)Fonte

Retorna um valor de armazenamento de dados para BlobInfo.

Parâmetros

value: valor de armazenamento de dados que você quer traduzir

Retorna

Um BlobInfo traduzido do armazenamento de dados.

validate(value)Fonte

Valida se um valor atribuído é BlobInfo.

Esse método converte automaticamente strings e instâncias de BlobKey.

Parâmetros

value: valor que você quer validar

Retorna

Informações sobre se um valor atribuído é BlobInfo.

class google.appengine.ext.blobstore.blobstore.BlobReader(blob, buffer_size=131072, position=0)Fonte

Bases: object

Fornece uma interface semelhante à de um arquivo somente leitura para um blob do blobstore.

SEEK_CUR = 1
SEEK_END = 2
SEEK_SET = 0
blob_info

Retorna o BlobInfo deste arquivo.

Retorna

Uma string que contém o BlobInfo.

close()Fonte

Fecha o arquivo.

Um arquivo fechado não pode mais ser lido ou gravado. Uma operação que exige que o arquivo a ser aberto gere um ValueError depois que o arquivo tiver sido fechado. É permitido chamar close() mais de uma vez.

closed

Determina se um arquivo está fechado.

Retorna

True se este arquivo estiver fechado, os arquivos abertos retornarão False.

flush()Fonte
next()Fonte

Retorna a próxima linha do arquivo.

Retorna

Uma string terminada em \n. A última linha não pode terminar com \n. Se o fim do arquivo for alcançado, uma string vazia será retornada.

Gera

StopIteration: se não houver mais linhas a serem lidas.

read(size=-1)Fonte

size bytes do arquivo, no máximo.

Menos bytes serão lidos se a leitura alcançar o fim do arquivo antes de conseguir size bytes. Se o argumento size for negativo ou omitido, todos os dados serão lidos até o fim do arquivo ser alcançado. Os bytes são retornados como um objeto de string. Uma string vazia é retornada imediatamente quando o fim do arquivo é alcançado.

Chamar read() sem especificar um size pode ser perigoso, porque pode ler volumes excessivos de dados.

Parâmetros

size: (opcional) número máximo de bytes a serem lidos. Quando omitido, read() retorna todos os dados restantes no arquivo.

Retorna

Os dados lidos, como uma string.

readline(size=-1)Fonte

Lê uma linha inteira do arquivo.

Um caractere de nova linha à direita é mantido na string, mas pode estar ausente quando um arquivo termina com uma linha incompleta. Se o argumento size estiver presente e não negativo, ele representará uma contagem máxima de bytes, inclusive a nova linha à direita, e uma linha incompleta poderá ser retornada. Uma string vazia só é retornada imediatamente quando o fim do arquivo é alcançado.

Parâmetros

size: (opcional) número máximo de bytes a serem lidos.

Retorna

Os dados lidos, como uma string.

readlines(sizehint=None)Fonte

Lê até o fim do arquivo usando readline().

Uma lista de linhas lidas é retornada.

Se o argumento sizehint opcional estiver presente, em vez de ler até o fim do arquivo, linhas inteiras, totalizando aproximadamente sizehint bytes, serão lidas, possivelmente depois de arredondar para cima um tamanho de buffer interno.

Parâmetros

sizehint: uma dica quanto ao número máximo de bytes a serem lidos

Retorna

Uma lista de strings, cada uma sendo uma linha única do arquivo.

seek(offset, whence=0)Fonte

Define a posição atual do arquivo, como fseek() de stdio.

Parâmetros
  • offset: desvio relativo a ser procurado

  • whence: (opcional) define a que valor o desvio é relativo. Esse argumento assume como padrão os.SEEK_SET ou 0 para usar um posicionamento de arquivo absoluto. Outros valores válidos são os.SEEK_CUR ou 1 para procurar o relativo à posição atual e os.SEEK_END ou 2 para procurar o relativo ao fim do arquivo.

tell()Fonte

Recupera a posição atual do arquivo, como ftell() de stdio.

Retorna

A posição atual do arquivo.

truncate(size)Fonte

Vai gerar um erro se você tentar truncar o arquivo.

Parâmetros

size: tamanho que você está tentando truncar

Gera

IOError: se você tentar truncar um arquivo em BlobReader.

write(str)Fonte

Vai gerar um erro se você tentar gravar no arquivo.

Parâmetros

str: a string que você está tentando gravar

Gera

IOError: se você tentar gravar em um arquivo em BlobReader.

writelines(sequence)Fonte

Vai gerar um erro se você tentar gravar no arquivo.

Parâmetros

sequence: sequência de strings que você está tentando gravar

Gera

IOError: se você tentar gravar linhas em um arquivo em BlobReader.

class google.appengine.ext.blobstore.blobstore.FileInfo(filename=None, content_type=None, creation=None, size=None, md5_hash=None, gs_object_name=None)Fonte

Bases: object

Detalha informações sobre arquivos enviados.

Esta classe contém informações sobre blobs armazenados por um aplicativo.

Esta classe é semelhante a BlobInfo. Porém, esse método não usa uma chave, e as informações não são mantidas no armazenamento de dados.

Propriedades:
  • content_type: tipo de conteúdo do arquivo carregado

  • creation: data de criação ou upload do

    arquivo

  • filename: nome de arquivo selecionado pelo usuário na máquina dele

  • size: tamanho do arquivo descompactado

  • md5_hash: valor de hash MD5 do arquivo enviado

  • gs_object_name: nome do arquivo gravado no Google Cloud Storage ou None, caso o arquivo não tenha sido enviado para o Google Cloud Storage

Todas as propriedades são somente leitura. A tentativa de atribuir um valor a uma propriedade vai gerar um AttributeError.

content_type

Retorna o tipo de conteúdo do arquivo enviado.

Retorna

O tipo de conteúdo do arquivo.

creation

Retorna a data de criação ou a hora de upload do arquivo.

Retorna

A data de criação ou a hora de upload do arquivo.

filename

Retorna o nome do arquivo selecionado pelo usuário.

Retorna

O nome do arquivo que o usuário selecionou.

gs_object_name

Retorna o nome do arquivo gravado no Cloud Storage.

Retorna

O nome do arquivo gravado no Cloud Storage.

md5_hash

Retorna o hash MD5 do arquivo enviado.

Retorna

O valor de hash do arquivo enviado.

size

Retorna o tamanho do arquivo descompactado.

Retorna

O tamanho do arquivo descompactado.

exception google.appengine.ext.blobstore.blobstore.FileInfoParseErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

O parâmetro CGI não contém um registro FileInfo válido.

exception google.appengine.ext.blobstore.blobstore.DataIndexOutOfRangeErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

Não foi possível acessar os índices.

Os índices especificados estavam fora do intervalo ou na ordem errada.

exception google.appengine.ext.blobstore.blobstore.PermissionDeniedErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

A operação não foi concluída. Examine as permissões obrigatórias.

exception google.appengine.ext.blobstore.blobstore.ErrorFonte

Bases: exceptions.Exception

Tipo de erro do blobstore de base.

exception google.appengine.ext.blobstore.blobstore.InternalErrorFonte

Bases: google.appengine.api.blobstore.blobstore.Error

Ocorreu um erro interno.

google.appengine.ext.blobstore.blobstore.create_rpc(deadline=None, callback=None)Fonte

Cria um objeto RPC a ser usado com a Blobstore API.

Parâmetros
  • deadline: prazo opcional em segundos para a operação (o valor padrão é um prazo específico do sistema, geralmente de cinco segundos)

  • callback: chamável opcional a ser invocado na conclusão

Retorna

Um objeto apiproxy_stub_map.UserRPC especializado para este serviço.

google.appengine.ext.blobstore.blobstore.create_upload_url(success_path, max_bytes_per_blob=None, max_bytes_total=None, rpc=None, gs_bucket_name=None)Fonte

Cria o URL de upload para uma forma POST.

Parâmetros
  • success_path: caminho dentro do aplicativo a ser chamado quando uma chamada POST for bem-sucedida e o upload for concluído

  • max_bytes_per_blob: tamanho máximo em bytes que qualquer blob no upload pode ter ou None para nenhum tamanho máximo

  • max_bytes_total: tamanho máximo em bytes que os tamanhos agregados de todos os blobs no upload podem ter ou None para nenhum tamanho máximo

  • rpc: um objeto UserRPC opcional

  • gs_bucket_name: nome do intervalo do Google Cloud Storage que será o destino dos blobs enviados. A conta de serviço do aplicativo precisa ter as permissões corretas para gravar nesse intervalo. O nome do intervalo pode ser do formato bucket/path/, quando o caminho incluído será pré-anexado ao nome do objeto enviado.

Retorna

O URL de upload.

Gera
  • TypeError: caso max_bytes_per_blob ou max_bytes_total não sejam tipos integrais;

  • ValueError: caso max_bytes_per_blob ou max_bytes_total não sejam valores positivos.

google.appengine.ext.blobstore.blobstore.create_upload_url_async(success_path, max_bytes_per_blob=None, max_bytes_total=None, rpc=None, gs_bucket_name=None)Fonte

Cria de maneira assíncrona o URL de upload para um formulário POST.

Parâmetros
  • success_path: caminho dentro do aplicativo a ser chamado quando uma chamada POST for bem-sucedida e o upload for concluído

  • max_bytes_per_blob: tamanho máximo em bytes que qualquer blob no upload pode ter ou None para nenhum tamanho máximo

  • max_bytes_total: tamanho máximo em bytes que os tamanhos agregados de todos os blobs no upload podem ter ou None para nenhum tamanho máximo

  • rpc: um objeto UserRPC opcional

  • gs_bucket_name: nome do intervalo do Google Cloud Storage que será o destino dos blobs enviados. A conta de serviço do aplicativo precisa ter as permissões corretas para gravar nesse intervalo. O nome do intervalo pode ser do formato bucket/path/, quando o caminho incluído será pré-anexado ao nome do objeto enviado.

Retorna

Um UserRPC com um resultado que será o URL de upload.

Gera
  • TypeError: caso max_bytes_per_blob ou max_bytes_total não sejam tipos integrais;

  • ValueError: caso max_bytes_per_blob ou max_bytes_total não sejam valores positivos.

google.appengine.ext.blobstore.blobstore.delete(blob_keys, rpc=None, _token=None)Fonte

Exclui um blob do Blobstore.

Parâmetros
  • blob_keys: uma instância de BlobKey única ou uma lista de chaves de blob (uma chave de blob pode ser uma string ou uma instância de BlobKey)

  • rpc: um objeto UserRPC opcional

Retorna

Nenhum.

google.appengine.ext.blobstore.blobstore.delete_async(blob_keys, rpc=None, _token=None)Fonte

Exclui de maneira assíncrona um blob do Blobstore.

Parâmetros
  • blob_keys: uma instância de BlobKey única ou uma lista de chaves de blob (uma chave de blob pode ser uma string ou uma instância de BlobKey)

  • rpc: um objeto UserRPC opcional

Retorna

Um UserRPC com um resultado que será None.

google.appengine.ext.blobstore.blobstore.fetch_data(blob, start_index, end_index, rpc=None)Fonte

Busca dados de um blob.

Busca um fragmento de um blob de até MAX_BLOB_FETCH_SIZE. A tentativa de buscar um fragmento que excede os limites do blob retornará o valor de dados de start_index até o fim do blob, que terá um tamanho menor que o solicitado. Solicitar um fragmento que esteja totalmente fora dos limites do blob retornará uma string vazia. A tentativa de buscar um índice negativo gerará uma exceção.

Parâmetros
  • blob: BlobInfo, BlobKey, string ou representação Unicode de BlobKey do blob de que você quer buscar dados

  • start_index: índice inicial de dados de blob a ser buscado (esse valor não precisa ser negativo)

  • end_index: índice final (inclusive) dos dados de blob a ser buscado (esse valor precisa ser maior que ou igual a start_index)

  • rpc: um objeto UserRPC opcional

Retorna

Uma string que contém dados parciais de um blob. Se os índices forem legais, mas estiverem fora dos limites do blob, uma string vazia será retornada.

Gera
  • TypeError: se start_index ou end_index não forem índices, ou se blob não for uma string, BlobKey ou BlobInfo;

  • DataIndexOutOfRangeError: se start_index estiver definido como um valor menor que 0 ou end_index se for menor que start_index;

  • BlobFetchSizeTooLargeError: se o fragmento de blob solicitado for maior que MAX_BLOB_FETCH_SIZE;

  • BlobNotFoundError: se o blob não existir.

google.appengine.ext.blobstore.blobstore.fetch_data_async(blob, start_index, end_index, rpc=None)Fonte

Busca de maneira assíncrona dados de um blob.

Busca um fragmento de um blob de até MAX_BLOB_FETCH_SIZE. A tentativa de buscar um fragmento que excede os limites do blob retornará o valor de dados de start_index até o fim do blob, que terá um tamanho menor que o solicitado. Solicitar um fragmento que esteja totalmente fora dos limites do blob retornará uma string vazia. A tentativa de buscar um índice negativo gerará uma exceção.

Parâmetros
  • blob: BlobInfo, BlobKey, string ou representação Unicode de BlobKey do blob de que você quer buscar dados

  • start_index: índice inicial de dados de blob a ser buscado (esse valor não precisa ser negativo)

  • end_index: índice final (inclusive) dos dados de blob a ser buscado (esse valor precisa ser maior que ou igual a start_index)

  • rpc: um objeto UserRPC opcional

Retorna

Um UserRPC com um resultado que será uma string conforme retornado por fetch_data().

Gera
  • TypeError: se start_index ou end_index não forem índices, ou se blob não for uma string, BlobKey ou BlobInfo;

  • DataIndexOutOfRangeError: se start_index for definido como um valor menor que 0 ou end_index for menor que start_index durante a chamada de rpc.get_result();

  • BlobFetchSizeTooLargeError: se o fragmento de blob solicitado for maior que MAX_BLOB_FETCH_SIZE durante a chamada de rpc.get_result();

  • BlobNotFoundError: se o blob não existir durante a chamada rpc.get_result().

google.appengine.ext.blobstore.blobstore.create_gs_key(filename, rpc=None)Fonte

Cria uma chave codificada para um arquivo do Google Cloud Storage.

É seguro manter essa chave para uso futuro.

Parâmetros
  • filename: nome de arquivo do objeto do Google Cloud Storage referente à chave que será criada

  • rpc: um objeto UserRPC opcional

Retorna

Uma string de BlobKey criptografada.

google.appengine.ext.blobstore.blobstore.create_gs_key_async(filename, rpc=None)Fonte

Cria, de maneira assíncrona, uma chave codificada para um arquivo do Google Cloud Storage.

É seguro manter essa chave para uso futuro.

Parâmetros
  • filename: nome de arquivo do objeto do Google Cloud Storage referente à chave que será criada

  • rpc: um objeto UserRPC opcional

Retorna

Um UserRPC com um resultado que será uma string conforme retornado por create_gs_key().

Gera
  • TypeError: se filename não for uma string;

  • ValueError: se filename não estiver no formato /gs/bucket_name/object_name.

google.appengine.ext.blobstore.blobstore.get(blob_key)Fonte

Recebe um registro BlobInfo do blobstore.

Faz o mesmo que BlobInfo.get.

Parâmetros

blob_key: BlobKey do registro que você quer recuperar

Retorna

Uma instância de BlobInfo associada à chave fornecida ou a uma lista de instâncias de BlobInfo caso uma lista de chaves tenha sido fornecida. As chaves não encontradas no Blobstore retornam None.

google.appengine.ext.blobstore.blobstore.parse_blob_info(field_storage)Fonte

Analisa um registro BlobInfo do upload de arquivo field_storage.

Parâmetros

field_storage: cgi.FieldStorage que representa um blob enviado

Retorna

Um registro BlobInfo conforme analisado pela instância field_storage. Esse método retornará None se field_storage não tiver sido definido.

Gera

BlobInfoParseError: se o field_storage fornecido não contiver informações suficientes para criar um objeto BlobInfo.

google.appengine.ext.blobstore.blobstore.parse_file_info(field_storage)Fonte

Analisa um registro FileInfo do upload de arquivo field_storage.

Parâmetros

field_storage: cgi.FieldStorage que representa o arquivo enviado

Retorna

Registro FileInfo conforme analisado pela instância field_storage. Esse método retornará None se field_storage não tiver sido especificado.

Gera

FileInfoParseError: se field_storage não contiver informações suficientes para criar um objeto FileInfo.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2