Tag: Python

Базовые функции pymongo (MongoDB для python)

import pymongo

from pymongo import Connection
connection = Connection()

# Удаляем базу данных, если она существует
connection.drop_database("my_database")

# Выбираем базу данных
db = connection.test_database
# или так
db = connection["my_database"]

# Удалить коллекцию
db.drop_collection('users')

# Добавление документов в колекцию 'users'
db.users.save( { 'name':'user 1', 'level':1 } )
db.users.save( { 'name':'user 2', 'level':2 } )
db.users.insert( { 'name':'user 3', 'level':3 } )

# Узнаем полное имя коллекции
print db.users.full_name

# Получаем все документы в коллекции
for user in db.users.find():
    print user

# Выбрать конкретные атрибуты
users = db.users.find({},{ 'login':1, 'name':1 })

# Получить один документ по условию
user = db.users.find_one({'name':'user 1'})

# Получить/установить значение
print user['level']
user['level'] = 7

# Сохранить документ
db.users.save(user)

# Удалить документ
db.users.remove(user)

# Установить значение в документе
db.users.update({ 'name':'user 2' }, { "$set": { 'level':5 } })

# Кол-во документов
print 'Count',db.users.count()
print 'Count lvl=2',db.users.find({'level':2}).count()

# Сортировка
for user in db.users.find().sort('level'):
    print user
# в обратном порядке: .sort('level',pymongo.DESCENDING)
# Сортировка по нескольким атрибутам
    db.users.find({}).sort( [('status',1),('level',-1)] )

# Ограничение выборки, пропустить один документ и выбрать не более двух
for user in db.users.find().skip(1).limit(2):
    print user

# Условия
for user in db.users.find().where('this.name == "user 2" || this.level>3'):
    print user

# Выбрать неповторяющиеся записи
for user in db.users.distinct('level'):
    print user

# Поиск регулярным выражением
import re
regex = re.compile('^us', re.I | re.U) 
result = db.collection.find({ 'name':regex })

ipython notebook — ImportError: IPython.html requires pyzmq >= 13

Получил ошибку при запуске ipython notebook

macbook-air:~ MacBookAir132013$ ipython --version
3.2.1
macbook-air:~ MacBookAir132013$ ipython notebook
Traceback (most recent call last):
  File "/usr/local/bin/ipython", line 11, in <module>
    sys.exit(start_ipython())
  File "/Library/Python/2.7/site-packages/IPython/__init__.py", line 120, in start_ipython
    return launch_new_instance(argv=argv, **kwargs)
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 573, in launch_instance
    app.initialize(argv)
  File "<string>", line 2, in initialize
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 75, in catch_config_error
    return method(app, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/IPython/terminal/ipapp.py", line 321, in initialize
    super(TerminalIPythonApp, self).initialize(argv)
  File "<string>", line 2, in initialize
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 75, in catch_config_error
    return method(app, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/IPython/core/application.py", line 369, in initialize
    self.parse_command_line(argv)
  File "/Library/Python/2.7/site-packages/IPython/terminal/ipapp.py", line 316, in parse_command_line
    return super(TerminalIPythonApp, self).parse_command_line(argv)
  File "<string>", line 2, in parse_command_line
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 75, in catch_config_error
    return method(app, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 471, in parse_command_line
    return self.initialize_subcommand(subc, subargv)
  File "<string>", line 2, in initialize_subcommand
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 75, in catch_config_error
    return method(app, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/IPython/config/application.py", line 402, in initialize_subcommand
    subapp = import_item(subapp)
  File "/Library/Python/2.7/site-packages/IPython/utils/importstring.py", line 42, in import_item
    module = __import__(package, fromlist=[obj])
  File "/Library/Python/2.7/site-packages/IPython/html/notebookapp.py", line 30, in <module>
    check_for_zmq('13', 'IPython.html')
  File "/Library/Python/2.7/site-packages/IPython/utils/zmqrelated.py", line 12, in check_for_zmq
    raise ImportError("%s requires pyzmq >= %s"%(required_by, minimum_version))
ImportError: IPython.html requires pyzmq >= 13

лечим

sudo pip install --upgrade pyzmq

и радуемся

ImportError: The _imagingft C module is not installed на mac os

Я уже писал однажды Django No module named _imagingft о подобной проблема, но на старом маке и на свежем он уже не работает.

  1. Для начала удаляем все старое pip uninstall Pillow
  2. Ставим jpeg library

    1.  скачиваем http://www.ijg.org/files/jpegsrc.v8c.tar.gz
    2. распаковываем tar zxvf jpegsrc.v8c.tar.gz
    3. конфигурация ./configure
    4. собираем make
    5. теперь ставим собранный пакет sudo make install
    6. копируем пакет к библиотекам cp -r ~/Downloads/jpeg-8с/ /usr/local/jpeg
  3. Теперь ставим сам freetype library
    1. скачиваем http://www.freetype.org/download.html
    2. распаковываем tar zxvf freetype-2.6.tar.gz
    3. конфигурация ./configure
    4. собираем make
    5. теперь ставим собранный пакет sudo make install
    6. копируем пакет к библиотекам cp -r ~/Downloads/freetype-2.6/ /usr/local/freetype
  4. Теперь обратно ставим python пакет для работы с графикой pip install Pillow

И ура все работает.

 

 

Редирект в urls.py (Django, RedirectView)

Порой нужно не создавая вьюшки прямо на входе перенаправить с запрошенного адреса на другой. Пример:

from django.conf.urls import patterns, url
from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^go-to-url/$', RedirectView.as_view(url='http://developtolive.com'), name='go-to-url'),
)

Выводит записи журнала действий пользователей в административной части в Django

Задача: вывести записи журнала действий пользователей в административной части в Django
Решение: Сама модель логирования в Django вот такая LogEntry и находится в django.contrib.admin.models. Все что нудно сделать это обычным способом вывести модель в админке.
В файле admin.py

# -*- coding: utf-8 -*-
from django.contrib import admin
from django.contrib.admin.models import LogEntry

class LogEntryAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'action_time', 'user', 'content_type', 'object_id', 'object_repr', 'action_flag', 'change_message')
    list_filter = ('content_type',)
    search_fields = ['user__username',]
    date_hierarchy = 'action_time'
admin.site.register(LogEntry, LogEntryAdmin)

Удаление файла при удалении записи в модели в Django

Сигнал который удаляет физически файл с диска при удалении объекта в модели.

from django.db.models.signals import post_delete
from django.dispatch import receiver

@receiver(post_delete, sender=Photo)
def photo_post_delete_handler(sender, **kwargs):
    photo = kwargs['instance']
    storage, path = photo.original_image.storage, photo.original_image.path
    storage.delete(path)

MySQLdb на Mac OS получил ошибку Library not loaded: libmysqlclient.18.dylib

После установки пакета MySQLdb и обращения к ней

In [1]: import MySQLdb

получаю ошибку

ImportError: dlopen(/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.7-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.7-intel.egg/_mysql.so
  Reason: image not found

Лечиться это просто, через консоль создайте сылку

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

The _imaging C module is not installed windows

На одной из машин под windows в PIL на django проекте поймал ошибку

The _imaging C module is not installed

На одном из ресурсов мне посоветовали воспользоваться репозитарием на сайте Калифорнийского университета. После установки пакета PIL из их репозитария Unofficial Windows Binaries for Python Extension Packages и все заработало.

Наложение водяного знака в Django

Как я решил вопрос наложения водяного знака на изображение за 2 минуты.
Написал некую функцию которая и реализует наложение водяного знака с помощью модуля PIL:

import Image, ImageEnhance

def add_watermark(image, watermark, opacity=1, wm_interval=0):
    assert opacity >= 0 and opacity <= 1
    if opacity < 1:
        if watermark.mode != 'RGBA':
            self.watermark = watermark.convert('RGBA')
        else:
            watermark = watermark.copy()
        alpha = watermark.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
        watermark.putalpha(alpha)

    layer = Image.new('RGBA', image.size, (0,0,0,0))
    for y in range(0, image.size[1], watermark.size[1]+wm_interval):
        for x in range(0, image.size[0], watermark.size[0]+wm_interval):
            layer.paste(watermark, (x, y))
    return Image.composite(layer,  image,  layer)

В моделе есть поле image, вот на него мы и накладываем водяной знак при любом сохранении объекта (это плохо — так не делайте, хотя бы по тому, что при каждом сохранении на изображение наложится повторно водяной знак, я это написал для наглядности). Вот этот сигнал и палит сохранение модели:

def prev_image(sender, instance, created, **kwargs):
    # Открываем водяной знак
    path_watermark = settings.STATIC_ROOT + '/watermark/logo.png'
    watermark_open = Image.open(path_watermark, 'r')

    # Открываем текущее изобразение изображение
    img_path = '/home/isite/data/django-apps/energy' + instance.image.url
    img_open = Image.open(img_path, 'r')

    # Накладываем водяной знак
    add_watermark(img_open, watermark_open, 0.3, 50).save(img_path)

signals.post_save.connect(prev_image, sender=Product)

Django Email Attachment

Отправляем письма в Django с прикрепленным файлом

------forms.py----------
from django import forms

class EmailForm(forms.Form):
    email = forms.EmailField()
    subject = forms.CharField(max_length=100)
    attach = forms.Field(widget = forms.FileInput)
    message = forms.CharField(widget = forms.Textarea)
-------views.py--------------

def send_email(request):
    if request.method != 'POST':
        form = EmailForm()
        return render_to_response('admin/Email.html', {'email_form': form})
	
    form = EmailForm(request.POST, request.FILES)	
    if form.is_valid():
        subject = form.cleaned_data['subject']
        message = form.cleaned_data['message']
        email = form.cleaned_data['email']
        attach = request.FILES['attach']
        try:
            mail = EmailMessage(subject, message, settings.EMAIL_HOST_USER, [email])
            mail.attach(attach.name, attach.read(), attach.content_type)
            mail.send()
            return render_to_response('admin/Email.html', {'message': 'Sent email to %s'%email})
       except:
           return render_to_response('admin/Error.html', {'message': 'Either the attachment is too  big or corrupt'})
       return render_to_response('admin/Email.html', {'message': 'Unable to send email. Please try again later'})
---------template------

{% extends "admin/base_site.html" %}

{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css{% endblock %}
{% block bodyclass %}dashboard{% endblock %}
{% block coltype %}colMS{% endblock %}

{% if not is_popup %}{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> › Send Email</div>{% endblock %}{% endif %}

{% block content %}
{{message}}
{% if email_form %}
<form method="POST" action ="." enctype="multipart/form-data">
<br></br>
{{email_form.as_p}}

<label> </label><label> </label><label> </label>
<input type ="submit"  name = "send" value = "Send"/>
</form>
{% endif %}
{% endblock content %}