В общем-то, уже все знают, я для галочки просто напишу. А то спросят: "А почему ты не написал?" — а я и не буду знать, что ответить :-)

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

Это означает, что Джанго умеет работать с любыми кодировками СУБД и любыми кодировками веб-страниц, при этом в самой программе программисту думать про это вообще не надо — все универсально. Текущий код нуждается в некоторых переработках, которые, как всегда просто и дотошно, описаны в документации по портированию. Также еще есть документ, объясняющий отношения Джанго с юникодом в целом. Призываю всех, кто "в trunk'е", прошерстить свои приложения, не откладывая. Это изменение гораздо менее трудоемкое, чем приснопамятный magic removal.

Большую часть работы сделал великолепный Малколм Трединник (у которого 36 часов в сутках). Также большущее спасибо всем, кто тестировал, сообщал о багах и писал патчи. Один баг мы, помнится, отладили прямо вживую вместе с Малколмом в IM'е и нашедшим баг Fromme в форуме. Open source рулит!

Между тем, это изменение — одна из больших вех на пути к версии 1.0. Следующей такой вехой, если я не ошибаюсь, должна стать переработка админского интерфейса, которая построена на новой инфраструктуре форм (newforms) и задумана как гораздо более гибкая, чем та, что есть сейчас.

Комментарии: 24

  1. Boo

    Думаю, сначала выйдет релиз 0.97, а потом уже newforms-admin вольется в trunk

  2. Иван Сагалаев

    Хм... А я не помню, чтобы 0.97 вообще планировалась...

  3. Uznick

    Люто жду нормальной возможности делать кастомизированные поля в админке.

  4. Alexander Solovyov

    Хм… А я не помню, чтобы 0.97 вообще планировалась…

    100%, таких планов не было.

  5. Slonopotamus

    Вооооот. Теперь можно и подумать над тем чтобы поюзать эту вашу Джангу :)

  6. Igorek

    Всё это конечно здорово (сегодня пол дня переводил свой прект на unicode, как ни странно, но заработал с пятого раза :)), но я всё таки больше жду NewformsAdmin
    А так Django - рулит по любому :)

  7. Kirill Mavreshko

    Кто-нибудь в курсе, когда планируется выпуск newforms-admin в trunk? Дико требуются многие возможности этой админки для нового проекта, и прямо сейчас.

  8. crash

    В принципе, с переходом юникода в транк можно юзать нью-админ ветку, раньше ведь выбирать приходилось (либо жесткий merge делать :)), а теперь новая игрушка есть :)

  9. Alexander Solovyov

    В принципе, с переходом юникода в транк можно юзать нью-админ ветку

    Ну... Вообще-то newforms-admin ещё не синхронизирован с транком по поводу юникода. Хотя Малкольм и обещал это сделать в ближайшие несколько дней, но пока ещё ждём.

  10. Boo

    Хм… А я не помню, чтобы 0.97 вообще планировалась…
    А что планировалось?

  11. Boo

    Хм… А я не помню, чтобы 0.97 вообще планировалась…

    In the next Django release (0.97), we will move the current django.newforms to django.forms. This will be a backwards-incompatible change, and anybody who is still using the old version of django.forms at that time will need to change their import statements, as described in the previous bullet.

    We will remove django.oldforms in the release after the next Django release — either 0.98 or 1.0, whichever comes first.

  12. Kirill Mavreshko

    Сегодня Малколм влил юникодные изменения в бранч newforms-admin.

    newforms-admin: Merged from trunk up to [5625]. This includes the Unicode merge, however, not all of admin/ (and none of admindocs/) has been ported and checked yet.

    newforms-admin: Changed to using ugettext() for translations.

    Отличный повод всем перейти к тестированию.

  13. Igorek

    Всё ушёл тестировать.
    Наконец-то как порядочный человек могу удалить __str__, а то задолбало по два класса писать.

  14. Александр

    :( Зачем картинки перекодировать
    settings.py:
    DEFAULT_CHARSET = 'windows-1251'

    views.py:
        def capcha(request):
            response =  HttpResponse(mimetype="image/jpeg")
            ...
            return response
    

    Получаем ошибку!
    ...
    File "/usr/local/lib/python2.4/site-packages/django/utils/encoding.py", line 63, in smart_str
    return s.decode('utf-8', errors).encode(encoding, errors)
    ...
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: unexpected code byte

    А как было все замечательно...

  15. Александр

    Прошу прощения, можно исправить, если убрать строчку:

    response['Content-Length'] = str(len(response.content))
    

    А это уже поправимо...

  16. Артём Скорецкий

    После перехода на Unicode стало на порядки тормозить сложение строк. Вероятно, к юникоду не применён патч, в своё время ускоривший сложение простых строк.

    Исравилось прочтением "Efficient String Concatenation in Python" - http://www.skymind.com/~ocrow/python_string/

    Увы, cStringIO использовать не получилось - юникод им не поддерживается.

    Вывод: юникод это хорошо, но детские болезни пока есть. Ждём Python 3000 :)

    Для любопытных - код:

    s = ''
    for i in xrange(1,100000):
        s += 'text'            # Done in ~0.07s
    
    u = u''
    for i in xrange(1,100000):
        u += u'text'           # Done in ~127.8s
    
  17. xonixx

    Вот так быстро:

    res = []
    for i in xrange(1,100000):
        res.append(u'text')
    
    u = u''.join(res)
    
  18. Артём Скорецкий

    Да, так будет быстро. Правда, думаю вариант с StringIO оптимальнее (высокая скорость при минимуме использования памяти):

    text = StringIO.StringIO()
    for i in xrange(1,100000):
        text.write(u'text')
    text = text.getvalue()
    
  19. Mikhail Kashkin

    И смешно и грустно, zope3 уж лет 5 как юникодный, с момента рождения

  20. xonix

    Правда, думаю вариант с StringIO оптимальнее
    Вряд ли:
    def f1():
    res = []
    for i in xrange(1,100000):
    res.append(u'text')

        u = u''.join(res)
    
    import StringIO
    def f2():
        text = StringIO.StringIO()
        for i in xrange(1,100000):
            text.write(u'text')
        text = text.getvalue()
    
    import timeit
    timeit.f1 = f1
    timeit.f2 = f2
    
    print timeit.Timer("f1()").timeit(10) # => 0.470406154972
    print timeit.Timer("f2()").timeit(10) # => 3.03548104578
    

    Разве что действительно, по памяти будет лучше, т.к. он будет чаще проводить конкатенации.

  21. Макс Лапшин

    Иван, если вкратце, то что там сделано: просто везде на входе в Джанго переводится в юникод?

  22. Julik

    Достойное дело. Да прибудет ваш ordinal всегда in range.

  23. Oleg

    Inline полей пока еще нет в newforms?

  24. Иван Сагалаев

    Они уже приблизительно работают в newforms-admin бранче. Но в транке пока нет.

Добавить комментарий