Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
11 декабря 2018 г. 11:56
Игорь Максимов

Доброго времени суток. Интересует такой вопрос как разнести приложение django и приложение celery на разные сервера. Тоесть имею: 2 сервера в одной локальной сети web-server и storage. web-server у меня выполняет роль собственно веб-сервера с приложением, а storage выполняет роль хранилища для видео-контента. Сейчас у меня на web-server крутится приложение, celery+redis+ffmpeg(связка для конвертирования видео-контента). storage же сейчас выполнят только роль хранилища. Хочу распределить нагрузку на 2 сервера чтобы операция конвертирования велась не на web-server а на storage. Каким образом это все можно организовать?

9 декабря 2018 г. 18:55
Игорь Максимов

Доброго времени суток. Нашел приложение для конвертации видео + celery что очень радует. Не радует только то что оно отказывается работать под python3

Трейсбек прикладываю:

 File "/home/django/venv/example/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/django/example/media/views.py", line 32, in item_create
    media_item.save()
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 796, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 824, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 908, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/base.py", line 947, in _do_insert
    using=using, raw=raw)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/query.py", line 1045, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1053, in execute_sql
    for sql, params in self.as_sql():
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1006, in as_sql
    for obj in self.query.objs
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1006, in <listcomp>
    for obj in self.query.objs
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1005, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 955, in pre_save_val
    return field.pre_save(obj, add=True)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/fields/files.py", line 292, in pre_save
    file.save(file.name, file, save=False)
  File "/home/django/venv/example/lib/python3.5/site-packages/django/db/models/fields/files.py", line 92, in save
    setattr(self.instance, self.field.name, self.name)
  File "/home/django/example/videokit/fields.py", line 198, in __set__
    self.field.update_dimension_fields(instance, force = True)
  File "/home/django/example/videokit/models.py", line 119, in update_dimension_fields
    width = file.width
  File "/home/django/example/videokit/fields.py", line 133, in _get_width
    return self._get_video_dimensions()[0]
  File "/home/django/example/videokit/fields.py", line 164, in _get_video_dimensions
    self._dimensions_cache = get_video_dimensions(self)
  File "/home/django/example/videokit/fields.py", line 25, in get_video_dimensions
    width = stdout.strip(' \t\n\r')
TypeError: a bytes-like object is required, not 'str'
[09/Dec/2018 18:34:05] "POST /item_create/ HTTP/1.1" 500 151897

И функцию в которой ошибка:

from django.conf import settings
from django.core.files import File
from django.db.models.fields.files import FieldFile
from django.db.models.fields.files import FileDescriptor

from datetime import datetime
import hashlib
import os.path
import subprocess

from videokit.apps import VideokitConfig
from videokit.tasks import generate_video

def get_video_dimensions(file):
    path = os.path.join(settings.MEDIA_ROOT, file.name)

    if os.path.isfile(path):
        try:
            process = subprocess.Popen(
                ['mediainfo', '--Inform=Video;%Width%', path],
                stdout = subprocess.PIPE, stderr = subprocess.PIPE)

            stdout, stderr = process.communicate()
            if process.wait() == 0:
                width = int(stdout.strip(' \t\n\r'))
            else:
                return (0,0)

            process = subprocess.Popen(
                ['mediainfo', '--Inform=Video;%Height%', path],
                stdout = subprocess.PIPE, stderr = subprocess.PIPE)

            stdout, stderr = process.communicate()
            if process.wait() == 0:
                height = int(stdout.strip(' \t\n\r'))
            else:
                return (None, None)

            return (width, height)
        except OSError:
            pass

    return (None, None)

Очень надеюсь на вашу помощь. Заранее благодарен.

7 декабря 2018 г. 11:29
Игорь Максимов

Доброго времени суток.

Задался я реализацией похожих новостей, ГУРУ django подскажите по каким критериям проще будет фильтровать модель новости?

У меня на ум только пришло прикрутить к новостям теги, и фильтровать по ним. Поделитесь мыслями или реализацией.






30 ноября 2018 г. 11:42
Игорь Максимов

Доброго времени суток форум. Год назад начал ваять проект под свои нужды и так вышло что забил на него немного. Вот решил продолжить и остановился на лайках.

Имею такие модели:

class LikeDislikeManager(models.Manager):
	use_for_related_fields = True
 
	def likes(self):
		return self.get_queryset().filter(vote__gt=0)
 
	def dislikes(self):
		return self.get_queryset().filter(vote__lt=0)
 
	def sum_rating(self):
		return self.get_queryset().aggregate(Sum('vote')).get('vote__sum') or 0

	def movies(self):
		return self.get_queryset().filter(content_type__model='movie').order_by('-movies__pub_date')

class LikeDislike(models.Model):
	class Meta():
		db_table = 'LikeDislike'

	LIKE = 1
	DISLIKE = -1
 
	VOTES = (
		(DISLIKE, 'Не нравится'),
		(LIKE, 'Нравится')
	)

	vote = models.SmallIntegerField('Голос', choices=VOTES)
	user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Пользователь")
	content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
	object_id = models.PositiveIntegerField()
	content_object = GenericForeignKey()
	objects = LikeDislikeManager()

Урлы:

    path('movie/<pk>/like/',
         login_required(views.VotesView.as_view(model=Movie, vote_type=LikeDislike.LIKE)),
        name='movie_like'),
    path('movie/<pk>/dislike/',
        login_required(views.VotesView.as_view(model=Movie, vote_type=LikeDislike.DISLIKE)),
        name='movie_dislike'),

Вьюха:

class VotesView(View):
    model = None    # Модель данных - Статьи или Комментарии
    vote_type = None # Тип комментария Like/Dislike

    def movie(self, request, pk):
        obj = self.model.objects.get(pk=pk)
        # GenericForeignKey не поддерживает метод get_or_create
        try:
            likedislike = LikeDislike.objects.get(content_type=ContentType.objects.get_for_model(obj), object_id=obj.id, user=request.email)
            if likedislike.vote is not self.vote_type:
                likedislike.vote = self.vote_type
                likedislike.save(update_fields=['vote'])
                result = True
            else:
                likedislike.delete()
                result = False
        except LikeDislike.DoesNotExist:
            obj.votes.create(user=request.email, vote=self.vote_type)
            result = True

        return HttpResponse(
            json.dumps({
                "result": result,
                "like_count": obj.votes.likes().count(),
                "dislike_count": obj.votes.dislikes().count(),
                "sum_rating": obj.votes.sum_rating()
            }),
            content_type="application/json"
        )

Шаблон:

<ul>
    <li data-id="{{ like_obj.id }}" data-type="movie" data-action="like" title="Нравится">
        <span style="cursor: pointer" class="fa fa-thumbs-up"></span>
        <span data-count="like">{{ like_obj.votes.likes.count }}</span>
    </li>
    <li data-id="{{ like_obj.id }}" data-type="movie" data-action="dislike" title="Не нравится">
        <span style="cursor: pointer" class="fa fa-thumbs-down"></span>
        <span data-count="dislike">{{ like_obj.votes.dislikes.count }}</span>
    </li>
</ul>

Ну и javascript:

// Получение переменной cookie по имени
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

// Настройка AJAX
$(function () {
    $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
});


function like()
{
    var like = $(this);
    var type = like.data('type');
    var pk = like.data('id');
    var action = like.data('action');
    var dislike = like.next();

    $.ajax({
        url : "/" + type +"/" + pk + "/" + action + "/",
        type : 'POST',
        data : { 'obj' : pk },

        success : function (json) {
            like.find("[data-count='like']").text(json.like_count);
            dislike.find("[data-count='dislike']").text(json.dislike_count);
        }
    });

    return false;
}

function dislike()
{
    var dislike = $(this);
    var type = dislike.data('type');
    var pk = dislike.data('id');
    var action = dislike.data('action');
    var like = dislike.prev();

    $.ajax({
        url : "/" + type +"/" + pk + "/" + action + "/",
        type : 'POST',
        data : { 'obj' : pk },

        success : function (json) {
            dislike.find("[data-count='dislike']").text(json.dislike_count);
            like.find("[data-count='like']").text(json.like_count);
        }
    });

    return false;
}

// Подключение обработчиков
$(function() {
    $('[data-action="like"]').click(like);
    $('[data-action="dislike"]').click(dislike);
});

При нажатии на лайк-дизлайк в консоле браузера получаю:

Прошу помощи в настройке сабжа.


25 октября 2018 г. 6:47

Django

django, сообщение, Python, чат

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

Раньше имелась очень большая недоработка, которая заключалась в том, что не показывался счётчик диалогов с непрочитанными сообщениями, что приводило к тому, что пользователей, которому присылали сообщение, просто не обращал на него внимания, поскольку не знал об этом сообщений.

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

13 июля 2018 г. 7:17

Django

django, Social

По рекомендации пользователей сайта начал добавлять авторизацию через социальные сети на сайт. Первой такой социальной сетью стала ВКонтакте, как наиболее популярная социальная сеть у пользователей моего сайта.

Django сам по себе имеет необходимый функционал по работе с протоколом OAuth 2.0, который мог используется в API ВКонтакте для авторизации пользователей на сторонних ресурсах (и не только для авторизации). Но в данном случае я не стал писать свой велосипед, используя голую поддержку OAuth в Django, а нашёл очень хорошую батарейку, которая пожалуй достаточно известна среди разработчиков сайтов на Django, которая позволила внедрить авторизацию через ВКонтакте всего за пару часов.

Эта батарейка называется Python Social Auth Django .

Давайте пошагово разберёмся, что нам нужно сделать, чтобы подключить авторизацию через ВКонтакте на сайт с Django

21 января 2017 г. 13:44
Андрей Зимин

Подключил ckeditor. На локальной машине все ок, все работает. Делаю пулл на сервер. И о чудо, редактора - нет. Сайт работает нормально. Все подключено, обновлено. Но нет редактора. Поиски по инету привли к умозаключению, что это что-то в настройках сервера недает отработать скриптам. Помогите!!!!

12 декабря 2018 г. 18:49
Yaroslav Chernetskyi

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
12 декабря 2018 г. 6:19
nikbobrecov

Qt - Тест 001. Сигналы и слоты

  • Результат:57баллов,
  • Очки рейтинга-2
11 декабря 2018 г. 18:59
Feniks3000

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
Последние комментарии
11 декабря 2018 г. 21:01
Евгений Легоцкой

Не знаю, какой-там конкретно эффект и если честно не хочется fl studio ради того, чтобы посмотреть устанавливать, но из того, что увидел в интернете. Предполагаю, что то, что вы хотите с...
11 декабря 2018 г. 19:25
Vlad15007

Подскажите пожалуйста ( я новичок совсем)Можно ли организовать спрайт без этого окошка (как в fl studio fruity dance)?
11 декабря 2018 г. 15:06
Евгений Легоцкой

Что интересно, если написать так from <application_name>.<module_name> import <filename> ,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, ко...
11 декабря 2018 г. 14:52
Илья Чичак

Тут мне тоже есть что сказать=) Сами разрабы советуют импортировать следующим образом: from <application_name> import <module_name> Стоит избегать from . import &l...;
11 декабря 2018 г. 14:28
Евгений Легоцкой

Твоя правда. Согласен. Свои миграции храню в репозитории. На продакшене только выполняю обновление структуры базы данных, после тестирования на дев сервере конечно (читай локальная машина разр...
Сейчас обсуждают на форуме
12 декабря 2018 г. 17:52
Михаиллл

Оказывается оно все переводит в нижний регистр и нужно так писать: SearchTableModel->setTable("\"Test2\"");
12 декабря 2018 г. 16:32
Булат Гиниятов

Допустим в MyObject *myobject = new MyObject; есть метод start(){while(aaa){////////////////}} Как мне обратиться к методу stop(){aaa=false;} ? Соответственно по...
12 декабря 2018 г. 16:28
xintrea

Как выяснилось в этом обсуждении: Отправка Email из Android в Qt для отправки Email в Android необходимо делать Java-метод, который и будет отправлять email. И этот Java-мет...
12 декабря 2018 г. 15:35
lynx

если кому будет вдруг нужно, подумал я над предложением Евгения Но думаю, что проще какой-то функционал дополнить для TableView из Qt Quick Controls 2. вообще берем стандарт...
12 декабря 2018 г. 13:49
Евгений Легоцкой

но у меня нет времени учиться ВЕЧНО давайте без истерик, вы это говорите человеку, который всю жизнь учился, учится и будет учиться, и в программировании всегда так, или учишься и...
Присоединяйтесь к нам в социальных сетях

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