Показаны сообщения с ярлыком google app engine. Показать все сообщения
Показаны сообщения с ярлыком google app engine. Показать все сообщения

пятница, 6 ноября 2009 г.

GAE | Свой домен

На текущий момент можно сделать только:
www.ваш_домен.все

Раньше можно было добавить в ДНС-записи А-запись с адресами гугла, но теперь так не сработает. Решение только одно - нужно где-то разместить сайт для домена 2ого уровня и сделать на нем редирект на www.домен. Я пока не искал как проще и за сколько такое сделать - у меня есть где повесить сайт-редирект. Еще вариант - можно купить домен у самого гугла (я не проверял). Или воспользоваться Web-forwarding (у ру-центра он есть).

Я столкнулся с обычной настройкой "своего домена" на app в GAE. Ру-центр. Самое важное - нужно зарегистрироваться в службах Google, так как это единственная возможность привязать свой домен к GAE приложению (я по глупости пытался как "частное лицо" найти решение).
Далее - нужна услуга ДНС-мастер secondary.

Далее всё по гуглу. В службах Google нужно выполнить "подтверждение владением домена". И добавить в ДНС записи:
google_ваша_строка_даст_гугл СNAME google.com.
www CNAME ghs.google.com.

И учтите, что домен должен быть делегирован. Я по малоопытности прождал 2 дня. Потом погуляв по личному кабинету настройки доменов увидел, что нужный мне домен не делегирован...

среда, 28 октября 2009 г.

DJANGO | Шаблоны | Свой фильтр в условиях GAE

О`кей. Расскажу как сделать свой фильтр для Django 0.96 (для работы в Google App Engine). Конечно на питоне!

1. в корне проекта создаем файл 'django_template_custom_filters.py':
# coding: utf-8

from google.appengine.ext import webapp

register = webapp.template.create_template_register()

def fctitle(text):
    """
    First char title
    """
    result=''
    if text and len(text)>0:
        result=text[0]
        result=result.title()+text.__getslice__(1,len(text))
        return result
    else:
        return ''
    
    
register.filter(fctitle)

2. В нужном контроллере (скрипт, который дергается по урл'у):
webapp.template.register_template_library('django_template_custom_filters')

3. Теперь в шаблоне можно:
<h1>{{article.title|fctitle}}</h1>

среда, 30 сентября 2009 г.

GAE. Bulkload. Загрузка дампа. Дата-время.

Если ваш дамп содержит поле дата-время вида 2000-05-30 23:15:34.943 то закачать можно только с конвертацией, например:
('When',lambda x: datetime.datetime.strptime(x.split('.')[0], '%Y-%m-%d %H:%M:%S')),

Причем миллисекунды - отсекаются. Т.к. питон 2.5 их не знает...

понедельник, 28 сентября 2009 г.

GAE. Bulkload. Итог.

Жаль, но моё решение (на первый взгляд) - не использовать GAE.
Почему?:
* самое неприятное - ограничение на CPU.
причем его нельзя как-то запланировать и просчитать
* ограничение на селекты
в принципе - оно может и правильное, но как быть, если я хочу показывать, что у меня есть, например, 5000 объявлений в базе? про шардинг я читал - все это - изврат
* нет join`ов - не удобно работать (фильтровать) связанные объекты.
можно плодить дополнительные объекты - но ведь это костыли!!!
* огромное неприятное - нет возможности наблюдать на сервером.
например - когда упадет... когда держишь несколько машин - можно повесить вачдог, чтоб письмо на почту слал... или оптимизация кода...
* ждать индексации - издевательство
вот залил я дамп, хочу тест сделать - селект с фильтром по полю - фиг вам! нельзя, пока не построится индекс!!!


Ваши мысли - приветствуются

GAE. Bulkload. Загрузка дампа. Русский язык.

Столкнулся с загрузкой дампа, в котором есть строки с русским языком. Загрузчик ругался...
Решение (пример, русский текст в свойстве Name. просто добавляем лямбда-функцию для конвертации)
class Organization_Shop(db.Model):
 Id=db.StringProperty()
 Name=db.StringProperty()
 Deleted=db.BooleanProperty()
 
class Organization_Shop_Loader(Loader):
 def __init__(self):
  Loader.__init__(
   self, 
   'Organization_Shop',
   [('Id',str),
   ('Name',lambda x: unicode(x, 'utf-8')),
   ('Deleted',bool)]
  )

четверг, 24 сентября 2009 г.

GAE. Bulkload. Загрузка дампа.

Изучаю Google App Engine. Тестирую. Столкнулся с необходимостью загрузить дамп таблицы. Много времени потратил, пытаясь сделать все по инструкции. Оказалось - она несколько устаревшая что-ли...

Публикую мой рабочий пример:
Конфиг app.yaml:
application: fun-test
version: 2
runtime: python
api_version: 1

handlers:
- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login: admin

- url: /.*
  script: main.py

Класс для загрузки .csv - uploader.py (обратите внимание - класс bulkloader не подключен, в коде фигурирует просто Loader):
# coding=UTF-8
import datetime
from google.appengine.ext import db

class Test(db.Model):
 Name=db.StringProperty()
 LastName=db.StringProperty()
 
class TestLoader(Loader):
 def __init__(self):
  Loader.__init__(
   self, 
   'Test',
   [('Name',str),
   ('LastName',str)]
  )   
 
loaders = [TestLoader]

Дамп d.csv:
Jonny, Lee
Carl,Donny
Nick,Cookie

Вызов процесса аплоада дампа: (обратите внимание на то, что вызывается bulkloader.py - в текущей версии appcfg.py у меня не умеет делать аплоад! Вызов для удобства разбиваю на строки...)
C:\Program Files\Google>c:\Python25\python.exe 
google_appengine/bulkloader.py
--filename=testapp/d.csv
--kind=Test
--url=http://localhost:8080/remote_api
--config_file=testapp/uploader.py
--app_id=fun-test

Вот. Только так у меня сейчас и работает. Успехов!