• Nginx redirect from http to https?

    @metajiji
    Согласно официальной документации рекомендуют использовать такую конструкцию:
    server {
            listen 80;
            server_name example.com;
            return 301 https://$server_name$request_uri;  # enforce https
    #        rewrite ^(.*) https://www.example.com$uri permanent;
    }
    Ответ написан
    6 комментариев
  • Как правильно пробросить порт с Docker контейнера с Django приложением к Nginx установленном на локальном хосте?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Нормальный подход: прописать проброс конкретно на петлевой интерфейс: ports:[127.3.2.1:8000:8000]
    Исходя из толстых намёков, вы хотите, чтобы доступ к порту имел только nginx, для этого его надо авторизовывать — через firewall с определением приложения или прокси с авторизацией внутри контейнерной сети.
    expose в информации о контейнере указывает, что такие-то порты используются, никаких действий не делается.
    Ответ написан
    1 комментарий
  • Чем отличаются директивы root и alias в nginx "на пальцах"?

    @inkvizitor68sl
    Linux-сисадмин с 8 летним стажем.
    Не совсем.
    Делают они одно и то же только для location /.

    Если у вас, например, location /img, то при
    root /var/www ссылка /img/1,jpg будет вести в файл /var/www/img/1.jpg

    а при alias /var/www та же ссылка будет вести в /var/www/1.jpg.
    Ответ написан
    2 комментария
  • Зачем нужны сеттеры в Python?

    @AstraVlad
    Финансист, консультант, программист-любитель
    Смысл не в том, чтобы прогер не мог выстрелить себе в ногу -- если захочет, то выстрелит, а в том, чтобы в нормальных условиях можно было проверить в ту ли ногу он стреляет, заменить при необходимости картечь на пулю на лету или вообще тихо аннулировать выстрел. А это бывает нужно, особенно если учесть, что поля объекта совсем не обязаны быть переменными-примитивами, спокойно лежащими в куче. Или могут ВНЕЗАПНО перестать ими быть по мере развития продукта.

    У меня иногда тоже бывает что когда пишу "правильно", разделяя уровни абстракции и всячески инкапсулируя, приходит в голову мысль: "А нафига? Можно же сделать проще." А потом через неделю-месяц-год приходится что-то переделывать и выясняется, что благодаря тому, что все сделано "по науке", можно поменять источник данных, скажем, с таблицы Эксель на локальном диске на Мускул, хостящийся за пол-мира от меня, за полчаса без малейшего напряга и изменения логики остальной части программы. И понимаешь, что ты, оказывается, не полный идиот :).
    Ответ написан
    Комментировать
  • Нужно ли проверять данные сессии при ajax запросе?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Попробуйте вспомнить, где хранятся данные сессии и после этого возвращайтесь к своему вопросу.
    Ответ написан
    2 комментария
  • Как сделать такую штуку?

    RAX7
    @RAX7
    Ответ написан
    Комментировать
  • Уместно ли гарантировать атомарность транзакции в моём случае?

    @pyHammer
    @register.simple_tag
    def get_brand():
        '''
        set brand name instead of 'Главная' in the navbar
        '''
        user_profile, _ = UserProfile.objects.get_or_create(user_id=1)
        return user_profile.brand
    Ответ написан
    Комментировать
  • Я посмотрел видеоуроки по django, но везде делали сайты просто с текстом на пустой странице, а как сделать на странице интерфейс и дизайн?

    @soltanoffsu
    Знаниями одного лишь HTML и CSS тут не обойтись. У джанги есть свой шаблонизатор (либо Jinja), который позволяет делать вкрапления в HTML, доставая какую-то логику из ваших файлов views.py. К слову, бизнес логику приложения приянто разделять от контроллеров, но для маленького проекта можно и во views.py писать.
    Вопрос очень обширный, могу лишь посоветовать канал на YouTube (Олег Молчанов). Автор очень доступно для новичков, показывает все на примерах.
    Ответ написан
    Комментировать
  • Как сегодня писать сайты?

    php666
    @php666
    PHP-макака
    Чем более идиотский вопрос, тем активнее местные гуру пишут многокилометровые текста, вставляют картинки с архитектурой и рассказывают о индустрии сайтостроительства.

    А вопрос вопрошает вчерашний школьник.

    У программистов критического мышления просто нет.
    Ответ написан
    8 комментариев
  • Почему Django views 'не видит' файлы в директории проекта?

    Tomio
    @Tomio
    backend developer (python, php)
    Попробуйте заменить относительный путь к папке
    p_s = './static/csv_s/as_is/'
    path_start = os.path.dirname(p_s)
    p_f = './static/csv_s/to_be/'
    path_finish = os.path.dirname(p_f)

    на абсолютный
    cur_dir = os.path.dirname(os.path.abspath(__file__))
    path_start = '{}/static/csv_s/as_is/'.format(cur_dir)
    path_finish = '{}/static/csv_s/to_be/'.format(cur_dir)
    Ответ написан
    2 комментария
  • Как выровнять кнопки по нижнему краю?

    nuffyweb
    @nuffyweb
    Блоку .card-body добавьте свойства:
    "display: flex;
    flex-direction: column;"
    А у блока с кнопками вместо "mb-auto": "mt-auto"

    вот так
    Ответ написан
    1 комментарий
  • Как запомнить классы, функции и методы в программировании и сэкономить время?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Не нужно заучивать, нужно запоминать что есть подобная функция где-то в этом пакете. При том, что производительность рядового программиста 5-8 строк в час, всегда есть время найти нужный функционал по ассоциации через поиск.
    Ответ написан
    Комментировать
  • Вы в браузере набрали адрес сайта, нажали Enter. Расскажите максимально подробно о технических процессах происходящих далее?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Действительно, уважаемый. Это слишком. Вряд ли я затрону все тонкости, но попробую наметить примерный путь:

    0) Пользователь вбивает в адресную строку браузера адрес сайта (нажимая клавиши на клавиатуре, которые замыкают определённую дорожку в матрице, по которой происходит определение нажатой клавиши, что через шину USB в какой-то момент передастся OS, где это поймает HID-драйвер и вызовет определённое прерывание, что OS передаст как событие/или_ещё_как в программу, которая вызовет соотвествующую функцию из API менеджера окон, которая изменит содержимое строки и в результате когда-то будет перерисован UI-элемент, а если нажат был Enter, то начнётся следующее).
    1) Браузер вытащит из input'а строку с запросом и посмотрит, похоже ли это на адрес. Если да, то добавит недостающие уточнения (например, http или file протокол, порт и подобные довольно стандартные вещи). Если нет - то скорее всего создаст запрос в поисковую систему, установленную по умолчанию (я более не буду опускаться до таких бессмысленных деталей, как вызовы API-функций, иначе я буду набирать это сообщение ОЧЕНЬ долго). В любом случае на выходе мы по сути получим URL, который надо загрузить. Протокол file:// мы рассматривать не будем, ftp далеко не везде есть, https:// на не хватит вечности, так что остановимся на http, который по сути есть tcp/ip по умолчанию на 80 порту с определённым форматом общения.
    2) Окей, url есть. Теперь нам нужен адрес, к которому обращаться. Так как http это tcp/ip - нам нужен ip адрес. Здесь нам помогают dns-сервера. Обычно, нормальный провайдер устанавливает у себя кэш-сервера dns, которые не обращаются по стопицот раз за vk.com к ответственному серверу com-зоны. Давайте не будем отвлекаться на то, как происходит там общение, если что - вот (вики тем хороша, что часто содержит внизу релевантные ссылки). Скажу лишь то, что на выходе мы получаем ip адрес(а).
    3) Имея адрес мы можем запросить страницу. Собственно, всё что после первого слэша - это как-бы параметры для http-сервера: какую именно страницу запрашивать, он всё же не телепат. Конечно, можно было бы немного схитрить и отправить читать про tcp/ip, но ведь существует и shared-hosting. Ограничемся лишь его упоминанием. Собственно, по полученному адресу отправляется GET запрос, который и обрабатывает сервер, находящийся по полученному IP-адресу.
    4) Сервер же, получив адрес, начинает распарсивать строку, медленно вытягивая нужные данные из баз-данных и настроек, выполняются сотни скриптов, иногда делается ещё не одна сотня различных запросов на другие сервера (здесь и разного вида метрики и разного вида HADOOP и т.д.). Пройдя сквозь скрипты и темплейторы в самом конце мы получаем html-страницу, готовую к употреблению. Её-то сервер и отправит в ответе (после заголовков, конечно).
    5) Вот и началось самое интересное. Получив html страницу браузер начинает жутко надругаться над CPU, HDD и GPU, попутно сжирая тонны RAM и мусоря в swap. Виной всему нереальные для полного соблюдения стандарты от небезызвестной w3c.org. Для облегчения многие делают костыли, вроде webkit, а некоторые и вовсе забивают на него и пилят свой стандарт с преферансом и картёжницами (впрочем, в последнее время становиться лучше). Здесь снова начинаются сотни вызовов API ОС, windows manager'а и прочих библиотек, вроде boost, qt или libpng. В ходе работы в RAM строится макет, по которому потом строится нечто вроде PDF (тоже сильно векторный), что, потом, обрабатываясь быстрыми шейдерами на GPU, выдаётся на экран. Опять же, многое пропущено, но вряд ли кому-либо, кроме парня в свитере с оленями, действительно интересно, как работает GDI, DirectX или OpenGL.
    6) Ах да, мы же забыли про тысячи js-скриптов, миллионы картинок и анимации с котиками, а также о таких дополнительных плюшках, как flash-player или java-weblets. В кратце, что js, то и flash и java - это виртуалка, со специальной архитектурой. Они, виртуалки, конечно разные (хотя flash и js довольно похожи, ещё бы - ECMAScript один и тот же). JS - самый интегрированный внутрь браузера, он же и самый медленный чисто визуально (ибо последние два имеют доступ к быстрому GPU), хотя самый быстрый в попугаях. Второй постепенно вымирает и представляет из себя, так же как и третий специальную shared-библиотеку, о которой браузер как-нибудь узнал и которой скармливает специальное содержимое помечанное специальным тегом html. Третий уже почти умер и встречается лишь изредка или в каком-нибудь энтерпрайзед со страшным legacy-базой. Ну здесь из сылок разве только гугл. Ибо сколько всего - даже не сообразишь. Да и вообще, эта тема ещё скучнее GDI, DirectX и OpenGL и к свитеру с оленями требуются ещё очки с толстенными стёклами, дающие стопицот к терпению и задроству над матаном. Если в кратце, то в случае JS, всё что было загружено в память и не думает выгружаться и формирует этакое дерево - DOM, над которым с помощью специального API и происходят модификации. При этом, перед тем как исполниться, весь JS-код компилируется, в нативный для VM байт-код. То же самое в общем-то и со вторым и третьим, разве только они не имеют доступа к DOM и организовать его - дело тех ещё костылей. Ах да, забыл ещё про Silverlight (или как оно там пишется), который сдох, не успев родиться. Так же как и Java, жив в серьёзном энтерпрайзе, не поскупившийся не "дешёвую" поддержку MS.
    7) Ну... А дальше пользователь нажимает на нужную гиперссылку и всё по новой.

    За кадром остались такие костыли, как ajax, websockets и прочая асинхронная ересь. С ней всё в миллионы раз сложнее. И к очкам со свитером потребуется ещё и... а чёрт их знает, что они там ещё носят. Ну да ладно, я искренне завидую тем парням (и девушкам), которые разбираются во всей этой машине. Целиком. Ибо это лишь верхушка айсберга. Разбавленная не лучшей памятью и ужасным гуглом.

    P.S. Не бейте сильно за грамматические и синтаксические ошибки. Спеллчекер приказал долго жить, да и 5 утра как никак.

    UPDATE
    На хабр выложили неплохой перевод дающий некоторое представление, как браузер ругается над памятью и процессором. Хотя и весьма поверхностное,
    Ответ написан
    26 комментариев
  • Где можно найти человека который проверит код?

    @deliro
    Значит, смотри. Просто так код никто проверять не будет, особенно тщательно. Но так как программисты — в основном закомплексованные люди с диким ЧСВ, им нужно вбрасывать так, чтобы они были несогласны, т.к. показать свою уникальность и важность — для них необходимость.

    * Создаёшь вопрос с посылом "я тут накидал код, он охуенен". В подпись ставишь "Senior bla-bla-bla developer", накидываешь в "О себе" кучу фейковых сертификатов, которые подтверждают то, какой ты умница и обязательно вставляешь, что у тебя есть вышка и что она просто необходима для того, чтобы быть настоящим хорошим программистом

    * Ждёшь несколько часов

    * Ловишь миллионы горячих пятых точек, с пеной у рта доказывающих свою правоту

    * Выделяешь объективные недочёты

    * PROFIT!
    Ответ написан
    Комментировать
  • Почему coverage.py показывает 80% протестированного кода модели в Django проекте без единого теста?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    У Вас показаны покрытыми те строки, которые выполняются при импорте модуля. Объявление класса и класс-атрибутов. Вот отсюда и 80%.
    Ответ написан
    3 комментария
  • Как избавиться от дублирования кода?

    @antonksa
    from django.views.generic import View, ListView, DetailView
    
    
    class AddUserPhoneToContextMixin(View):
        def get_context_data(self, **kwargs):
            '''
            Add phone number to context data
            '''
            ctx = super().get_context_data(**kwargs)
            try:
                user = User.objects.get(pk=1)
                ctx['phone_number'] = user.userprofile.phone_number
            finally:
                return ctx
    
    
    class ItemListView(AddUserPhoneToContextMixin, ListView):
        model = Item
        paginate_by = 9
    
    
    class ItemDetailView(AddUserPhoneToContextMixin, DetailView):
        model = Item


    Только не очень понятно почему только pk=1, что будет если его нет, и почему в try-except вы обернули попытку доступа к userprofile. Еще считается, что except без указания конкретных классов обрабатываемых исключений это bad practice. В таком случае вы теряете контроль над пониманием, какое конкретно исключение произошло - то ли коннект в базе оборвался, то ли юзер не существует, то ли поля такого нет у его профиля.

    Хорошая практика - это указывать конкретно что бы обрабатываете:
    try:
        phone_number = user.userprofile.phonenumber
    except UserProfile.DoesNotExists:
        raise NotFound('Warning! User profile did not created!')
    Ответ написан
    3 комментария
  • Какой язык программирования изучать в свободное время?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Какой-то конкретной цели, объясняющей для чего мне это надо, пока что нет.

    - Скажите пожалуйста, куда мне отсюда идти?
    - А куда ты хочешь попасть? - ответил Кот.
    - Мне все равно... - сказала Алиса.
    - Тогда все равно куда и идти, - заметил Кот.
    - ...только бы попасть куда-нибудь, - пояснила Алиса.
    - Куда-нибудь ты обязательно попадешь, - сказал Кот. - Нужно только достаточно долго идти.

    Льюис Кэрролл
    Ответ написан
    1 комментарий
  • Что такое REST и RESTful api?

    @private_tm
    JAVA dev
    Одно и тоже. По факту обычный текстовый проток запросов ответов

    запрос
    https://toster.ru/?question="Как тебя зовут?"

    ответ в формате json
    name: "Вася"

    ПС: рановато ребенку 5-ти лет такое знать))
    ПС ПС не так прочитал))
    Ответ написан
    1 комментарий
  • Как передавать в сигналы значение модели User?

    @JonGalt
    Я у себя в проекте использую вот такую схему создания профайла при создании юзера:
    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        ...
    
    
        @receiver(post_save, sender=User)
        def create_user_profile(sender, instance, created, **kwargs):
            if created:
                Profile.objects.create(user=instance)
    
        @receiver(post_save, sender=User)
        def save_user_profile(sender, instance, **kwargs):
            instance.profile.save()
    
        def __str__(self):
            return self.user


    class Meta:
    verbose_name_plural = u'User profiles'
    Ответ написан
    Комментировать