Метка: django

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

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

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

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

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

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

    Теперь по порядку

    aptitude install python-pip build-essential python-dev libxml2-dev
    easy_install install uwsgiCode language: Bash (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;
            }
    
    }Code language: Bash (bash)

    Дальше конфигурируем uwsgi — создаём файл
    /home/odmin4eg.org/www/uwsgi.yaml

    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/uwsgiCode language: Bash (bash)

    ну и создаём файлик который будем пинать для перезагрузки демона

    touch /home/odmin4eg.org/uwsgiCode language: Bash (bash)

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

    import django.core.handlers.wsgi
    application = django.core.handlers.wsgi.WSGIHandler()Code language: Python (python)

    запускаем

    service nginx restart
    uwsgi -y /home/odmin4eg.org/conf/uwsgi.yamlCode language: Bash (bash)

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

  • WARNING: You are launching IDE using OpenJDK Java runtime.

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

    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.Code language: Bash (bash)

    Решается проблема просто
    Ставим JRE

    apt-get install sun-java6-jdk sun-java6-jreCode language: Bash (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 modeCode language: Bash (bash)

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

    profit

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

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

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

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

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

    pip install johnny-cacheCode language: Bash (bash)

    или

    easy_install johnny-cacheCode language: Bash (bash)

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

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

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

    # add johnny's middleware
    MIDDLEWARE_CLASSES = (
        'johnny.middleware.LocalStoreClearMiddleware',
        'johnny.middleware.QueryCacheMiddleware',
        # ...
    )Code language: Python (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'Code language: Python (python)

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

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

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

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

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

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

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

    ставим tinyMCE

    easy_install django-tinymceCode language: Bash (bash)

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

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

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

    from django.db import models
    from tinymce import models as tinymce_model
    
    class MyModel(models.Model):
    myField=tinymce_model.HTMLField()Code language: Python (python)

    теперь в settings.py

    INSTALLED_APPS= (
    …
    ‘tinymce’,
    …
    )Code language: Python (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'
    }Code language: Python (python)

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

    (r’^tinymce/’,include(’tinymce.urls’)),Code language: Python (python)

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

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

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