Архивы: django - Page 2

Накидал простенький сайт для просмотра фоток

Господа, так случилось, что я немного интересуюсь фотографией, и люблю смотреть фотки крутых фотографов, но вот меня парит смотреть неудобые сайты где неудобно тыкать на соседние фотки, хочется всё и одним списком, что понравилось, то посомтрел что нет, то быстрее пролистал ниже….

и вот в рамках изучения Django я накидал на сайте сайт, который дают такую возможность по просмотру фоток из категории “НЮ”.
он сам пару раз в день парсит фотосайт + 500пх.ком и заливает все фотки к себе удобно показывая их.

встречайте Хороший сайт с клёвыми фотографиями, пожелания и предложения принимаются
красивое НЮ

Запускаем Django на uwsgi + nginx

Число проектов на сервере росло, а оперативная память не добавлялось так получилось что старый метод на большом числе проектов поедает много оперативной памяти. и вот пришло время разобраться с uwsgi – это WSGI сервер с некоторыми фенями, сам умеет пере запускаться когда обновляется код проекта (как в devserver) умеет сам убивать потомком если они начинают “тупить”.

Теперь по порядку
[cc lang=”bash”]aptitude install python-pip build-essential python-dev libxml2-dev
easy_install install uwsgi[/cc]

Для виртуал хоста используем примерно вот такой конфг, найденный на просторах тырнета

[cc lang=”bash”]
server {
listen 80;
listen 443;

# указываем свой домен
server_name odmin4eg.org www.odmin4eg.org;

# здесь мы задаем абсолютные пути к логам.
# как я упоминал уже выше, каталог с логами у меня хранится в каталоге
# с проектом, поэтому пути следующие:
access_log /home/odmin4eg.org/logs/nginx_access.log;
error_log /home/odmin4eg.org/logs/nginx_error.log;

# ниже указывается каталог с django-проектом. как я указывал выше,
# я храню его в подкаталоге www, поэтому путь такой:
root /home/odmin4eg.org/www/;

location /
{
# ниже надо указать путь к socket’у, при помощи которого
# nginx и uwsgi будут сообщаться.
# в данном случае путь это ‘/var/tmp/odmin4eg_uwsgi.sock’
uwsgi_pass unix:///var/tmp/odmin4eg_uwsgi.sock;
include uwsgi_params;

# 8 — число буфферов
# 128k — размер буфера
# фактически, мы сможем передать от Django в nginx только 1 мб информации.
# играйтесь с этим значением при поднятии своего проекта
uwsgi_buffers 8 128k;
}

# ниже описывается директория со статическими файлами проекта (css,js,etc)
# /static/ — это STATIC_URL, который вы должны посмотреть в
# в settings.py своего django проекта.
location /static/ {
# а вот здесь указываем абсолютный путь к директории со
# статическими файлами
alias /home/odmin4eg.org/www/static/;
expires 30d;
}
# Это уже у кого как статика для админки
location /media_admin {
alias /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media;
}

}[/cc]

Дальше конфигурируем uwsgi – создаём файл
/home/odmin4eg.org/www/uwsgi.yaml
[cc lang=”bash”]
uwsgi:
# указываем socket, при помощи которого будет происходить
# взаимодействие между nginx и uwsgi
socket: /var/tmp/odmin4eg_uwsgi.sock
# здесь указываем путь к django-проекту
pythonpath: /home/odmin4eg.org/www
# устанавливаем переменную окружения, которая хранит имя settings файла
env: DJANGO_SETTINGS_MODULE=settings
# это имя модуля, который будет запускаться на выполнение
# в такой постановке, будет запускаться wsgi.py из директории
# указанной выше в ‘pythonpath’
module: wsgi
# путь к лог файлу
daemonize: /home/odmin4eg.org/logs/uwsgi.log
# прочие настройки, значения который можно посмотреть на сайте uWSGI
max-requests: 5000
buffer-size: 32768
harakiri: 30
reload-mercy: 8
master: 1
no-orphans: 1
# если выполнить команду “touch <имя ниже указанного файла>“,
# то произойдет перезапуск uwsgi демона.
touch-reload: /home/odmin4eg.org/uwsgi[/cc]

ну и создаём файлик который будем пинать для перезагрузки демона
[cc lang=”bash”]touch /home/odmin4eg.org/uwsgi[/cc]

ну и последнее осталось написать wsgi.py и положить его в каталог указанный в pythonpath (i.g., в /home/odmin4eg.org/www). wsgi.py выглядит до безумия просто:

[cc lang=”python”]
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()[/cc]

запускаем
[cc lang=”bash”]
service nginx restart
uwsgi -y /home/odmin4eg.org/conf/uwsgi.yaml[/cc]

У меня всё поехало после этого.
по мативам kalnitsky.org

WARNING: You are launching IDE using OpenJDK Java runtime.

PyCharm ругается при запуске вот так

[cc lang=”bash”]developer-HP bin # ./pycharm.sh
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.1)
OpenJDK Client VM (build 20.0-b11, mixed mode, sharing)
WARNING: You are launching IDE using OpenJDK Java runtime.

THIS IS STRICTLY UNSUPPORTED DUE TO KNOWN PERFORMANCE AND GRAPHICS PROBLEMS!

NOTE: If you have both Oracle (Sun) JDK and OpenJDK installed
please validate either PYCHARM_JDK, JDK_HOME, or JAVA_HOME environment variable points to valid Oracle (Sun) JDK installation.
See http://ow.ly/6TuKQ for more info on switching default JDK

Press Enter to continue.[/cc]

Решается проблема просто
Ставим JRE
[cc lang=”bash”]apt-get install sun-java6-jdk sun-java6-jre[/cc]
и выбираем дефолтную жаву
[cc lang=”bash”]
$ sudo update-alternatives –config java
There are 2 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
————————————————————
* 0 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 auto mode
1 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 manual mode
2 /usr/lib/jvm/java-6-sun/jre/bin/java 63 manual mode[/cc]

Выбираем 2 и жмём энтер.

profit

Кэширование в Django ( Johnny Cache )

Тема очень разнообразна и широка, но постепенно я попробую рассказать о тех, которые пробовал.

Сегодня случилось чудо и я попробовал Johnny Cache

Суть его такова, что берём тупо все SELECT и складываем их в memcached. Кэш автоматически обнуляется при UPDATE или INSERT

Устанавливаем

[cc lang=”bash”]pip install johnny-cache[/cc]
или
[cc lang=”bash”]easy_install johnny-cache[/cc]

Кому как удобнее.

Дальше всё предельно просто, просто невероятно :))

На сайте в документации приведён вот такой вариант настройки
1 Добавим две строки в MIDDLEWARE_CLASSES

[cc lang=”python”]# add johnny’s middleware
MIDDLEWARE_CLASSES = (
‘johnny.middleware.LocalStoreClearMiddleware’,
‘johnny.middleware.QueryCacheMiddleware’,
# …
)[/cc]

Также опишем бэкЭнд
[cc lang=”python”]
# some johnny settings
CACHES = {
‘default’ : dict(
BACKEND = ‘johnny.backends.memcached.MemcachedCache’,
LOCATION = [‘127.0.0.1:11211’],
JOHNNY_CACHE = True,
)
}
JOHNNY_MIDDLEWARE_KEY_PREFIX=’jc_myproj'[/cc]

JOHNNY_MIDDLEWARE_KEY_PREFIX – надеюсь и так понятно для чего, если вдруг у нас несколько проектов используют mamcached и чтоб объекты не путались, используем префикс для текущего проекта.

Вот собственно и всё, на типовых сайтах с 7-10 запросов на страницу остался одни.
На нагруженных проектах, где на страницу было 20-30 запросов стало также 1-2.

Общее снижение числа запросов в рамках одного сервера тоже значительное в среднем раньше было 100 запросов в секунду, сейчас стало 30-40

Визуальный редаткор для Django

И так господа, в процессе написания блога на Django (да да изобретаем велосипед)

возникла резонная задача = визуальный редактор

вариантов подключения много, мне понравился больше вот этот.

ставим tinyMCE
[cc lang=”bash”]easy_install django-tinymce[/cc]

установилось оно у меня вот сюда
/usr/lib/python2.5/site-packages/django_tinymce-1.5.1a2-py2.5.egg

далее в каталоге tinymce есть каталог static, копируем содержимое в свою media_dir у меня это тоже static.

теперь в нужной нам модели можно заменить поля textarea на что-то такое

[cc lang=”python”]
from django.db import models
from tinymce import models as tinymce_model

class MyModel(models.Model):
myField=tinymce_model.HTMLField()
[/cc]

теперь в settings.py

[cc lang=”python”]INSTALLED_APPS= (

‘tinymce’,

)[/cc]

чуть ниже настройки

я использовал вот такие

[cc lang=”python”]#TinyMCE widget configuration
TINYMCE_JS_URL = MEDIA_URL + “tiny_mce/tiny_mce.js”
TINYMCE_JS_ROOT = MEDIA_URL + “/tiny_mce”
TINYMCE_SPELLCHECKER=False
TINYMCE_PLUGINS = [
‘safari’,
‘table’,
‘advlink’,
‘advimage’,
‘iespell’,
‘inlinepopups’,
‘media’,
‘searchreplace’,
‘contextmenu’,
‘paste’,
‘wordcount’
]

TINYMCE_DEFAULT_CONFIG={
‘theme’ : “advanced”,
‘plugins’ : “,”.join(TINYMCE_PLUGINS), # django-cms
‘language’ : ‘ru’,
“theme_advanced_buttons1” : “bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect,|,spellchecker”,
“theme_advanced_buttons2” : “cut,copy,paste,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,image,cleanup,code,|,forecolor,backcolor,|,insertfile,insertimage”,
“theme_advanced_buttons3” : “tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr”,
‘theme_advanced_toolbar_location’ : “top”,
‘theme_advanced_toolbar_align’ : “left”,
‘theme_advanced_statusbar_location’ : “bottom”,
‘theme_advanced_resizing’ : True,
‘table_default_cellpadding’: 2,
‘table_default_cellspacing’: 2,
‘cleanup_on_startup’ : False,
‘cleanup’ : False,
‘paste_auto_cleanup_on_paste’ : False,
‘paste_block_drop’ : False,
‘paste_remove_spans’ : False,
‘paste_strip_class_attributes’ : False,
‘paste_retain_style_properties’ : “”,
‘forced_root_block’ : False,
‘force_br_newlines’ : False,
‘force_p_newlines’ : False,
‘remove_linebreaks’ : False,
‘convert_newlines_to_brs’ : False,
‘inline_styles’ : False,
‘relative_urls’ : False,
‘formats’ : {
‘alignleft’ : {‘selector’ : ‘p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img’, ‘classes’ : ‘align-left’},
‘aligncenter’ : {‘selector’ : ‘p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img’, ‘classes’ : ‘align-center’},
‘alignright’ : {‘selector’ : ‘p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img’, ‘classes’ : ‘align-right’},
‘alignfull’ : {‘selector’ : ‘p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img’, ‘classes’ : ‘align-justify’},
‘strikethrough’ : {‘inline’ : ‘del’},
‘italic’ : {‘inline’ : ’em’},
‘bold’ : {‘inline’ : ‘strong’},
‘underline’ : {‘inline’ : ‘u’}
},
‘pagebreak_separator’ : “”,
# Drop lists for link/image/media/template dialogs
‘template_external_list_url’: ‘lists/template_list.js’,
‘external_link_list_url’: ‘lists/link_list.js’,
‘external_image_list_url’: ‘lists/image_list.js’,
‘media_external_list_url’: ‘lists/media_list.js’,
#
#’file_browser_callback’:’tinyDjangoBrowser’
}
[/cc]

также в urls.py добавим

[cc lang=”python”](r’^tinymce/’,include(’tinymce.urls’)),[/cc]

теперь по хорошему всё, в админке нужное поле будет отображено как ТиниМЦЕ редактор.

если не будет я удалил таблицу в котором эти поля и сделал сункДБ.
потом появилось.

Ещё будет пост о том как к нему прикрутить возможность заливки файлов и картинок.