Метка: Python

UnicodeDecodeError django на windows 7

Пришлось мне тут по доле поработать на windows 7 со связкой Python/Django и сразу получил в консоль ошибки разного рода.

Одна из них

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

Решается это просто. В реестре по ветке HKEY_CLASSES_ROOT\MIME\Database\Content Type есть куча подразделов и среди них есть которые названы кириллицей, просто переименуйте их в латиницу и будет Вам счастье.

TinyMCE для Django

Прикручиваем tinymce к django. Я случайно наткнулся на такое исполнение прикручивания tinymce к django.

1. Создаем в папке проекта папку wysiwyg, а в ней файл __init__.py (код которого приведен ниже)

#!/usr/bin/python
# -*- encoding: utf-8 -*-

from django.db.models import Field
from django.forms import Textarea
from settings import MEDIA_URL

class WidgetWYSIWYG(Textarea):
    def __init__(self, *args, **kwargs):
        super(WidgetWYSIWYG, self).__init__(attrs={'class': 'wysiwygEditor vLargeTextField'}, *args, **kwargs)
    class Media:
        js = (
            MEDIA_URL+'common/tiny_mce/tiny_mce.js',
            MEDIA_URL+'common/filebrowser/js/TinyMCEAdmin.js',
            )

class WYSIWYGField(Field):
    def get_internal_type(self):
        return "TextField"

    def formfield(self, **kwargs):
        defaults = {'widget': WidgetWYSIWYG}
        defaults.update(kwargs)
        return super(WYSIWYGField, self).formfield(**defaults)

2. Теперь мы можем создать свою модель и вместо поля models.TextField использовать WYSIWYGField. Смотрим код models.py ниже.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from django.db import models
import datetime
from wysiwyg import WYSIWYGField

# Create your models here.
class News(models.Model):
    """
    Новости
    """
    publish = models.BooleanField(verbose_name=u"Опубликовать", default=True)
    created = models.DateField(verbose_name=u"Дата", default=datetime.date.today)
    title = models.CharField(verbose_name=u"Заголовок", max_length=250)
    preview = models.TextField(verbose_name=u"Краткое описание")
    text = WYSIWYGField(verbose_name=u"Текст")

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ('-created',)
        verbose_name = u"Новость"
        verbose_name_plural = u"Новости"

Python морфология строки от числа

 

class Morphology:
    def getNLastDigit(self, n, number):
        return divmod(number, 10**n)[1]

    def formParticipant(number):
        morf = Morphology()
        lastDigit = morf.getNLastDigit(1, number)
        twoLastDigit = morf.getNLastDigit(2, number)
        if ((5 < twoLastDigit < 15) | (lastDigit in [5, 6, 7, 8, 9, 0])):
            return str("товаров")
        elif (lastDigit == 1):
            return str("товар")
        elif(lastDigit in [2, 3, 4]):
            return str("товара")
    formParticipant = staticmethod(formParticipant)

Использование Mod_wsgi с Django на Ubuntu с Apache

Ставим mod_wsgi

sudo apt-get install libapache2-mod-wsgi

Конфигурации виртуального хоста:

<VirtualHost *:80>

    ServerAdmin i@developtolive.com
    ServerName developtolive.com
    DocumentRoot /home/www

    # Django settings
    WSGIScriptAlias / /home/www/django_apps/developtolive_com/wsgi_handler.py
    WSGIDaemonProcess developtolive_com user=you group=you processes=1 threads=10
    WSGIProcessGroup developtolive_com

    # Non-Django directories
    Alias /static /home/www/django_apps/developtolive_com/static
    <Location "/static">
        SetHandler None
    </Location>

    # Non-Django directories
    Alias /media /home/www/django_apps/developtolive_com/media
    <Location "/media">
        SetHandler None
    </Location>

</VirtualHost>

Поместите файл с именем wsgi_handler.py в папке проекта:

import os, sys

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
os.environ['DJANGO_SETTINGS_MODULE'] = 'developtolive_com.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

Набор полезных regexp’ов для python

Определение валидности e-mail

Набившая всем оскомину задача. Есть мнение, что правильный regexp, понимающий точку в имени пользователя, должен выглядеть так:

re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"'
    r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$'
, re.IGNORECASE)

Определение валидности http url

Здесь присутствуют проверки на протокол (http/https), допуск localhost в качестве домена, возможность указания ip адреса вместо домена, а также опциональный порт сервиса

url_re = re.compile(
    r'^https?://'
    r'(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,6}|'
    r'localhost|'
    r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
    r'(?::\d+)?'
    r'(?:/?|/\S+)$', 
re.IGNORECASE)

проблема в mod_python3 с md5

Как я писал не так давно о том что питон переместил библиотеку md5 в другой пакет, но вот только не все разработчики ПО это приняли во внимание. Очередное столкновение у меня возникло с этой проблемой. В ПО под название mod_python3 как раз таки такая ситуация. Пакет вроде как последней версии mod_python3.1 но все же бага там есть и логи наполняются ошибками.

Проблему пока что можно решить только редактированием файла importer.py

Вот как логируется ошибка:

[Fri Aug 14 10:16:51 2011] [error] /usr/local/lib/python2.6/site-packages/mod_python/importer.py:32: DeprecationWarning: the md5 module is deprecated; use hashlib instead
[Fri Aug 14 10:16:51 2011] [error]   import md5

Лечим:
32 строка: import md5 меняем на from hashlib import md5
972 строка  return self._prefix + md5.new(file).hexdigest() меняем на return self._prefix + md5(file).hexdigest()

md5 в python

Тут как то на днях перенес один проект с django на новый сервер и оказывается=) md5 в python перенес в другой пакет и тема import md5 больше не прокатит =), а мигрировал он в пакет hashlib. Теперь пользуемся радостью md5 шифрование таким способом:

In [1]: import hashlib
In [2]: str_h = 'My hesh'
In [3]: hsh = hashlib.md5()
In [4]: hsh.update(str_h)
In [5]: hsh.hexdigest()
Out[5]: 'd9736cbf27ba07b8df5d98883d364231'

ImageField и JPG(JPEG) изображение в Django

Кто то как и я столкнулся с такой проблемой, как загрузка изображений в django, но модель ImageField ругается на jpg изображения с криками, что это вовсе не изображение. Для лечения подобного поведения необходим пакет python-devel. Во всех системах он называется по разному а в некоторых он вовсе не поддерживается. В ubuntu он так и называется python-devel, а где то он зовется python-dev, во freebsd он звучит просто по наркомански=) можете сами убедиться make search. Но самое главное все это лечится.

Коры в django шаблоне

В одном из сайтов попросили внести некие изменения. Сайт работает на Django. По ходу работы открываю шаблон и наблюдаю просто веселую картину. Вот кусок того шаблона:

{% extends "base.html" %}

{% block title %}
	<title>«{{ name_site }}» | Каталог продукции</title>
{% endblock %}

{% block main_content %}
<div id="content" class="catalog">
<? @echo 'lalalal' ?>

	<div id="right_column">
		<table>
		<tr><td><a href="/media/upload/price.doc"><img src="/media/images/icon_download.gif?050509" alt="скачать"/></a></td><td><a href="/media/upload/price.doc?1" class="black"><b>Скачать прайс-лист</b></a></td></tr>
		<tr><td> </td><td><span class="grey">81 КБ, 01.04.2011</span></td></tr>
		</table>
		<div id="tara"><a href="/tara/">Тара</a></div>
		<div class="new_product">
			<div class="np_title">Новинки</div>

Если кто то еще не понял, то смотрим на 9 строку.