• Правильный редирект на https | Конфиг или htaccess?

    shambler81
    @shambler81 Куратор тега htaccess
    Убираем

    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]


    добавляем
    RewriteCond %{HTTP_HOST} !^www\.(.*) [NC] 
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    Ответ написан
    Комментировать
  • Как сделать auto increment на файлах?

    @mShpakov
    А что мешает через был хранить ссылки на Файлы?
    Файл сохраняете в виде уникального хэша
    И залечите его в бд где у вас уже есть автоинкремент в поле id
    Ответ написан
    5 комментариев
  • Как сделать auto increment на файлах?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно генерить GUID или UUID – вероятность совпадения крайне низка, игнорировать. Например, реализация ramsey/uuid

    Можно использовать общедоступный для всех процессов PHP кусок памяти - зависит от конфига сервера. Это может быть APC. То же, что и файл, но работает быстрее, т.к. в памяти. apc_store(), apc_fetch() и apc_inc() – увеличить сохранённое число.
    Ответ написан
    Комментировать
  • Как сделать выборку в Redis?

    tumbler
    @tumbler
    бекенд-разработчик на python
    Ваш способ абсолютно правильный при абсолютно неподходящем способе хранения :)
    Я бы сделал HASH "notices:by_id" в котором ключами были бы id объектов, а значениями - то, что Вы хотите вытаскивать.
    Ответ написан
    Комментировать
  • Как ускорить установку данных из файла?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Хранить в бинарном файле в виде
    <sizeof(unique_id) байт unique_id><2 байта длинна строки><json строка><600 минус длинна строки - забить нулями>

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

    PavelK
    @PavelK
    Доброй ночи :)
    А может быть будет проще "строки" хранить сразу в бинарном виде? Ведь, похоже, они не для чтения гуманоидами... Можно будетпочти та к же легко упаковывать и распаковывать: php.net/manual/ru/function.unpack.php
    Sqlite не советую, ибо будет ещк дольше.
    Ответ написан
    3 комментария
  • Работает ли telegram oauth в России?

    neatsoft
    @neatsoft
    Life is too short for bad software
    Telegram login widget в России не работает, но авторизация через Telegram элементарно реализуется с помощью бота. При отправке команды бот вызывает веб-хук, передавая имя пользователя, в ответ отправляется одноразовая ссылка для входа на сайт. Бота нужно запускать на зарубежном хостинге, т.к. с него должен быть доступен api.telegram.org, пользователь может находиться где угодно.

    Вот пример на Django 2.0 (максимально упрощённый):
    1. Через @BotFather нужно создать нового бота, записать полученный token - <bot_token>
    2. Добавить команду /login с помощью /setcommands
    3. В консоли сгенерировать случайный uuid (uuidgen -r) - <webhook_token>
    4. Настроить веб-хук (вместо httpie можно использовать curl, wget, или любую другую подобную утилиту):
      http "https://api.telegram.org/bot<bot_token>/setWebhook?url=https://<domain_name>/bot/<webhook_token>/"

    5. Внести необходимые изменения в проект
    6. Если используется DatabaseCache, инициализировать таблицу в базе данных:
      ./manage.py createcachetable

    .

    settings.py
    ...
    TELEGRAM_BOT_ACCESS_TOKEN = <bot_token>
    TELEGRAM_BOT_WEBHOOK_TOKEN = <webhook_token>
    TELEGRAM_BOT_OTP_TIMEOUT = 120
    
    USE_X_FORWARDED_HOST = True
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'django_cache',
        }
    }
    ...


    urls.py
    ...
    from .views import BotView, LoginView
    
    
    urlpatterns = [
        ...
        path('bot/<uuid:token>/', BotView.as_view()),
        path('login/<uuid:otp>/', LoginView.as_view(), name='login'),
    ]


    views.py
    import json
    import requests
    import uuid
    
    from django.conf import settings
    from django.contrib.auth import login
    from django.contrib.auth.models import User
    from django.core.cache import cache
    from django.http import HttpResponse, HttpResponseNotFound, HttpResponseRedirect
    from django.urls import reverse
    from django.utils.decorators import method_decorator
    from django.views import View
    from django.views.decorators.csrf import csrf_exempt
    from django.views.generic import TemplateView
    
    ...
    
    @method_decorator(csrf_exempt, name='dispatch')
    class BotView(View):
        def post(self, request, token):
            if str(token) != settings.TELEGRAM_BOT_WEBHOOK_TOKEN:
                return HttpResponseNotFound()
    
            params = json.loads(request.body)
            message = params['message']
    
            if message.get('text') == '/login':
                user = message['from']
                chat_id = user['id']
                data = {
                    'username': user['username'],
                    'first_name': user.get('first_name', ''),
                    'last_name': user.get('last_name', ''),
                }
    
                otp = uuid.uuid4()
                cache.set(otp, data, settings.TELEGRAM_BOT_OTP_TIMEOUT)
                path = reverse('login', args=[otp])
                login_url = request.build_absolute_uri(path)
    
                url = 'https://api.telegram.org/bot{}/sendMessage?chat_id={}&text={}'.format(
                    settings.TELEGRAM_BOT_ACCESS_TOKEN,
                    chat_id,
                    login_url,
                )
    
                requests.get(url, timeout=10)
    
            return HttpResponse('')
    
    
    class LoginView(TemplateView):
        template_name = 'login.html'
    
        def dispatch(self, request, otp):
            self.data = cache.get(otp, {})
            return super().dispatch(request, otp)
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['data'] = self.data
            return context
    
        def post(self, request, otp):
            cache.delete(otp)
    
            username = self.data.get('username')
            if not username:
                return HttpResponseRedirect(request.path)
    
            user, created = User.objects.update_or_create(
                username=username,
                defaults={
                    'first_name': self.data.get('first_name', ''),
                    'last_name': self.data.get('last_name', ''),
                },
            )
            login(request, user)
    
            path = reverse('home')
            return HttpResponseRedirect(path)


    templates/login.html
    {% extends 'bootstrap4/bootstrap4.html' %}
    
    {% block bootstrap4_content %}
    
    <div class="container">
    
      <div style="padding:5rem; text-align:center;">
        {% if not data %}
          <h1>This url invalid or expired.</h1>
        {% else %}
          <h1>Login as {{ data.username }}</h1>
          <form action="" method="post">
            {% csrf_token %}
            <button type="submit" class="btn btn-primary btn-lg btn-block">
              Login
            </button>
          </form>
        {% endif %}
      </div>
    
    </div>
    
    {% endblock %}
    Ответ написан
    Комментировать
  • Сколько в реале (примерно) Redis потребляет памяти?

    yellow79
    @yellow79
    Senior Software Engineer
    Не знаю как сейчас, но года три назад, когда я проводил тесты, это заняло бы примерно гигабайт. Возможно сейчас что-то поменялось, но не думаю что координально
    Ответ написан
    1 комментарий
  • Сойдет ли такое распределение файлов по его id?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Норм, правда для генерации id я бы взял обычный uuid v4. Посмотрите также в сторону решений, типа mogilefs, возможно ваш велосипед вам и не нужен
    Ответ написан
    Комментировать
  • Сойдет ли такое распределение файлов по его id?

    @RidgeA
    Я бы этап
    Конвертируем id из десятичного в шестнадцатеричный

    заменил на MD5 хэш от id или какого-то другого значения.

    Это бы решило
    Идентификатор должен быть больше или равен 4096

    и
    Для имени файла используем его id и если нужно обезопасить от перебора для скачивания, то добавляем к нему произвольную строку (к примеру hash-сумму, алгоритма crc32 будет достаточно) и по просто по id файл не достать


    А так, как по мне, вроде нормальною
    Ответ написан
    Комментировать
  • Как настроить отображение сайта в экспресс-панели браузера?

    profesor08
    @profesor08 Куратор тега CSS
    <meta content='Хабрахабр' name='apple-mobile-web-app-title'>
    
    <link rel="apple-touch-icon-precomposed" sizes="57x57" href="/images/favicons/apple-touch-icon-57x57.png" />
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/images/favicons/apple-touch-icon-114x114.png" />
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/images/favicons/apple-touch-icon-72x72.png" />
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/images/favicons/apple-touch-icon-144x144.png" />
    <link rel="apple-touch-icon-precomposed" sizes="120x120" href="/images/favicons/apple-touch-icon-120x120.png" />
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="/images/favicons/apple-touch-icon-152x152.png" />
    <link rel="icon" type="image/png" href="/images/favicons/favicon-32x32.png" sizes="32x32" />
    <link rel="icon" type="image/png" href="/images/favicons/favicon-16x16.png" sizes="16x16" />
    <meta name="application-name" content="Хабрахабр"/>
    <meta name="msapplication-TileColor" content="#FFFFFF" />
    <meta name="msapplication-TileImage" content="mstile-144x144.png" />
    Ответ написан
    2 комментария
  • Как сделать цепочку методов с передачей аргументов с первого объекта?

    Stalker_RED
    @Stalker_RED
    Не знаю что вы там находили, но это и есть чейнинг (chaining).
    function F(name) {
    	this.hi = function() {
        alert('Привет ' + name);
      }
      return this;
    }
    
    F('Вася').hi();
    https://jsfiddle.net/b3n05kau/
    Ответ написан
    1 комментарий
  • Как убрать знак вопроса из form-ссылки?

    Lumore
    @Lumore
    Front-end developer
    <form action="/page" method="post">
        <button type="submit">Кнопка-ссылка</button>
    </form>
    Ответ написан
    Комментировать
  • Как убрать знак вопроса из form-ссылки?

    gds1
    @gds1
    Пыха - это наше всё)))
    знак вопроса - начало передачи параметров через GET. укажите как показано выше method="post", и никакого "?" не будет.
    Ответ написан
    3 комментария