Поиск

Найдена 21 статья по слову "python"

Интересные ссылки для ознакомления

NodeJS

http://jsman.ru/express/ — подробно про MVC-фреймворк Express.

Обработка изображений

http://clippingmagic.com — Убрать фон с изображения.

Регулярные выражения

http://www.rubular.com/ — Простое и быстрое тестирование регулярных выражений. Ничего лишнего.

http://gskinner.com/RegExr/ — Когда требуется по регулярному выражению заменить исходный текст. Плюс есть множество готовых примеров регулярок.

Форматирование и валидация кода

http://jsbeautifier.org/ — Красиво форматирует с переносами исходный код. Просто и удобно.

http://jsonlint.com/ — Валидатор JSON. При валидации еще и форматирует его.

Верстка HTML/CSS

http://htmlbook.ru/ — Крайне полезный сайт для начинающих верстальщиков или если вы что-то забыли. Удобный каталог тэгов и правил с подробным описанием и примерами.

Дизайн

https://kuler.adobe.com/ — Сочетание цветов от Adobe.

Регистрация доменов/Хостинг

https://2domains.ru — Дешевая регистрация доменов. Страница логина

Схемы и аналитика

https://www.draw.io/ — Удобная рисовалка схем онлайн (онлайн аналог Visio). Есть возможность связать ее с Google Drive.

Системы контроля версий

http://git-scm.com/book/ru — книга про git.

http://www.yearofmoo.com/2011/04/minify-css-and-js-with-git-hooks.html — хуки в git’е для минификации css и js.

Backbone

https://github.com/AlexFadeev/backbone-fundamentals — Перевод книги Addy Osmani о Backbone.

Профайлинг в Google Chrome

http://habrahabr.ru/post/149053/ — По-русски.

https://developers.google.com/chrome-developer-tools/docs/heap-profiling — От Google’а.

Управление командой

http://lean-lead.blogspot.ru — «записки тимлида». Хороший блог, можно почерпнуть много интересного.

QA

http://testitquickly.com/2009/09/09/vvodeste-loginu-la-adnaklassni6i/ — тестирование регистрации/логина.

Python

http://www.ibm.com/developerworks/library/l-cpmod/index.html — создание документации через pydoc.

AngularJS

http://angular.ru — документация по angularjs на русском языке.

ссылки

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

<p>1. Устанавливаем <a href="http://python.org/download/” target=”_blank” rel=”noopener”>Python</a> (желательно, версию 2.7).<br />2. Правой кнопкой по “Мой компьютер” => Свойства =><br />=> Вкладка “Дополнительно” => Кнопка “Переменные среды” =><br />=> В “Системные переменные” выбираем строку, где слева написано “Path” =><br />=> Кнопка “Изменить” => в самый конец вставляем строку<br />”;C:\Python27\;C:\Python27\Scripts” без кавычек.<br />3. Везде жмем ОК.<br />4. <a href="https://www.djangoproject.com/download/” target=”_blank” rel=”noopener”>Качаем</a> и распаковываем архив с Django.<br />5. Открываем cmd и переходим в папку с Django.<br />6. Набираем “setup.py install”.<br />7. Ждем установки.<br />8. Проверяем, набрав в консоли “python”, затем “import django” и<br />”print django.get_version()”. Если ошибок нет - значит, мы все сделали правильно.<br />9. Устанавливаем <a href=”http://www.denwer.ru/" target=”_blank” rel=”noopener”>Denwer</a>.<br />10. Файл “<a href="http://code.google.com/p/modwsgi/wiki/DownloadTheSoftware?tm=2#Windows_Binary_Downloads” target=”_blank” rel=”noopener”>mod_wsgi.so</a>” копируем в папку “Z:\usr\local\apache\modules”.<br />11. В файле “Z:\usr\local\apache\conf\httpd.conf” после строк “LoadModule”<br />вставляем строку “LoadModule wsgi_module modules/mod_wsgi.so”.<br />12. На этом установка закончена, для настройки самого проекта <a href="https://docs.djangoproject.com/en/1.4/intro/tutorial01/” target=”_blank” rel=”noopener”>обратитесь к документации</a></p>

django

Как установить pip

$ sudo apt-get install python-pip python-dev build-essential
$ sudo pip install --upgrade pip
$ sudo pip install --upgrade virtualenv
linux python

Безопасный eval в python

Об этом уже достаточно много сказано, но может и мой вариант кому-то приглянется. Обычно запрещают список опасных функций для eval’а. Можно пойти чуть по другому пути и наоборот, разрешить, что-то. Я набросал пример, цель которого была - вычисление математических выражений. Чтобы было не так скучно, сделал это в django через аякс :)

Итак, views.py

import re, json
from django.shortcuts import render_to_response
from django.http import HttpResponse

#...

def calc(request):
    return render_to_response('calc.html', {})

def calc_json_expression(request):
    p = re.compile(r'[-+*\/\(\)0-9(sin)(cos)(tan)]*', re.IGNORECASE)
    calcmath = request.POST["calc-math"]
    res = ''.join(p.findall(calcmath))

    from math import sin, cos, tan

    json_data = {}
    try:
        json_data['exp'] = res
        json_data['res'] = eval(res)
    except:
        json_data['exp'] = ''
        json_data['res'] = '0'
    return HttpResponse(json.dumps(json_data), mimetype="application/json")

urls.py

urlpatterns = patterns('kernel.views',
    # ...
    url(r'^calc/$', 'calc'),
    url(r'^calc-json-expression/$', 'calc_json_expression'),
)

и файл шаблона calc.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
    <h1>Calc</h1>
    <form method="post" id="calc-form">
        <p><label for="calc-math">Print math expression</label><input type="text" name="calc-math" id="calc-math" value="" placeholder="Expression"></p>
        <p>Expression: <span id="calc-math-expression"></span></p>
        <p>Result: <span id="calc-math-answer">0</span></p>
    </form>

    <script type="text/javascript">
        $('#calc-math').keyup(function() {
            $.post('calc-json-expression/', $("#calc-form").serialize(),function(data){
                $('#calc-math-answer').text(data["res"]);
                $('#calc-math-expression').text(data["exp"]);
            }, "json");
        });
    </script>
</body>
</html>

Самое интересное во всем этом коде - выбор допустимых символов и слов регулярным выражением. Сюда можно добавить и другие выражения, но принцип должен быть понятен.

p = re.compile(r'[-+*\/\(\)0-9(sin)(cos)(tan)]*', re.IGNORECASE)

Собственно, это и есть мой способ, подобных при поиске “безопасный eval” не увидел. Проблема, с которой столкнулся - это ограничение на время исполнения скрипта. Такой штуки нет ни в джанго, ни в питоне. Поэтому 10 в миллиардной степени, например, этот скрипт не обработает, а сайт просто упадет. Есть решения, интернет ими кишит, но они, в основном, только для *nix, либо практически нерабочие. Если кто-то найдет кроссплатформенный рабочий код - отпишитесь, пожалуйста :)

django javascript python

Свои сообщения об ошибках при валидации формы в Django

Думаю, вы хотите, чтобы ваши сообщения об ошибках в заполняемых формах были на том же языке, что и сам сайт. Один из простых способов - это добавить следующий код в соответствующий forms.py. Затем формы надо будет наследовать не от forms.Form, а от MyForm (обратите внимание, ExampleForm, в примере ниже, наследуется от него).

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        for k, field in self.fields.items():
            if 'required' in field.error_messages:
                field.error_messages['required'] = u'Это поле обязательно!'

class ExampleForm(MyForm):
    title = forms.CharField(max_length=100, required=True, label=u'Название')

Полный список error_messages для различных типов полей можно увидеть, если просмотреть этот раздел: https://docs.djangoproject.com/en/1.3/ref/forms/fields/#built-in-field-classes

Вот что есть на данный момент:

required - показывается, если данное поле обязательно;
max_length - если превышено максимальное количество символов в символьном поле / в случае с файлами - длина имени файла;
min_length - если символов меньше, чем должно быть, в символьном поле;
invalid_choice - если выбран невозможный choice;
invalid - при неправильном email’е и прочем неправильном вводе данных;
max_value - если превышено числовое значение;
min_value - если значение меньше минимального числового ограничения;
max_digits - если превышено количество цифр в числе;
max_decimal_places - если превышено количество цифр после запятой;
max_whole_digits - если превышено количество цифр до запятой;
missing - если файл не найден;
empty - если файл пустой;
invalid_image - если изображение повреждено;
invalid_list  - если неправильный список choice’ов;
invalid_link - для URLField - вызывается, если данного url не существует.

Основано на примере с http://stackoverflow.com/questions/1481771/django-override-default-form-error-messages

django

CSRF token missing or incorrect (django)

После переноса сайта с хостинга jino на webfaction, при попытке отправки любой формы возникала ошибка “CSRF token missing or incorrect”. Т.е. даже залогиниться на сайт было невозможно (авторизация через админку работала нормально и на сайте после я этого был авторизован).

CSRF - это уязвимость, когда пользователи, переходя по обычной ссылке, запускают хакерский скрипт, который может от их имени передать какую-либо форму на абсолютно другой сайт (например, оставить от их имени комментарий на одном из форумов или еще что-нибудь). Сам хакер не сможет получить результат перехода по ссылке. Собственно, это и отличает CSRF от XSS (http://www.securitylab.ru/analytics/292473.php).

Все описания этой ошибки ссылаются на документацию - https://docs.djangoproject.com/en/dev/ref/contrib/csrf/, либо советом добавлять во всех формах {% csrf_token %} в темплейтах (у меня он везде добавлен) и проверить, есть ли в settings.py в MIDDLEWARE_CLASSES пункт 'django.middleware.csrf.CsrfViewMiddleware'. Это все было. И не помогало.

Выход нашел, когда сравнил MIDDLEWARE_CLASSES от вебфакшна и джино.

webfaction:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

jino:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

Поменяв на джиновские миддлвары - все запустилось и заработало нормально. Т.е., получилось, что ‘django.middleware.csrf.CsrfViewMiddleware’, в моем случае, не должна была быть в списке. Хотя, возможно, что после ее удаления, джанго просто не показывает ошибку, а уязвимость осталась. По крайней мере, на данный момент, проблему это решило. При следующей встрече, постараюсь решить эту проблему правильней, на данный момент знаний по этой теме не хватает.

django

Подключение TinyMCE в админку django

Для того, чтобы в админке подключить WYSIWYG-редактор TinyMCE необходимо проделать следующие операции.

  1. Скачиваем сам редактор TinyMCE: http://www.tinymce.com/download/download.php и заливаем на сервер (со стороннего url работать не будет).

  2. Устанавливаем django-tinymce (обязательно должен быть версии 1.5.1a2 или выше, в стабильной на момент написания статьи версии 1.5 он имеет баг, из-за которого не хочет работать без напильника):

pip install django-tinymce
  1. В settings.py вашего проекта записываем записываем следующие переменные:
TINYMCE_JS_URL = 'tiny_mce/tiny_mce.js'
TINYMCE_JS_ROOT = 'tiny_mce'
TINYMCE_DEFAULT_CONFIG = {'theme': "advanced", 'theme_advanced_toolbar_location' : "top", 'height': '400'}

TINYMCE_JS_URL - путь к tiny_mce.js - например, http://mysite.com/tinymce/tiny_mce.js (крайне желательно писать без домена, он здесь дан только для того, чтобы было понятно, относительно чего происходит запрос)

TINYMCE_JS_ROOT - путь к корневой папке, где лежит tiny_mce.js - например, http://mysite.com/tinymce/ (крайне желательно писать без домена)

TINYMCE_DEFAULT_CONFIG - конфигурация по умолчанию, подробности см. в официальной документации TinyMCE.

Также, в INSTALLED_APPS надо дописать 'tinymce':

INSTALLED_APPS = (
    ...
    'tinymce',
    ...
)
  1. В модель, в которой хотим включить редактор TinyMCE импортируем tinymce:
from tinymce import models as tinymce_models

Для самого класса модели пишем следующее

class MyModel(models.Model):
    myField = tinymce_model.HTMLField()

Т.е. мы заменяем models.TextField() на tinymce_model.HTMLField() в необходимых местах.

  1. В urls.py проекта добавляем (r'^tinymce/',include('tinymce.urls')):
urlpatterns = patterns('myproject.views',
    ...
    (r'^tinymce/', include('tinymce.urls')),
    (r'^admin/', include(admin.site.urls)),
)

Источники:
1. http://seobacks.ru/tinymce-django.html
2. http://django-tinymce.googlecode.com/svn/tags/release-1.5/docs/.build/html/index.html

django

Уникальные названия файлов при загрузке в Django

Django при сохранении файла через админку или форму сохраняет название файла. Например, при загрузке картинки "mypic.jpg" она сохранится с этим названием.
Также, если загружаемый файл на русском языке, то его имя будет сохранено - “моя_картинка.jpg”. Вы можете изменить этот механизм.

ПРИМЕЧАНИЕ. Последующие загружаемые файлы с таким названием будут иметь префикс "_", т.е. "_mypic.jpg", "__mypic.jpg" и т.п.

Пример реализации
Этот код должен быть помещен в файл models.py нужного вам приложения.

import os, uuid

def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join(instance.directory_string_var, filename)

class MyModelFiles(models.Model):
    myimage = models.FileField(upload_to = get_file_path)
    directory_string_var = 'my-path-to-files-for-this-model'

class MyModelImages(models.Model):
    myimage = models.ImageField(upload_to = get_file_path)
    directory_string_var = 'my-path-to-images-for-this-model'

Таким образом, при следующей загрузке файла его имя будет выглядеть, например, так «384408e1-5465-46fd-bf47-61f913fa78e5.jpg».
Протестировано на версии Django 1.3.

django

Как получить список заголовков столбцов в модели django

Получаем список всех имен столбцов модели

model_field_names = model._meta.get_all_field_names()

Получаем название модели

model_name = model._meta.getattr()
django

Парсер веб-страниц на Python

Для успешного парсинга страниц достаточно двух инструментов - urllib и BeautifulSoup. Первый обычно доступен сразу после установки python, второй легко можно найти в интернете - http://www.crummy.com/software/BeautifulSoup/bs3/download/

Пример

>>> from BeautifulSoup import BeautifulSoup
>>> import urllib
>>> f = urllib.urlopen('http://my.site') # Открываем сайт, который будем парсить
>>> soup = BeautifulSoup(f.read()) # Считываем его и одновременно закидываем в BeautifulSoup
>>> my = soup.findAll(name='div', attrs={'class': 'news'}) # Ищем все div`ы с классом 'news'
>>> for m in my:
... print m # Выводим их

Результат, например, может быть следующий (если найден только один div):

[u'Содержание статьи 1.']

По шагам

<span>1</span>. Качаем BeautifulSoup.tar.gz, который лежит в корне.

<span>2</span>. Распаковываем gz, затем tar.

<span>3</span>. Копируем в папку (желательно без русских символов и пробелов).

<span>4</span>. Устанавливаем:

 Нажимаем Ctrl+R
 cmd
 cd C:\BeautifulSoup-3.2.1
 python setup.py install

<span>5</span>. Должно успешно установиться. Теперь можем испытать скрипт. Заходим в python:

>>> from BeautifulSoup import BeautifulSoup
>>> import urllib
>>> f = urllib.urlopen('http://my.site') # Открываем сайт, который будем парсить
>>> soup = BeautifulSoup(f.read()) # Считываем его и одновременно закидываем в BeautifulSoup
>>> my = soup.findAll(name='div', attrs={'class': 'news'}) # Ищем все div`ы с классом 'news'
>>> for m in my:
...    print m.findAll(text=True) # Выводим их

<span>6</span>. В результате должны были получить содержимое всех div c классом news.

django