Posted by & filed under python.

Создание приложение в определенном каталоге

python manage.py startapp my_app apps/my_app

где my_app наше приложение, apps/my_app директория, в которой разместиться приложение. Директория должно быть создана, пуста, в противном случае могут быть конфликты (например с __init__.py файлом)

Добавляем стандартно его в INSTALLED_APPS как
INSTALLED_APPS = [
...
'apps.my_app',
...

]

На этом все.
Почти.
Если вас смущает как подсвечивает pycharm переменную «name» в apps.py, то вы можете указать так
name = 'apps.my_app'
label = 'my_app'

name нужен как адрес где находится app, а label используется в основном в ForeignKey.

Только не забудьте потом указать конфиг в INSTALLED_APPS
INSTALLED_APPS = [
...
'apps.my_app.apps.MyAppConfig',
...

]
по умолчанию данный конфиг не подключается.
Либо указать в __init__.py этого приложения так

default_app_config = 'apps.my_app.apps.MyAppConfig'
что равнозначно предыдущему варианту.

Posted by & filed under python.

шаг 1. Ставим certbot


sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

Шаг 2.


sudo certbot certonly --manual --preferred-challenges=dns --email myemail@gmail.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d *.mydomain.by -d mydomain.by

Получаем что-то такого вида


_acme-challenge.mydomain.by with the following value:
_ip7wsdfsdfsdfdsfsdfsdfsfdcB7GPM

Шаг 3.
Добавляем _acme-challenge запись в качестве txt записи в нашем домене (Открываете соответствующий раздел с вашими доменами у вашего регистратора)

(В моем случае шаг 2 и 3 попросила сделать дважды. Т.е. я добавил 2 txt записи)

Шаг 4. Проверяем что все добавилось корректно. Например здесь:
https://mxtoolbox.com/TXTLookup.aspx
Вставляете запись вида _acme-challenge.mydomain.by и должны увидеть соответствующий результат.

Шаг 5. Проверяем результат.


sudo certbot certificates

P.s. если вдруг вас заблокировало за большое количество повторений, то попробуйте поиграться на стейджинге. Замените адрес сервера на
https://acme-staging-v02.api.letsencrypt.org/directory

Posted by & filed under python.

Проблема:
После обновления windows не могу загрузиться в linux — черный экран.
Решение:
Проблема заключалось в том, что я перед загрузкой в windows ушел в гибернацию в linux, и windows удалила указатель на спящий режим, поэтому linux не мог загузиться
Решение простое c liveCD или recovery mode поправить диски командой

sudo ntfsfix /dev/sdXY

Posted by & filed under python.

from espresa.helpers import JSONResponse

__author__ = 'dmitry'

from django.db import models
from django.test import TestCase
from rest_framework import serializers


class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)


class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks')
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)


class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title')


class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')


class OneTest(TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_ok(self):
        album = Album.objects.create(album_name='test name', artist='test artist')
        Track.objects.create(album=album, order=10, title='test title', duration=60)

        serializer = AlbumSerializer(Album.objects.all(), many=True)
        a = JSONResponse(serializer.data, status=200)
        a = 1

Posted by & filed under python.

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

export PYTHONDONTWRITEBYTECODE=yes

или добавить эту строчку в .bashrc

Обычно pyc фалы только засоряют девелоперскую тачку, поэтому при обычной разработке не нужны

Posted by & filed under python.

Создание из .py исходников пакета

python setup.py dist

Кастомизация сборщика пакета:
использование параметров коммандной строки

python setup.py dist --user=myusername --password=mypassword --with-flag

Изменнения в setup.py

# -*- coding: utf-8 -*-
import os
from setuptools import setup, find_packages
from setuptools.command.sdist import sdist

class CustomSdistCommand(sdist):
    """Customized setuptools sdist command"""

    user_options = sdist.user_options + [
        ('user=', None, 'Svn user'),
        ('password=', None, 'Svn user password'),
        ('with-flag', None, 'With flag'),        
    ]
    
    user = None
    password = None
    with_flag = False    

    def run(self):
        if self.with_flag:
            some_function()
        sdist.run(self)

setup(    
    install_requires=[
        'Django',
        'South',
    ],
    cmdclass={
        'sdist': CustomSdistCommand,
    },
    
)

На что обратить внимание:
1)

        ('user=', None, 'Svn user'),
        ('with-flag', None, 'With flag'), 

«=» указывает может ли принимать значение из командной строки или нет (как в параметре with-flag)

2) Нужно создавать переменные в нашем классе CustomSdistCommand с именем одинаковым как и аргументы в user_options

2.1) Если аргументы содержат «-» (дефис), то переменные должны вместо него содержать знак подчеркивание «_». Пример, смотри на переменную with_flag

Posted by & filed under Linux.

Задача:
Иногда возникает такая задача, нужно определить какие aliases есть в системе, и что делает отдельный из них

Решение:
Просмотр списка aliases:

compgen -a

Просмотр содержимого отдельного alias:

type -a myalias

Пример:

compgen -a
Result are:
alert
egrep
fgrep
grep
l
la
ll
ls
mysql_root

type -a mysql_root
mysql_root is aliased to `mysql -uroot -proot'