Закрыть

Для эффективной работы на сайте используются cookie и обработка персональных данных. Пользуясь этим сайтом, вы соглашаетесь с правилами использования сайта. Подробнее

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Вежливость — это такое качество человеческой натуры, которое помогает не замечать поломанной калитки, но обращать внимание на цветы за этой калиткой.

Дейл Карнеги

IT Блог

Статьи на технические темы

Пример manage.py. Решение ошибки "check for SOUTH_DATABASE_ADAPTER[S] settings"

Известно, что начиная с Django 1.7 нет необходимости подключать South, так как в Django 1.7 добавили встроенную систему миграций. Но иногда при установке зависимостей какие-то зависимости всё ещё тянут за собой приложение South. И когда пытаешься запустить своё приложение, то debug ругается:

There is no South database module 'south.db.postgresql_psycopg2' for your database. Please either choose a supported database, check for SOUTH_DATABASE_ADAPTER[S] settings, or remove South from INSTALLED_APPS.

Отсюда видно, что South предлагает добавить параметр SOUTH_DATABASE_ADAPTERS, например так:

SOUTH_DATABASE_ADAPTERS = {
'default': "south.db.postgresql_psycopg2"
}

Но к сожалению, это у меня данный параметр почему-то не работает. Тогда я...


Книга "Разверни сайт на Django"

Несколько лет назад я описывал, как развернуть сайт на Django, а теперь решил написать книгу "Разверни сайт на Django".

Автор книги "Разверни сайт на Django" Мальцев Артём ().


Error: SMTPRecipientsRefused 501 - sender address must match authenticated user

Разберём случай, когда мы пытаемся послать почту и получаем ошибку sender address must match authenticated user. Такая ошибка возникает, когда при отправке почты командой, например, send_mail указываешь адрес отправителя отличный от адреса, который указан при настройке подключения к SMPT серверу.

Ниже написанный код хорошо работает для меня:

# settings.py
EMAIL_HOST = 'smtp.mail.ru'
EMAIL_PORT = 2525
EMAIL_HOST_USER = "your@mail.ru"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True

SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

# views.py (или другое место)
from settings import EMAIL_HOST_USER
send_mail('Тема', 'Тело письма', EMAIL_HOST_USER, ['to@example.com'], )

Импортируя EMAIL_HOST_USER из settings.py, я однозначно уверен, что у меня адрес отправителя письма и адрес...


Error: That port is already in use. Перезапустить порт 8000

Эта ошибка означает, что порт занят. Редко, но бывает, когда в pycharm пытаешься перезапустить проект и терминал выдаёт Error: That port is already in use. Помогает в консоли сброс порта - sudo fuser -k 8000/tcp, если по-точнее, то эта команда убивает все процессы, связанные с указанным портом.


Закрыть незакрытые теги. fix unclosed html tags python

Можно сделать так:

def tokenizer_html5lib(string):
p = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("dom"))
dom_tree = p.parseFragment(string)
walker = treewalkers.getTreeWalker("dom")
stream = walker(dom_tree)

s = serializer.htmlserializer.HTMLSerializer(omit_optional_tags=False)
return ''.join(s.serialize(stream))

tokenizer_html5lib('<div> test <p> p_test <span> some_test </p> quz </span> </div')

Код хорошо закрывает все незакрытые теги, в том числе исправляет теги с забытыми скобками, а также восстанавливает порядок следования тегов и их вложенность.


Добавить свои переменные в шаблоны админки. Изменить поведение view в админке django

Ниже я написал два примера, как можно изменить стандартное поведение представления в админке Django или как добавить свои данные в представление:

# admin.py
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ('project', 'amount')
list_filter = ('is_inner', )

# 1-ый пример - ставим по умолчанию сортировку объекта по полю "is_inner__exact" в модели Order
def changelist_view(self, request, extra_context=None):
key = 'is_inner__exact'
if key not in request.GET:
q = request.GET.copy()
q[key] = '0'
request.GET = q
request.META['QUERY_STRING'] = request.GET.urlencode()
return super(OrderAdmin, self).changelist_view(request, extra_context=extra_context)

# 2-ой пример - обрабатываем данные объекта, которого редактируем в админке
def change_view(self, request, object_id...


Исправление ошибок запуска приложений на python 2.x

Ниже расположен список ошибок, которые мне встретились при запуске приложений на python 2.X (при переходе с python 3.X).

ImportError: No module named parse

from urllib.parse import urlparse
ImportError: No module named parse

Решение: заменить from urllib.parse import urlparse на import urlparse.

SyntaxError: invalid syntax

SyntaxError: invalid syntax
print('some', end='\r')

Решение: добавить импорт from __future__ import print_function.

ImportError: No module named queue

ImportError: No module named queue

Решение: заменить import queue на import Queue.

ImportError: No module named parse

from urllib.parse import unquote
ImportError: No module named parse

Решение: заменить from urllib.parse import...


Добавить параметры сайта в Django и использование их в шаблонах

Простая реализация добавления своих параметров в Django. Это полезно, например, если вы хотите на время закрыть какой-то раздел, но оставить открытым для суперпользователей.

# models.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models

class SiteParameter(models.Model):
parameter = models.CharField('Параметр', max_length=255)
value = models.CharField('Значение', max_length=255)
description = models.TextField('Описание параметра', blank=True)

def __unicode__(self):
return self.parameter

class Meta:
verbose_name = 'Параметр сайта'
verbose_name_plural = 'Параметры сайта'

# admin.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from sb_utils.models import SiteParameter

@admin.register(SiteParameter)
class SiteParameterAdmin(admin.ModelAdmin):
search_fields = ('parameter...


no reverse for django.contrib.auth.views.password_reset_confirm

Если встретилась ошибка no reverse for django.contrib.auth.views.password_reset_confirm, то можно добавить следующие урлы:

from django.contrib.auth.views import password_reset_confirm

urlpatterns = patterns('',
...
url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<uidb64>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', password_reset_confirm, name='password_reset_confirm'),
)

Или если использовать свой шаблон для рендера страницы "Сброса пароля" при использовании представления, основанного на классах, как это сделано в django shop:

from shop.views.auth import PasswordResetConfirm

urlpatterns = patterns('',
...
url(r'^password-reset-confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/?$',
PasswordResetConfirm.as_view(template_name='myshop/pages/password-reset-confirm.html'),
name='password_reset_confirm'),
)


Трюки в python

В интернете много видел интересных фишечек и трюков:

http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html
https://habrahabr.ru/post/85238/
https://habrahabr.ru/post/85459/

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

Проверка, содержится ли элемент списка list1 в списке list2

list1 = [1, 2, 3]
list2 = [2]
for elem in list1:
print(elem, ['not found', 'found'][elem in list2])



Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте