• Как вставить favicon.ico в django-проект?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    urls.py
    urlpatterns = [
        ...
        url(r'^favicon\.ico$', RedirectView.as_view(url='/static/img/favicon.ico', permanent=True)),
        ...
    ]
    Ответ написан
    4 комментария
  • Как хранить номера банковских карт на сервере?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Извольте следовать PCI DSS. Чемодан денег на сертификацию готов?
    Ответ написан
    5 комментариев
  • Как лучше сохранять данные банковских карт?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Я буду первым на Тостере, кто вам напишет - Этого делать нельзя. Почитайте про PCI DSS.
    Ответ написан
    Комментировать
  • Django ORM: выборка из нескольких таблиц в словарь?

    Код на python всегда(почти) медленнее выборки по базе.
    То есть выгоднее написать rawSQL. Но на вас ложится ответственность за защиту от SQL-инъекций.
    Если средствами SQL не обойтись, и существует необходимость обработать массив информации в python(редко, скорее всего вы делаете что-то не так), то пользуйтесь готовой библиотекой itertools, т.к. ваши циклы могут быть не оптимальны. Также изучите поведение queryset'ов, iterator(). Вообще, если опишите задачу подробнее, не придется гадать.
    Ответ написан
    4 комментария
  • Как подключить react к django модульно?

    @MAGistr_MTM
    Учусь программировать
    1. Делаеш АРІ вьюху для поиска на джанго
    2. В шаблон вставляеш збилдженый реакт код
    3. Рендериш шаблон джангой
    Ответ написан
    Комментировать
  • Какой порядок разработки сервиса Python+Django+Vue+bootstrap?

    Konstantin18ko
    @Konstantin18ko
    Стоматолог
    Использую такую же связку, только ещё NodeJS - поднял WebSocketServer.
    И когда приходит запрос на NodeJS, VueJS через axios (можно vue-resource) делает запрос через DRF.

    В чем плюс моего сопособа: запрос в БД идёт только тогда, когда пришло сообщение, а не каждые 10 секунд.

    P.S. Представьте каждые 10 секунд 15'000 пользователей делают 15'000 запросов. Сомнительное удовольствие.
    Ответ написан
    6 комментариев
  • Какой порядок разработки сервиса Python+Django+Vue+bootstrap?

    kgb_zor
    @kgb_zor
    I need your traceback.
    На счет IDE - хватит, да хоть блокнот.

    Порядок.

    1. Создайте django приложение.
    2. Создайте vue приложение.
    3. Накидайте html.
    4. Cоздайте модель сообщения.
    5. Напишите API на DRF.
    6. Потом при помощи vue делайте запросы на сервер и тяните сообщения.

    Рекомендуется для каждого проекта создавать отдельное окружение.
    На счет бд , юзайте sqlite, не парьтесь.

    Хостинг - на ваш вкус Heroku , Pythonanywhere и т д.

    Туториал 1.
    Туториал 2.
    Ответ написан
    Комментировать
  • Как вставить код Яндекс.Метрики в реакт компонент?

    @Razzwan
    import { YMInitializer } from 'react-yandex-metrika';
    
    class MyComponent extends React.Component {
      render() {
        return (
          <div>
            // SNIP
              <YMInitializer accounts={[987654321]} />
            // SNIP
          </div>
        );
      }
    });
    
    // И потом используем так:
    import ym from 'react-yandex-metrika';
    ym('hit', '/cart');
    ym('reachGoal', 'whateverGoal', {awesomeParameter: 42});


    Взято здесь: https://github.com/narkq/react-yandex-metrika
    Ответ написан
    1 комментарий
  • Как в python работать с Api Яндекса?

    deepblack
    @deepblack Куратор тега Python
    Вот либа с помощью которой это можно сделать, но на самом деле лучше обойтись без неё.
    пример того как это можно использовать:
    spoiler
    import typing
    
    import requests
    
    from yandex_geocoder.exceptions import (
        YandexGeocoderAddressNotFound,
        YandexGeocoderHttpException,
    )
    
    
    class Client:
        """Yandex geocoder API client.
    
        :Example:
            >>> from yandex_geocoder import Client
            >>> Client.coordinates('Хабаровск 60 октября 150')
            ('135.114326', '48.47839')
    
        """
    
        API_URL = "https://geocode-maps.yandex.ru/1.x/"
        PARAMS = {"format": "json"}
    
        @classmethod
        def request(cls, address: str) -> dict:
            """Requests passed address and returns content of `response` key.
    
            Raises `YandexGeocoderHttpException` if response's status code is
            different from `200`.
    
            """
            response = requests.get(
                cls.API_URL, params=dict(geocode=address, **cls.PARAMS)
            )
    
            if response.status_code != 200:
                raise YandexGeocoderHttpException(
                    "Non-200 response from yandex geocoder"
                )
    
            return response.json()["response"]
    
        @classmethod
        def coordinates(cls, address: str) -> typing.Tuple[str, str]:
            """Returns a tuple of ccordinates (longtitude, latitude) for
            passed address.
    
            Raises `YandexGeocoderAddressNotFound` if nothing found.
    
            """
            data = cls.request(address)["GeoObjectCollection"]["featureMember"]
    
            if not data:
                raise YandexGeocoderAddressNotFound(
                    '"{}" not found'.format(address)
                )
    
            coordinates = data[0]["GeoObject"]["Point"]["pos"]  # type: str
            return tuple(coordinates.split(" "))


    По большому счету это весь её код.
    Ответ написан
    Комментировать
  • Как правильно использовать интерцепторы в axios?

    owl1n
    @owl1n
    fullstack developer
    Покажу немного практик, как интерцепторы упрощают жизнь мне, да и многим, в целом.
    Здесь и далее покажу именно использование интерцепторов при работе с авторизацией по JWT (токены).

    1) Подстановка хедера авторизации

    const createSetAuthInterceptor = options => config => {
      if (options.access) {
        config.headers.Authorization = options.access;
      } else {
        delete config.headers.Authorization;
      }
      return config;
    };
    
    const setAuthCb = createSetAuthInterceptor(store.state.auth);
    axios.interceptors.request.use(setAuthCb);


    Здесь мы проверям наличие доступа из стора, а точнее, наличие токена. Далее, подставляем, либо удаляем заголовок.

    2) Следующая практика, это обновление токена (то, о чем вы спросили в комментарии, при окончании сессии и т.д.)

    let refreshTokenPromise;
    
    const createUpdateAuthInterceptor = (store, http) => async error => {
      const message = get(error, 'response.data.message');
      if (!['Token expired', 'Invalid token'].includes(message)) {
        return Promise.reject(error);
      }
    
      if (!refreshTokenPromise) {
        refreshTokenPromise = store.dispatch('refreshToken');
      }
    
      await refreshTokenPromise;
      refreshTokenPromise = null;
    
      return http(error.config);
    };
    
    const updateAuthCb = createUpdateAuthInterceptor(store, axios);
    axios.interceptors.response.use(null, updateAuthCb);


    Здесь мы можем видеть, что при каждом ответе проверяем наличие ошибок и если ошибка соответствует ошибке с токеном, то отправляем обновлять токен и далее снова отправляем тот же самый запрос, который к нам вернулся с ошибкой. Тут грамотно будет проверять не само сообщение об ошибке, а код ответа (401 и т.д.), но тут используется такое решение уже из за специфики бэка.

    В этом же решение, вместо обновления токена, можно отправлять юзера авторизовываться самому, на страницу авторизации. Для этого, конечно же, стоит передавать не экземпляр store, а экземляр роутера, чтобы редиректить юзера. Надеюсь, помог и хоть как то наглядно показал способы применения :)
    Ответ написан
    1 комментарий
  • Как выжить джуну единственным разработчиком на проекте?

    shindakioku
    @shindakioku
    Не сайтоклепатор
    Не читал, но девочку не кидайте :)
    Ответ написан
    Комментировать
  • Как выжить джуну единственным разработчиком на проекте?

    Andrey_Pletenev
    @Andrey_Pletenev
    Pletenev.com
    Для джуна развитие важнее денег. Т.к. развитие определяет в т.ч. скорость роста денег. Если засидишься в этом аквариуме с такими же мальками на сытом корме, хорошо плавать не научишься. После выпуска в океан будет очень трудно догонять своих быстро выросших сверстников.
    Поэтому мои советы:
    • Выныривай сейчас.
    • Если ТД тебя слышит, то сначала поговори с ним о ситуации и о необходимости сменить менеджмент в компании, т.к. его по сути нет.
    • Разговор этот начинай на следующий день после получения з.п.
    • В любом случае, никого не кидай, дела передай, как следует. Цени свою репутацию.
    • Срок передачи дел определяй сам. На испытательном, да к тому же без официального трудоустройства у тебя нет обязательства отрабатывать 2 недели.
    Ответ написан
    Комментировать
  • Чанки: разбить и собрать, как это работает?

    2ord
    @2ord
    Речь, судя по всему, о дедупликации данных.
    Каждый файл можно разбить на N равных отрезков данных и 1 остаточной длины. Если пронумеровать эти отрезки последовательно, сохранив в БД номера их последовательностей с их полученных хэшами и файлами-отрезками, именованными хэшами, то для восстановления содержимого файла будет достаточно найти в БД все принадлежащие заданному файлу куски данных, считывая их соответствующие данные из файлов-отрезков. Не важно на каких узлах хранилищ хранятся эти файлы-отрезки, а важно то что есть лишь 1 сервер, склеивающий в 1 целый файл.

    Дедупликация подходит в случаях частого повторения кусков контента. Допустим, много повторений может найтись среди архивов документов (дубликаты целых файлов или некоторых частей). Порой, дедупликация может дать хороший выигрыш когда одни и те же видео файлы находятся в разных уголках архива. Хотя шансов найти дубликаты кусков среди разных видео файлов очень малы.
    Ответ написан
    2 комментария
  • Почему не любят Ember.JS?

    titov_andrei
    @titov_andrei
    All my life I learn - and die a fool!
    Изучал указанный фреймворк около года. По нему разбирался с MVC, шаблонизацию, модульность, реактивность, работу с CLI - короче всё, что появилось в остальных на 2 года позже.

    На данный момент - как и обещали разработчики - новые релизы выходят 2 раза в месяц - а что ещё нужно живому фреймворку.

    Ссылаться на отсутствие русскоязычной документации вообще как то смешно. Все примеры кода есть - зачем русский язык.

    Иностранные видео вообще под музон стримят, да ещё и на скорости 1,5-2х. Смотришь и на паузу жмёшь когда нужно.

    А так всё в заказы упирается, но новый проект никто не мешает начать делать на нём.

    Проблема поддержки старых кодов и стартапов проявляется и в сопоставлении реакта и вью - код на реакте мало кто будет переписывать - только поддерживать.
    Ответ написан
    Комментировать
  • Почему не любят Ember.JS?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    По Эмебру на русском актуальной инфы практически нет, далеко не все владеют инглишем в должной степени. Туториалы корявые у них, и да, очень активная разработка, много стремительных изменений.

    Тем не менее для себя я выбрал именно Эмбер и потихоньку вгрызаюсь. Уж больно близка мне его философия. Да и в целом времена такие, что без вариантов...

    И да, порог вхождения достаточно высок, необходимо впитать массу контекстов. Однако я убежден, оно того стоит.

    ЗЫ: Ангуляр мне не прижился - слишком много анархии.
    ЗЫ2: В 2016 я таки выбрал React.JS...
    Ответ написан
    Комментировать
  • Как сделать так, чтобы по нажатию на кнопку в form отрабатывала JS-функция, а сама форма игнорировала отправку?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    action="javascript:void(0);" onsubmit="call()" это дичь редкая, есть же листенеры событий, я не ас в чистом js, но на jq нужно что то такое
    $(function(){ // по загрузке всего документа выполнить
      $('#request').on('submit', function(e){ // вешаем листенер на форму, по срабатыванию запускаем код
         e.preventDefault(); // останавливаем отправку формы
         some code // делаем что-то
      })
    })


    UPD: Ниже подтянулись мэтры и выдали более чистые решения на ванилла жс.
    Ответ написан
    Комментировать
  • Вопрос про SSH ключ в Bitbucket?

    Lobotomist
    @Lobotomist
    Software Developer
    sim3x и Сергей в принципе правильно написали. Напишу более подробно.

    Для того, чтобы работать с репозиторием с авторизацией по ключу у вас должен быть приватный ключ, а на сервере, где вы авторизуетесь (в данном случае bitbucket) - публичная "пара" этого ключа.

    Вам нужно:
    1. В puttygen сгенерировать SSH-2 RSA (выбран по умолчанию). Сохранить его куда угодно, в том числе можно в папку `$HOME/.ssh/`. ($HOME - домашняя папка пользователя). Это приватный ключ, в формате putty.
    2. Нажать Conversions -> Export OpenSSH key и сохранить его в папке `$HOME/.ssh/` с именем `id_rsa`. Это важно сохранить его именно туда и с этим именем, так как это стандартное расположение и имя, которое ожидается многими программами. Его можно изменить, но для этого требуются дополнительные телодвижения.
    Это будет ваш приватный ключ в формате OpenSSH.

    В некоторых gui вам нужно будет выбирать ключ в первом формате, а в консоли используется ключ во втором формате.

    3. Нажимаете save Public key. Сохраняйте куда угодно. У меня все лежат в одной папке. Этот файл вы регистрируете в bitbucket.

    Все. Через git bash у вас должен быть доступ к вашему репозиторию. Обращаю внимание, что ваши приватные ключи никому не передавайте. А публичный можно раздавать сколько угодно.
    Ответ написан
    1 комментарий
  • Какой смысл от React если SSR (кроме SEO)?

    bingo347
    @bingo347
    Crazy on performance...
    SSR не для SEO. Современные поисковики вполне себе умеют запускать JS на страницах, подгружать данные по AJAX, анализировать переходы с historyAPI и все такое прочее.
    SSR нужен в первую очередь для ускорения первичного запуска. Суть в том, что пользователь получает уже сформированную страницу по своему запросу, ему не нужно ждать пока данные подгрузятся и отобразятся на странице, он может сразу потреблять контент. А вот после загрузки сайт работает уже как SPA.
    То есть при SSR не грузится каждая страница с сервера, грузится только первая, но именно та, что запросил пользователь. Последующие страницы уже отрисовываются на клиенте, а сервер отдает лишь данные.
    Ответ написан
    Комментировать
  • Django и React.js как соединить?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Вам больше не нужно использовать django, чтобы рендерить html-ки. Этим будет заниматься react. Вам нужен API сервер, и я так понимаю, подойдет что-нибудь такое (ну или гугл).

    Если можете написать API, то значит нет смысла искать видео-уроки/просто уроки по комбинации Ddjango + React, и вам нужно лишь подтянуть знания по react/redux/react-router или подобной связке.

    Если даже в теории ваша задача не разбивается на 2 части (написание API и написание одностраничного приложения), значит django и react.js в данный момент вам никак не соединить.

    p.s. если есть уже существующий сайт, где используется шаблонизатор от django и рендерятся страницы, то можно взять любую из них, где много динамики (например, удаление и добавление строк в таблице, какие-то xhr запросы и т.д.) и переписать для начала только ее на react.
    Ответ написан
    Комментировать
  • Полноценный пример SSR для react/redux?

    Да состояние собирается на сервере для каждого клиента (request'a), скажем на уровне мидлвара мы собираем состояние (текущего авторизованного пользователя, какие-то другие глобальные данные), далее отрабатывает обработчик маршрута, мы получили данные какой-то страницы из бд и передали их как контекст, примерно так:
    import React from 'react';
    import { StaticRouter } from 'react-router'
    import { Provider } from 'react-redux'
    import ReactDOMServer from 'react-dom/server';
    
    import App from './client/components/App.jsx'
    
    ReactDOMServer.renderToString(
    	<Provider store={ReduxStore}>
    		<StaticRouter
    			location={Url}
    			context={Context}>
    			<App/>
    		</StaticRouter>
    	</Provider>
    );

    Где, ReduxStore сгенерированное нами глобальное состояние (redux) запроса, Url запрошенный урл, Context контекст (будет передано как this.props.staticContext в компонент). Реакт вытянет нужный контейнер роута (по вашим маршрутам в App) и передаст ему контекст, компонент рендерится исходя из полученных данных. Результатом работы метода renderToString будет html строка (размеченная реактом), которую мы шаблонизатором или как угодно впиливаем в блок моунта компонента (в верстке), дополнительно в шаблонизатор передаем сгенерированное состояние, в документации выглядит вот так:
    window.__PRELOADED_STATE__ = JSON.stringify(preloadedState || {}).replace(/</g, '\\u003c')

    Теперь что происходит после того как страница загрузилась и подхватились клиент-скрипты? Все просто мы подхватываем состояние из window.__PRELOADED_STATE__ и вообщем-то все, глобальное состояние передано, компонент уже отрендерен, стоит учитывать что результаты при клиент-рендере и при сервер-рендере должны быть всегда одинаковыми, так же не использовать методы доступные браузеру, но не доступные серверу (на уровне моунта и первого рендера) и хорошенько следить за своим кодом в плане памяти, иначе при какой-либо утечке, память на сервере не будет вычищаться после каждого рендера.
    ---
    Как-то так, надеюсь помог, хотя там еще довольно много заковык
    Ответ написан
    20 комментариев